如何防止CRLF注入(Http响应分裂)在php



我做了R&D在php中预防CRLF注入,但我没有找到任何解决方案,因为我使用打嗝套件工具来注入一些头使用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包含对响应/头分裂的缓解,但这些不能支持我解决上述问题

编辑

当我请求到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

你可以看到注入头 hackd_header:By_Hacker/..在上述响应

是否有在php或apache服务器配置,以防止这种头' hack?

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

我可以看到你已经标记了CakePHP -这意味着你的应用程序正在使用蛋糕框架…太好了!如果您使用的是Cake 3,它会自动剥离:%0d%0a

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

可以应用这些东西的地方-第三方API响应或说....Webhook响应!或者是一种糟糕的处理intl的方式……例如:lang=en to 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');
}

相关内容

  • 没有找到相关文章

最新更新