一、PHP反序列化漏洞

PHP反序列化漏洞是指当应用程序对用户可控的序列化字符串进行反序列化时,由于未对数据进行充分校验,导致攻击者可以构造恶意序列化数据,触发PHP魔术方法的自动调用,最终实现任意代码执行或文件操作。

常见魔术方法

  • __construct() - 创建对象时触发

  • __destruct() - 销毁对象时触发

  • __wakeup() - 反序列化时触发

  • __toString() - 对象被当作字符串时触发

  • __call() - 调用不可访问方法时触发

POP链构造

POP(Property Oriented Programming)链是利用现有类中的魔术方法,通过控制对象的属性值,构建一条从触发点到执行点的调用链。常见的POP链目标函数包括:eval()、system()、file_put_contents()等。

二、PHP伪协议利用

PHP伪协议是PHP内置的流封装协议,常用于文件包含漏洞(LFI/RFI)中读取或写入文件。

常见伪协议

php://filter/read=convert.base64-encode/resource=index.php
php://filter/read=string.toupper/resource=xxx.php
php://filter/convert.base64-encode/resource=xxx.php
php://filter/read=string.toupper|string.rot13/resource=xxx.php
php://filter/write=string.rot13/resource=example.txt
php://input
data://text/plain;base64,...
phar://test.phar

file_put_contents配合伪协议写shell

$content = $_GET['content'];
file_put_contents($filename, $content);
// 可通过 php://filter/write=convert.base64-decode/resource=shell.php 写入WebShell

三、PHP代码审计

高危函数

代码审计中需要重点关注以下高危函数:eval()、assert()、system()、exec()、shell_exec()、popen()、passthru()、file_get_contents()(参数可控)、include/require(参数可控)、unserialize()等。

变量覆盖

PHP的变量覆盖漏洞常由extract()、parse_str()、import_request_variables()等函数导致。攻击者可以通过传入特定的参数值覆盖已有变量,从而绕过认证或修改程序逻辑。

参考资料

  • PHP手册 - 序列化与反序列化

  • OWASP - PHP Security

  • CTF Wiki - PHP审计