【问题标题】:How to prevent CRLF injection (Http response splitting) in php如何在php中防止CRLF注入(Http响应拆分)
【发布时间】:2015-09-27 20:49:38
【问题描述】:

我对防止 php 中的 CRLF 注入进行了研发,但我在 mycase 中没有找到任何解决方案,因为我正在使用 burp 套件工具来注入一些使用 CRLF 字符的标头,如下所示。

// Using my tool i put CRLF characters at the start of my request url 
GET /%0d%0a%20HackedHeader:By_Hacker controller/action

//This generates an header for me like below
HackedHeader:By_Hacker

所以我可以像上面那样修改所有标题

这个工具就像一个代理服务器,它捕获请求并给出响应,我们可以按照我们想要的方式修改响应。

所以我只是通过使用 CRLF 字符注入一些标头来修改响应。现在服务器通过在响应中注入 CRLF 字符来响应这个请求。

我只是担心 Pragma、Cache-Control、Last-Modified 等标头字段会导致缓存中毒攻击。

header 和 setcookie 包含针对响应/header 拆分的缓解措施,但这些无法支持我解决上述问题

编辑

当我向 mysite.com 请求时,请与我们联系页面,如下所示这是我在我的工具中捕获的请求,如下所示

Request headers:
GET /contactus HTTP/1.1
Host: mysite.com
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

我得到了上述请求的响应 HTML

现在对于使用该工具的相同请求,我正在添加自定义标头,如下所示

Request Headers:
GET /%0d%0a%20Hacked_header:By_Hacker/contactus HTTP/1.1
Host: mysite.com
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

Response Headers:
HTTP/1.1 302 Found
Date: Fri, 10 Jul 2015 11:51:22 GMT
Server: Apache/2.2.22 (Ubuntu)
Last-Modified: Fri, 10 Jul 2015 11:51:22 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Location: mysite.com
 Hacked_header:By_Hacker/..
Vary: Accept-Encoding
Content-Length: 2
Keep-Alive: timeout=5, max=120
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

在上面的响应中可以看到注入的头部Hacked_header:By_Hacker/..

php 或 apache 服务器配置中是否有防止此类标头被黑客入侵的方法?

【问题讨论】:

  • 在使用之前验证用户输入怎么样!?除非您针对某些特定的代码相关问题提出这个问题,否则我怀疑您会得到更好的答案。
  • 实际上我正在通过使用工具将 CRLF 字符注入一些恶意标头来修改请求 url,我如何防止这种情况,因为我担心安全@ndm
  • 我的回答保持不变。如果您在特定上下文中验证/清理输入时遇到问题,请在您的问题中添加适当的代码。
  • 没有什么可以添加任何与代码相关的东西,只是使用诸如 Burpsuite 之类的代理工具将 CRLF 字符添加到请求的 url 中,这会导致 headers 被利用,我只是想防止这是因为黑客使用此类工具注入恶意标头@ndm 这是link
  • 你在重复自己,而且,无意冒犯,我也厌倦了这样做,所以这将是我对这个问题的最后评论。通过在使用之前验证/清理用户输入,可以避免 HTTP 响应拆分,这就是这个问题的全部内容。这需要如何以及在何处应用取决于您拒绝详细说明的上下文。如果您在特定情况下需要任何帮助,请详细解释,并显示相关代码。

标签: php security cakephp newline httpresponse


【解决方案1】:

不知道为什么所有的反对票 - 事实上,这是一个有趣的问题:)

我可以看到您已标记 CakePHP - 这意味着您的应用程序正在使用 Cake Framework... 太棒了!如果您使用的是 Cake 3,它会自动剥离:%0d%0a

或者,在您收到响应标头的地方,只需去掉 %0d%0a 就可以了!

这些东西可以应用在哪里 - 一个 3rd 方 API 响应或者说....一个 Webhook 响应!或者是处理国际问题的严重消毒方式。示例:lang=en 到 lang=fr,其中 GET 参数直接设置为响应标头...这不是明智之举!

理想情况下,响应将是GET,而不是在标题中,但无论哪种方式,只要去掉%0d%0a,就可以了。

回答您的编辑。

You can see the injected header Hacked_header:By_Hacker/.. in the above response

无法控制或停止注入的标头,伙计。我们无法控制其他服务器的操作。

问题是......你如何处理响应头?

答案是...... 你清理它,正如ndm 所说你需要清理输入......你得到什么作为响应是输入。一旦检测到%0d%0a,就丢弃响应。

需要代码工作吗?

<?php
$cr = '/\%0d/';
$lf = '/\%0a/';

$response = // whatever your response is generated in;
$cr_check = preg_match($cr , $response);
$lf_check = preg_match($lf , $response);

if (($cr_check > 0) || ($lf_check > 0)){
    throw new \Exception('CRLF detected');
}

【讨论】:

  • 问题是.. 你如何处理响应头?仅供参考,我只是担心像 Pragma、Cache-Control、Last-Modified 等注入的标头字段会导致缓存中毒攻击。 @业力
  • 这种意义上的缓存是基于浏览器的——它来自您的服务器到客户端的服务器。如果外部第三方以 something bad 进行响应,则您的服务器正在获得响应。所以,别担心 :)
  • 谢谢先生,这对我帮助很大
猜你喜欢
  • 1970-01-01
  • 2015-09-16
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多