如何在PHP中防止CRLF注入(Http响应拆分)

阿尼尔·库玛(Anil Kumar)

我在防止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等标头字段会导致缓存中毒攻击。

标头和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

您可以在上面的响应中看到注入的标题Hacked_header:By_Hacker / ..

无论如何,在php或apache服务器配置中是否有防止这种标头被黑客入侵的方法?

业力

不知道为什么所有的不赞成票-实际上,这是一个有趣的问题:)

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

另外,在收到响应标头的地方,只要剥离%0d%0a一下就可以了!

可以应用类似这些的内容-第三方API响应或说……Webhook响应!或处理国际语言的方法很差。例如:lang = en到lang = fr,其中GET参数直接设置为响应标头...这不是明智的选择!

理想情况下,响应将是asGET而不是在标头中,但是无论哪种方式都只是剥离%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');
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章