PHP安全-文件名操纵

黄舟
发布: 2017-02-21 09:17:37
原创
1347人浏览过


文件名操纵

  在很多情形下会使用动态包含,此时目录名或文件名中的部分会保存在一个变量中。例如,你可以缓存你的部分动态页来降低你的数据库服务器的负担。

 

 <?php
 
  include "/cache/{$_GET['username']}.html";
 
  ?>
登录后复制


 

  为了让这个漏洞更明显,示例中使用了$_GET。如果你使用了受污染数据时,这个漏洞同样存在。使用$_GET['username']是一个极端的例子,通过它可以把问题看得更清楚。

  虽然上面的流程有其优点,但它同时为攻击者提供了一个可以自由选择缓存页的良机。例如,一个用户可以方便地通过编辑URL中的username的值来察看其他用户的缓存文件。事实上,攻击者可以通过简单的更改username的值为相应的文件名(不加扩展名)来察看/cache目录下的所有扩展名为.html的文件。

 

  http://www.php.cn/

立即学习PHP免费学习笔记(深入)”;

 

  尽管该程序限制了攻击者所操作的目录和文件名,但变更文件名并不是唯一的手段。攻击者可以创造性地达到在文件系统中进行跨越的目的,而去察看其他目录中的.html文件以发现敏感信息。这是因为可以在字串使用父目录的方式进行目录跨越:

 

  http://www.php.cn/

 

 上面URL的运行结果如下:

 

 <?php
 
  include "/cache/../admin/users.html";
 
  ?>
登录后复制


 

  此时,..意味着/cache的父目录,也就是根目录。这样上面的例子就等价于:

 

<?php
 
  include "/admin/users.html";
 
  ?>
登录后复制


 

  由于所有的文件都会在文件系统的根目录下,该流程就允许了一个攻击者能访问你服务器上所有的.html文件。

 

  在某些平台上,攻击者还可以使用一个NULL来终止字符串,例如:

  http://www.php.cn/

  这样就成功地绕开了.html文件扩展名的限制。

  当然,一味地去通过猜测攻击者的所有恶意攻击手段是不可能的,无论你在文件上加上多少控制,也不能排除风险。重要的是在动态包含时永远不要使用被污染数据。攻击手段不是一成不变的,但漏洞不会变化。只要通过过滤数据即可修复这个漏洞(见第一章):

  <?php
 
  $clean = array();
 
  /* $_GET['filename'] is filtered and stored in
$clean['filename']. */
 
  include "/path/to/{$clean['filename']}";
 
  ?>
登录后复制


 

  如果你确认参数中只有文件名部分而没有路径信息时,另一个有效的技巧是通过使用basename( )来进行数据的过滤:

 

<?php
 
  $clean = array();
 
  if (basename($_GET['filename'] ==
$_GET['filename'])
  {
    $clean['filename'] = $_GET['filename'];
  }
 
  include "/path/to/{$clean['filename']}";
 
  ?>
登录后复制


 

  如果你允许有路径信息但想要在检测前把它化简,你可以使用realpath()函数:

 

<?php
 
  $filename =
realpath("/path/to/{$_GET['filename']}");
 
  ?>
登录后复制


 

 

 通过上面程序处理得到的结果($filename)可以被用来确认是否位于/path/to目录下:

 

<?php
 
  $pathinfo = pathinfo($filename);
 
  if ($pathinfo['dirname'] == '/path/to')
  {
    /* $filename is within /path/to */.
  }
 
  ?>
登录后复制

  如果检测不通过,你就应该把这个请求记录到攻击日志以备后查。这个在你把这个流程作为深度防范措施时特别重要,因为你要确定其它的安全手段失效的原因。

以上就是PHP安全-文件名操纵的内容,更多相关内容请关注PHP中文网(www.php.cn)!


PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号