假设有一个可公开访问的网页,其中包含以下 PHP 代码:
<?php
class NotInteresting
{
public function noExploits() {
echo "Whatever.";
}
}
$unsafe = unserialize($_GET['data']);
$unsafe->noExploits();
?>
代码期望dataURL 参数包含 的序列化实例,NotInteresting但当然data可以操纵该参数。当unserialize()用于用户提供的数据时,它通常会导致PHP 对象注入。
但是,到目前为止,我看到的所有 PHP 对象注入示例(1、2、3)都是危险的,原因有两个:
- 有一些带有危险方法的可利用类(这些方法只能在内部调用)被用来执行任意代码,通常是 CMS 的情况。
- PHP 版本过旧或过时,PHP 代码中的漏洞被利用。
鉴于 PHP 版本是最新的 - 也就是说,unserialize()函数中不存在已知漏洞 - 并且没有定义自定义类(只是默认类 -Exception等stdClass),是否可以利用上述代码进行成功的攻击在默认的 PHP 安装上?
额外信息:
据我所知,从调用构造任意类时只有四种可利用的魔术方法:、、和:unserialize()__call()__wakeup()__destruct()__toString()
- __wakeup()在对象未序列化时调用。
- __call()在调用不可访问的方法(或不存在的方法)时被调用。
- __destruct()总是在不再存在对该对象的引用后调用。
- __toString()在对象被视为字符串时被调用。
因此,我编写了一个 PHP 脚本来快速生成包含这些魔术方法的类列表:请参阅此处以获取 pastebin。其中一些看起来非常“有趣”:
- XML 类(可能导致XXE)
Phar课程_
但是,到目前为止,我无法仅凭这些来构建攻击:我需要更有经验的人来权衡。