资源说明:漏洞说明
不得不再次吐槽一下exploit-db对exp审核的质量,这个exp仍然不能触发漏洞,修改第一个参数则可以触发,我给出的poc是一个可以触发php漏洞的,问题出现在php_tidy.dll扩展中,对tidy_parse_file的第二个参数,也就是文件绝对路径没有进行长度控制和内容校验,导致在fopen失败后进入失败处理逻辑引发缓冲区溢出,下面对此漏洞进行详细分析。
软件下载:
https://www.exploit-db.com/apps/f8fb5676b6a32f7be1c8d8d373fbc2af-php-5.0.0-Win32.zip (本地下载)
PoC:
<?
【PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞详解及解决策略】
PHP5.0版本中的TIDY_PARSE_FILE函数存在一个严重的缓冲区溢出漏洞,该漏洞源于PHP的tidy扩展,具体是在处理tidy_parse_file的第二个参数时,即文件绝对路径时,没有进行有效的长度控制和内容验证。当传入一个超出预期长度的文件路径时,可能导致fopen函数失败,进而触发错误处理逻辑,从而引起缓冲区溢出。这为攻击者提供了可能的攻击入口,可以通过精心构造的输入来尝试控制程序执行流,执行任意代码。
**漏洞成因分析**
当调用tidy_parse_file函数时,它接受三个参数:一个URL或文件名,一个字符串缓冲区,以及两个布尔值。问题在于对文件路径参数的处理不当。由于没有对路径长度进行限制,攻击者可以传递一个超长的文件路径,当系统尝试打开此路径时,可能会溢出内部缓冲区。在fopen失败后,PHP的错误处理机制可能尝试将错误信息存储到有限的内存区域,从而导致溢出。
**漏洞复现与分析**
为了复现此漏洞,我们可以使用提供的PoC代码:
```php
```
这里的`str_repeat`函数创建了一个2040个"A"字符的字符串,作为溢出数据。当tidy_parse_file尝试处理这个超长的文件路径时,就会触发问题。
通过调试器,我们可以看到PHP引擎在加载扩展时的一系列操作,例如调用`php_module_startup`来初始化配置,以及之后调用的`zend_llist_apply`等函数。这些步骤虽然不是直接与漏洞相关,但它们是理解PHP运行时环境的重要部分。
**解决方案**
修复此漏洞的关键在于限制tidy_parse_file函数接收的文件路径长度,并对其进行内容验证。一种可能的解决方案是,在tidy扩展的源代码中增加边界检查,确保路径字符串不超过预定义的安全长度。同时,错误处理机制也需要改进,以防止在异常情况下溢出内存。
对于已经部署的PHP5.0环境,应尽快升级到安全版本或应用官方发布的补丁。如果无法立即更新,可以通过禁用tidy扩展或者限制用户输入来缓解风险。
此外,系统层面的加固也是必要的,比如限制Web服务器对文件系统的访问权限,以减少恶意代码可能利用此漏洞执行的潜在危害。
理解和防范缓冲区溢出漏洞对于任何IT专业人员来说都至关重要,因为这类漏洞经常被用于发动严重的攻击。通过深入分析漏洞的原理、复现过程和解决方案,我们可以提高系统的安全性,避免成为恶意攻击的目标。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。