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 相关文章推荐
用libtemplate实现静态网页生成
Oct 09 PHP
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
php中json_encode中文编码问题分析
Sep 13 PHP
php全角字符转换为半角函数
Feb 07 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 PHP
PHP+FastCGI+Nginx配置PHP运行环境
Aug 07 PHP
PHP 验证登陆类分享
Mar 13 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
php实现生成验证码实例分享
Apr 10 PHP
yii2缓存Caching基本用法示例
Jul 18 PHP
PHP错误和异常处理功能模块示例
Nov 12 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 Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
js window.event对象详尽解析
2009/02/17 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
JSONP跨域请求
2017/03/02 Javascript
js实现返回顶部效果
2017/03/10 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python 中文乱码问题深入分析
2011/03/13 Python
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
django-filter和普通查询的例子
2019/08/12 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
在pycharm中实现删除bookmark
2020/02/14 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
酒店大堂副理的职责范文
2014/02/13 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
领导视察通讯稿
2015/07/18 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript