已发现 PHP 的 libxml 流中存在一个严重漏洞,这可能会影响那些依赖 DOM 或 SimpleXML 扩展来处理 HTTP 请求的 Web 应用程序。
这个漏洞被追踪为 CVE-2025-1219,它涉及到在请求重定向资源时对头部信息的错误处理,从而导致诸如文档误解析和绕过验证等安全风险。
该漏洞影响以下 PHP 版本:
1.低于 8.1.32 的版本
2.低于 8.2.28 的版本
3.低于 8.3.18 的版本
4.低于 8.4.5 的版本
漏洞详情
当 HTTP 流包装器进行重定向时,问题就会出现。它在执行后续请求之前没有清除先前捕获的头部信息,而是将来自多个请求的头部信息追加到一个数组中。这就导致该数组包含了所有请求的头部信息,并且最后一个请求的头部信息排在数组的最后。
php_libxml_input_buffer_create_filename () 函数或 php_libxml_sniff_charset_from_stream () 函数会扫描这个数组,查找 content-type 头部信息来确定响应的字符集。
然而,它是按顺序从上到下处理这些头部信息的,并且会在遇到第一个 content-type 头部信息时就停止。根据 PHP 的报告,这个头部信息可能与包含正在被解析的 HTML 主体的最终响应不对应。因此,文档可能会以错误的字符集被解析,从而导致潜在的安全问题。
这个漏洞使得攻击者能够通过利用错误的字符集检测来操纵文档的解析方式。例如:
1.文档可能会被错误解读,从而改变其原本的含义。
2.如果文档被错误解析,验证过程可能会被绕过。
3.使用像 ->saveHtml () 这样的方法导出此类文档可能会产生保留原始字符集的意外输出。
使用 PHP 的 DOM 或 SimpleXML 扩展来处理 HTTP 请求的应用程序尤其容易受到攻击。
概念验证
一个概念验证(PoC)展示了这个漏洞是如何被利用的:
1.一个重定向脚本(redirect.php)发送一个指定字符集(utf-16)的 content-type 头部信息,并重定向到另一个资源。
2.当通过 PHP 的 DOMDocument 或 SimpleXML 扩展访问时,最初的 content-type 头部信息会被错误地用于解析,而不是使用最终响应的头部信息。
这种行为可能会导致错误的解析和绕过验证,正如在一些场景中所展示的那样,导出的 HTML 内容尽管被操纵了,但仍然保留了其原始字符集。
PHP 开发者已经在以下版本中修复了这个问题:
1.PHP 8.1.32
2.PHP 8.2.28
3.PHP 8.3.19
4.PHP 8.4.5
缓解措施
为了防范 CVE-2025-1219 漏洞,强烈建议用户将他们的 PHP 安装更新到上面列出的已修复版本之一:
1.使用 php -v 检查你当前的版本。
2.通过你的软件包管理器更新系统,或者从php.net下载更新后的二进制文件。
3.更新后,重启任何依赖 PHP 的服务。
CVE-2025-1219 突出了 PHP 在使用 libxml 流处理 HTTP 重定向方面的一个严重缺陷,这对那些通过 HTTP 请求解析文档的应用程序构成了风险。这个漏洞强调了定期更新软件以应对新出现的安全威胁的重要性。
文章原文链接:https://www.anquanke.com/post/id/305984