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 url路由入门实例
Apr 23 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 PHP
PHP闭包实例解析
Sep 08 PHP
PHP解析RSS的方法
Mar 05 PHP
php开发微信支付获取用户地址
Oct 04 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
详解php中 === 的使用
Oct 24 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
PHP函数积累总结
Mar 19 PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 24 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
Sep 13 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中$this-&amp;gt;含义分析
2009/11/29 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
PHP性能分析工具XHProf安装使用教程
2015/05/13 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
python设置环境变量的作用和实例
2019/07/09 Python
深入解析神经网络从原理到实现
2019/07/26 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
解决pandas展示数据输出时列名不能对齐的问题
2019/11/18 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
创业计划书撰写原则
2014/01/25 职场文书
供电工程专业求职信
2014/08/09 职场文书
乌镇导游词
2015/02/02 职场文书
python基础之文件处理知识总结
2021/05/23 Python
Spring整合Mybatis的全过程
2021/06/28 Java/Android
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js