一、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.pharfile_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审计
PHP漏洞利用技巧:反序列化、伪协议与代码审计
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法