深入考察PHP恶意软件中基于空白符的隐身术
字数 1550 2025-08-06 08:35:19
PHP恶意软件中基于空白符的隐身技术深度分析
一、技术背景与发现
在2021年发现的PHP恶意软件样本中,攻击者采用了一种基于空白符的隐身技术(Whitespace Steganography)来隐藏恶意代码。这种技术最初出现在JavaScript注入攻击中,随后被移植到PHP恶意软件领域。
二、技术实现原理
1. 基本隐藏机制
攻击者将恶意代码隐藏在看似正常的文件(如license.php)中,具体实现方式:
- 使用多行PHP注释块(
/* ... */)包裹合法内容(如GNU GPLv3许可证文本) - 在注释块中插入看似"空白"的区域,实际上包含制表符(0x09)和空格符(0x20)
- 这些空白字符按照特定编码规则表示二进制数据
2. 编码与解码过程
编码过程:
- 将原始恶意代码转换为二进制形式
- 使用制表符表示"1",空格符表示"0"
- 每8个空白字符表示一个字节(ASCII字符)
解码过程(恶意代码中的实现):
for($i=0;$i<strlen($cache);$i++){
$out.=chr(bindec(str_replace(array(chr(9),chr(32)),array('1','0'),substr($cache,$i,8))));
$i+=7;
}
3. 多层混淆技术
解码后的内容通常还经过多层加密/编码处理:
gzdecode:解压缩数据str_rot13:ROT13替换密码base64_decode:Base64解码
最终得到可执行的PHP恶意代码
三、技术细节分析
1. 文件结构特征
- 文件开头包含大量合法注释内容(如许可证文本)
- 文件末尾包含大量不可见的制表符和空格符
- 文件大小异常膨胀(案例中30KB合法内容+300KB隐藏数据)
2. 触发机制
- 恶意代码查找文件中最后一个分号后的内容
- 将制表符和空格符转换为二进制数据
- 解码后执行或保存为临时文件(常以空格命名的文件)
3. 技术来源
该技术源自:
- 2011年发表的关于空白符编码的研究
- 2019年Habr.ru上发布的PHP空白符混淆算法PoC
攻击者直接复制了相关解码器代码
四、检测与防御方法
1. 检测指标
- 文件大小异常:正常文本文件不应包含大量空白符
- 十六进制分析:检查文件末尾是否存在异常的09/20十六进制序列
- 内容熵分析:高熵的"空白"区域可能包含编码数据
- 完整性监控:关键文件被修改的警报
2. 防御措施
-
文件完整性检查:
- 部署文件完整性监控系统(FIM)
- 定期校验关键文件的哈希值
-
代码审计:
- 检查PHP文件中异常的空白区域
- 搜索可疑的解码函数组合(bindec+chr+str_replace)
-
服务器加固:
- 限制上传文件类型和位置
- 禁用不必要的PHP函数(如base64_decode)
-
应急响应:
- 发现可疑文件时替换为已知干净版本
- 全面扫描服务器而不仅处理已发现样本
五、技术局限性
- 文件膨胀:使文件大小增加10倍以上,容易被发现
- 依赖显性代码:必须保留可见的PHP解码器,增加暴露风险
- 解码模式固定:标准化的解码算法便于特征检测
六、扩展知识
1. 相关技术变种
- 使用换行符(0x0A)作为第三种状态位
- 结合Unicode零宽度字符(如U+200B)的混合编码
- 在HTML/CSS文件中应用类似技术
2. 历史案例
- 2019年:JavaScript空白符混淆攻击
- 2020年:CSS文件中隐藏的挖矿脚本
- 2021年:本PHP恶意软件案例
七、实战分析步骤
-
初步检查:
- 使用
ls -la查看异常大小的PHP文件 tail -c 100 license.php检查文件末尾内容
- 使用
-
十六进制分析:
hexdump -C license.php | less查找大量重复的09/20十六进制序列
-
空白符提取:
// 提取最后一个分号后的内容 $content = file_get_contents('license.php'); $parts = explode(';', $content); $whitespace = end($parts); -
解码实现:
function decode_whitespace($str) { $output = ''; for($i=0; $i<strlen($str); $i+=8) { $chunk = substr($str, $i, 8); $binary = str_replace(["\t"," "], ['1','0'], $chunk); $output .= chr(bindec($binary)); } return $output; } $decoded = decode_whitespace($whitespace); -
多层解码:
$payload = base64_decode(str_rot13(gzdecode($decoded)));
八、总结
基于空白符的隐身技术代表了Web恶意软件中一类特殊的混淆方法,虽然其隐身效果有限,但结合多层编码仍能有效规避基础安全扫描。防御此类攻击需要结合文件完整性监控、异常文件大小检测和深度内容分析等多维手段。