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下图片文字混合水印与缩略图实现代码
Dec 11 PHP
从手册去理解分析PHP session机制
Jul 17 PHP
php分页思路以及在ZF中的使用
May 30 PHP
PHP JS Ip地址及域名格式检测代码
Sep 27 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
Oct 26 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
Jun 11 PHP
PHP 模拟登陆功能实例详解
Sep 10 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
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
php 数组二分法查找函数代码
2010/02/16 PHP
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
windows下ipython的安装与使用详解
2016/10/20 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
python中图像通道分离与合并实例
2020/01/17 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
业务员工作态度散漫检讨书
2014/11/02 职场文书
初中毕业生自我评价
2015/03/02 职场文书
反腐倡廉观后感
2015/06/08 职场文书
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏