深入考察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. 将原始恶意代码转换为二进制形式
  2. 使用制表符表示"1",空格符表示"0"
  3. 每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. 触发机制

  1. 恶意代码查找文件中最后一个分号后的内容
  2. 将制表符和空格符转换为二进制数据
  3. 解码后执行或保存为临时文件(常以空格命名的文件)

3. 技术来源

该技术源自:

  • 2011年发表的关于空白符编码的研究
  • 2019年Habr.ru上发布的PHP空白符混淆算法PoC
    攻击者直接复制了相关解码器代码

四、检测与防御方法

1. 检测指标

  • 文件大小异常:正常文本文件不应包含大量空白符
  • 十六进制分析:检查文件末尾是否存在异常的09/20十六进制序列
  • 内容熵分析:高熵的"空白"区域可能包含编码数据
  • 完整性监控:关键文件被修改的警报

2. 防御措施

  1. 文件完整性检查

    • 部署文件完整性监控系统(FIM)
    • 定期校验关键文件的哈希值
  2. 代码审计

    • 检查PHP文件中异常的空白区域
    • 搜索可疑的解码函数组合(bindec+chr+str_replace)
  3. 服务器加固

    • 限制上传文件类型和位置
    • 禁用不必要的PHP函数(如base64_decode)
  4. 应急响应

    • 发现可疑文件时替换为已知干净版本
    • 全面扫描服务器而不仅处理已发现样本

五、技术局限性

  1. 文件膨胀:使文件大小增加10倍以上,容易被发现
  2. 依赖显性代码:必须保留可见的PHP解码器,增加暴露风险
  3. 解码模式固定:标准化的解码算法便于特征检测

六、扩展知识

1. 相关技术变种

  • 使用换行符(0x0A)作为第三种状态位
  • 结合Unicode零宽度字符(如U+200B)的混合编码
  • 在HTML/CSS文件中应用类似技术

2. 历史案例

  • 2019年:JavaScript空白符混淆攻击
  • 2020年:CSS文件中隐藏的挖矿脚本
  • 2021年:本PHP恶意软件案例

七、实战分析步骤

  1. 初步检查

    • 使用ls -la查看异常大小的PHP文件
    • tail -c 100 license.php检查文件末尾内容
  2. 十六进制分析

    hexdump -C license.php | less
    

    查找大量重复的09/20十六进制序列

  3. 空白符提取

    // 提取最后一个分号后的内容
    $content = file_get_contents('license.php');
    $parts = explode(';', $content);
    $whitespace = end($parts);
    
  4. 解码实现

    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);
    
  5. 多层解码

    $payload = base64_decode(str_rot13(gzdecode($decoded)));
    

八、总结

基于空白符的隐身技术代表了Web恶意软件中一类特殊的混淆方法,虽然其隐身效果有限,但结合多层编码仍能有效规避基础安全扫描。防御此类攻击需要结合文件完整性监控、异常文件大小检测和深度内容分析等多维手段。

PHP恶意软件中基于空白符的隐身技术深度分析 一、技术背景与发现 在2021年发现的PHP恶意软件样本中,攻击者采用了一种基于空白符的隐身技术(Whitespace Steganography)来隐藏恶意代码。这种技术最初出现在JavaScript注入攻击中,随后被移植到PHP恶意软件领域。 二、技术实现原理 1. 基本隐藏机制 攻击者将恶意代码隐藏在看似正常的文件(如license.php)中,具体实现方式: 使用多行PHP注释块( /* ... */ )包裹合法内容(如GNU GPLv3许可证文本) 在注释块中插入看似"空白"的区域,实际上包含制表符(0x09)和空格符(0x20) 这些空白字符按照特定编码规则表示二进制数据 2. 编码与解码过程 编码过程 : 将原始恶意代码转换为二进制形式 使用制表符表示"1",空格符表示"0" 每8个空白字符表示一个字节(ASCII字符) 解码过程 (恶意代码中的实现): 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 检查文件末尾内容 十六进制分析 : 查找大量重复的09/20十六进制序列 空白符提取 : 解码实现 : 多层解码 : 八、总结 基于空白符的隐身技术代表了Web恶意软件中一类特殊的混淆方法,虽然其隐身效果有限,但结合多层编码仍能有效规避基础安全扫描。防御此类攻击需要结合文件完整性监控、异常文件大小检测和深度内容分析等多维手段。