Ani*_*mar 7 php security cakephp newline httpresponse
我在 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
Run Code Online (Sandbox Code Playgroud)
所以我可以像上面一样修改所有标题
这个工具就像一个代理服务器,所以它捕获请求并给出响应,我们可以按照我们想要的方式修改响应。
所以我只是通过使用 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
Run Code Online (Sandbox Code Playgroud)
我得到了上述请求的响应 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
Run Code Online (Sandbox Code Playgroud)
您可以在上面的响应中看到注入的标头Hacked_header:By_Hacker/..
无论如何在 php 或 apache 服务器配置中是否有防止此类标题的黑客攻击?
不知道为什么所有的反对票 - 事实上,这是一个有趣的问题:)
我可以看到您已经标记了 CakePHP - 这意味着您的应用程序正在使用 Cake Framework... 太棒了!如果您使用的是 Cake 3 ,它会自动剥离:%0d%0a
或者,在您收到响应标头的地方,只需剥离即可%0d%0a!
可以应用此类事情的地方 - 第 3 方 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');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8234 次 |
| 最近记录: |