HTTP 响应拆分和 PHP

信息安全 php http 脆弱性 响应分裂
2021-08-29 11:07:27

自 4.4.2 和 5.1.2(例如https://en.wikipedia.org/wiki/HTTP_response_splitting)或大约 9 年以来,已经解决了 PHP 的 HTTP 响应拆分 (HRS) 漏洞的大量引用。

然而 CVE-2013-2652 报告了一个使用 PHP 的 WebCollab 漏洞,尽管概念验证 ( http://archives.neohapsis.com/archives/bugtraq/2013-10/0117.html ) 指定了 PHP 版本5.4.7。问题识别在其问题陈述中使用“%0d%0a”。

我自己尝试过 PHP,它确实避免了允许插入 2 字节十六进制序列 0x0d0x0a,但它不会阻止插入 % 编码的等效 6 字符序列 %0d%0a。

至少从表面上看,这似乎有点矛盾。即 1) PHP 不像建议的那样 HRS 安全,因为它允许将 6 字符序列 "%0d%0a" 插入到标题中或 2) CVE-2013-2652 中所述的漏洞(即 "% 0d%0a" 被允许由 PHP 应用程序编写)至少被大大夸大了。

其中哪一个是真的?(或者完全是别的东西?)

(注意:a)我完全理解,无论是否有其他保护措施,最好验证或清理用户提供的数据。b) WebCollab 修复非常简单,就是这样做的:验证用户输入的允许字符。我对 PHP 的 HRS 安全性的稳健性以及任何危险的性质(如果存在)更感兴趣。)

1个回答

@tim 是对的。该漏洞利用%0D%0A%20URL 解码为CR++的LF序列,SPACE并且由于额外的空间可以绕过某些浏览器中的响应拆分保护。

曾经有一个称为行折叠的功能,它允许 HTTP 标头跨越多行,方法是在每一行前面加上一个空格或制表符。不过,它后来在RFC 7230中被删除。因此,Internet Explorer 碰巧将带有前导空格的标题延续视为多个单独的标题,而 PHP 尚未实现 RFC,从而使 IE 容易受到空格技巧的攻击。这个问题在 2015 年 2 月得到解决(bug #68978)并最终在 PHP 5.4.38中实现,所以当时版本5.4.7仍然受到影响。

5.4.38 的变更日志中:

删除了对多行标头的支持,因为它们已被 RFC 7230 弃用。

您可以在相应的提交中看到,它header()现在完全拒绝任何回车和换行,无论它们的位置如何。总之,通过这种特殊方法进行的响应拆分漏洞今天应该已经过时了。