#CVE-2022-31630 – Proof of Concept Exploit
警告: 此代码仅用于教育和隔离实验室环境中的测试。未经授权在其他系统上使用是非法且不负责任的。
📌 描述
CVE-2022-31630 是 PHP GD 扩展中 imageloadfont() 函数的一个越界读取(Out-of-Bounds Read)漏洞。该漏洞允许能够控制 PHP 应用程序加载的字体文件的攻击者读取所分配缓冲区之外的数据。可能造成的影响包括:
受影响的 PHP 版本
PHP 7.4.33 是首个包含此漏洞补丁的版本。该仓库提供一个概念验证(Proof of Concept, PoC),用于展示易受攻击版本(≤ 7.4.32)与已修补版本(≥ 7.4.33)之间的行为差异。
🔍 技术细节
该漏洞源于读取 GD 字体文件(.gdf 格式)时缺乏输入验证。字体文件具有以下头部结构:
| 字节偏移 | 大小(字节) | 描述 |
|---|---|---|
| 0 | 2 | 魔数(0x01BE) |
| 2 | 2 | 字符数(nchars) |
| 4 | 2 | 字符宽度(像素) |
| 6 | 2 | 字符高度 |
| 8 | 2 | 每个字符的字节数(char_offset) |
若宽度值设置过大(例如 65535),则用于存储字符位图的缓冲区大小计算会出错,导致分配的缓冲区过小。随后 imagechar() 函数从该字体中读取字符时,会访问缓冲区之外的内存——这就是越界读取。
🧪 测试要求
php:7.4.32-cli / php:7.4.33-cli)🚀 如何使用 PoC
git clone https://github.com/sepkascurty-cpu/php-exploit_cve-2022-31630.git
cd exploit_cve-2022-31630
测试易受攻击版本(7.4.32):
docker run -it --rm -v $(pwd):/app php:7.4.32-cli bash
测试已修补版本(7.4.33):
docker run -it --rm -v $(pwd):/app php:7.4.33-cli bash
cd /app
apt-get update
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
docker-php-ext-configure gd --with-freetype --with-jpeg
docker-php-ext-install gd
php exploit_cve-2022-31630.php
📊 示例输出
| PHP 版本 | 预期结果 |
|---|---|
| 7.4.32(易受攻击) | 程序因段错误(Segmentation Fault)崩溃,或发生内存泄漏(可看到内存中的虚拟数据)。 |
| 7.4.33(已修补) | 正常执行完毕,保存输出文件 output.png,无崩溃。 |
🛡️ 缓解措施
imageloadfont() 函数,请将其禁用。📚 参考
⚠️ 免责声明
此仓库仅供教育和安全研究目的提供。作者对代码的任何滥用行为不承担责任。请确保仅在您拥有或已获得书面授权的环境中进行测试。
为印度尼西亚网络安全社区创建。