PHP - Deserialization + Autoload Classes
首先,您应该查看什么是自动加载类。
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:{}
如果您有一个文件上传并且可以上传一个带有**.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负载,但我们需要在同一个请求中执行此操作,以便在使用小工具时加载加载器。为此,我发送了一个包含两个对象的序列化数组,如下所示:
您可以首先看到加载器被加载,然后是负载
负载摘要
加载同一容器中不同web应用的composer自动加载
加载一个phpggc小工具,以滥用另一个web应用的库(最初易受反序列化攻击的web应用没有任何库中的小工具)
该小工具将在/tmp/a.php中创建一个带有恶意命令的PHP负载文件(web应用用户无法在任何web应用的文件夹中写入)
我们负载的最后部分将使用加载生成的php文件来执行命令
我需要调用两次反序列化。在我的测试中,第一次创建了/tmp/a.php
文件,但未加载,第二次则正确加载。
最后更新于