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无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
PHP设计模式 注册表模式(多个类的注册)
Feb 05 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
Apr 08 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
Yii2 加载css、js 载静态资源的方法
Mar 10 PHP
php使用curl实现ftp文件下载功能
May 16 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
实例讲解通过​PHP创建数据库
Jan 20 PHP
Laravel框架文件上传功能实现方法示例
Apr 16 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 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
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
js 通用订单代码
2013/12/23 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
python实现Flappy Bird源码
2018/12/24 Python
python基于Selenium的web自动化框架
2019/07/14 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
教师开学感言
2014/02/14 职场文书
工程安全员岗位职责
2014/03/09 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL