【文件包含】文件包含漏洞知识总结

【文件包含】文件包含漏洞知识总结

Hello,各位小伙伴周五好~

《【文件包含】文件包含漏洞知识总结》

这里是你们的劳模小编~

《【文件包含】文件包含漏洞知识总结》

之前一期,我们已经一起总结了文件上传和文件解析漏洞。

今天我们就一起来看看文件包含漏洞吧~

一、什么是文件包含漏洞?

1、文件包含概述

和SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。

什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。

有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。

以PHP为例,常用的文件包含函数有以下四种:

include(),require(),include_once(),require_once()

区别如下:

  • require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
  • include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
  • include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
  • require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

2、漏洞成因分析

我们先直接来看一个简单的例子,网页代码如下:

《【文件包含】文件包含漏洞知识总结》

再创建一个phpinfo.php页面,代码如下:

《【文件包含】文件包含漏洞知识总结》

利用文件包含,我们通过include函数来执行phpinfo.php页面,成功解析:

《【文件包含】文件包含漏洞知识总结》
将phpinfo.php文件后缀改为txt后进行访问,依然可以解析:

《【文件包含】文件包含漏洞知识总结》
修改为jpg格式,也可以解析:

《【文件包含】文件包含漏洞知识总结》

可以看出,include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。

在上一期文件上传漏洞的总结中,我们上传了一个jpg格式的一句话木马,如果网站有文件包含漏洞,jpg文件就可以被当作php文件进行解析,现在知道是为什么了吧~

我们将phpinfo.jpg的内容改成一段文字:

《【文件包含】文件包含漏洞知识总结》

再次进行访问,可以读出文本内容:

《【文件包含】文件包含漏洞知识总结》

利用这个特性,我们可以读取一些包含敏感信息的文件。

二、本地文件包含漏洞

能够打开并包含本地文件的漏洞,我们称为本地文件包含漏洞(LFI)。

测试网页包含如下代码:

《【文件包含】文件包含漏洞知识总结》

网站利用文件包含功能读取一些php文件,例如phpinfo:

《【文件包含】文件包含漏洞知识总结》

利用该代码,我们可以读取一些系统本地的敏感信息。

例如C:\Windows\system.ini文件。

(1)使用绝对路径

使用绝对路径直接进行读取:

《【文件包含】文件包含漏洞知识总结》

(2)使用相对路径进行读取:

当前页面所在路径为C:\Apache24\htdocs\,我们需要使用…/退到C盘再进行访问,构造路径如下:

…/…/windows/system.ini

成功读取到文件信息:

《【文件包含】文件包含漏洞知识总结》

./表示当前位置路径,…/表示上一级路径位置,在linux中同样适用。

(3)一些常见的敏感信息路径:

Windows系统:

  • c:\boot.ini // 查看系统版本
  • c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
  • c:\windows\repair\sam // 存储Windows系统初次安装的密码
  • c:\ProgramFiles\mysql\my.ini // MySQL配置
  • c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
  • c:\windows\php.ini // php 配置信息

Linux/Unix系统:

  • /etc/passwd // 账户信息
  • /etc/shadow // 账户密码文件
  • /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
  • /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
  • /usr/local/app/php5/lib/php.ini // PHP相关配置
  • /etc/httpd/conf/httpd.conf // Apache配置文件
  • /etc/my.conf // mysql 配置文件

三、LFI漏洞利用技巧

1、字符串截断

首先我们来看一段改进后的代码:

《【文件包含】文件包含漏洞知识总结》

我们去读取根目录下的site目录中的phpinfo.php文件:

《【文件包含】文件包含漏洞知识总结》

此时如果我们想通过文件包含漏洞读取本地敏感信息,就会遇到一些问题。因为服务器会给路径加上./site/路径,以及.php后缀。

此时我们可以使用使用%00截断:

%00为结束符,在filename后带上%00,就可以截断末尾的.php。

当前路径为./site/,如果要读取system.ini,则需要输入:…/…/…/windows/system.ini%00,成功读取如下:

《【文件包含】文件包含漏洞知识总结》

需要注意的是,%00截断需要php版本小于5.3.4,且关闭magic_quotes_gpc功能。

2、配合文件上传使用

有时候我们找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。

以DVWA平台为例,编辑一个图片马,内容如下:

《【文件包含】文件包含漏洞知识总结》

找到上传点进行上传:

《【文件包含】文件包含漏洞知识总结》

文件保存的完整路径为:

C:\phpStudy\WWW\hackable\uploads\webshell.jpg

DVWA平台low等级文件包含漏洞页面如下:

《【文件包含】文件包含漏洞知识总结》

该页面用于读取C:\phpStudy\WWW\vulnerabilities\fi\路径中的文件,代码如下:

《【文件包含】文件包含漏洞知识总结》

现在我们利用该页面去执行我们上传的图片马,路径需要从C:\phpStudy\WWW\vulnerabilities\fi\ 转到C:\phpStudy\WWW\hackable\uploads\webshell.jpg

构造URL如下,页面无报错:

《【文件包含】文件包含漏洞知识总结》

可以看到fi文件夹中生成了一个webshell:

《【文件包含】文件包含漏洞知识总结》

使用webshell管理工具连接即可。

注:我们也可以直接在webshell.jpg中写一句话木马,然后再通过文件包含漏洞去连接webshell.jpg,但这种方法有时候webshell功能会出现异常。所以我们选择上面的方式,生成一个.php格式的一句话木马,再去连接。

3、包含Apache日志文件

有时候网站存在文件包含漏洞,但却没有文件上传点。这个时候我们还可以通过利用Apache的日志文件来生成一句话木马。

在用户发起请求时,服务器会将请求写入access.log,当发生错误时将错误写入error.log,日志文件如下:

《【文件包含】文件包含漏洞知识总结》

当我们正常访问一个网页时,如http://127.0.0.1/login.php,access日志会进行记录,如下图所示:

《【文件包含】文件包含漏洞知识总结》

如果我们访问一个不存在的资源,也一样会进行记录,例如访问

127.0.0.1/<?php phpinfo();?>

但查看日志会发现被编码了,如下:

《【文件包含】文件包含漏洞知识总结》

我们再次进行访问,并使用burp抓包,发现被编码:

《【文件包含】文件包含漏洞知识总结》
我们将报文修改回去,再进行发送即可:
《【文件包含】文件包含漏洞知识总结》
此时再查看access日志,正确写入php代码:

《【文件包含】文件包含漏洞知识总结》

再通过本地文件包含漏洞访问,即可执行:

《【文件包含】文件包含漏洞知识总结》

我可以在此处写入一句话木马,再使用Webshell管理工具进行连接。

四、远程文件包含

如果PHP的配置选项allow_url_include、allow_url_fopen状态为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(RFI)。

《【文件包含】文件包含漏洞知识总结》

首先我们来看一段代码:

《【文件包含】文件包含漏洞知识总结》

访问本地phpinfo.php文件:

《【文件包含】文件包含漏洞知识总结》

该页面并没有对$path做任何过滤,因此存在文件包含漏洞。

我们在远端Web服务器/site/目录下创建一个test.php文件,内容为phpinfo(),利用漏洞去读取这个文件。

但是代码会给我们输入的路径后面加上’/phpinfo.php’后缀,如果php版本小于5.3.4,我们可以尝试使用%00截断,这里php版本为7.2.7,不适用。

还有一种截断方法就是?号截断,在路径后面输入?号,服务器会认为?号后面的内容为GET方法传递的参数,成功读取test.php如下:

《【文件包含】文件包含漏洞知识总结》

如果test.php是恶意webshell文件,那么利用该漏洞就可以获取到服务器权限。

五、PHP伪协议

PHP内置了很多URL风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数,如下所示:

《【文件包含】文件包含漏洞知识总结》

1、php://filter

有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,例如打开data目录下的config.php:

《【文件包含】文件包含漏洞知识总结》

这时候我们可以以base64编码的方式读取指定文件的源码:

输入:php://filter/convert.base64-encode/resource=文件路径

得到config.php加密后的源码:

《【文件包含】文件包含漏洞知识总结》

再进行base64解码,获取到数据库账号等敏感信息:

《【文件包含】文件包含漏洞知识总结》

2、data://

利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:

《【文件包含】文件包含漏洞知识总结》
如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:

《【文件包含】文件包含漏洞知识总结》

3、zip:// 执行压缩文件

如果网站允许我们上传压缩文件,我们也可以将php文件压缩后进行上传,再通过zip://协议执行。

以DVWA平台为例,我们将phpinfo.php文件进行压缩后上传:

《【文件包含】文件包含漏洞知识总结》

通过zip://协议执行zip压缩包中的phpinfo.php文件:

《【文件包含】文件包含漏洞知识总结》

4、php://input

利用该方法,我们可以直接写入php文件,输入file=php://input,然后使用burp抓包,写入php代码:

《【文件包含】文件包含漏洞知识总结》

发送报文,可以看到本地生成了一句话木马:

《【文件包含】文件包含漏洞知识总结》

5、伪协议利用条件

伪协议的利用方法还有很多,这里就不一一举例了。

伪协议的用法小结:

《【文件包含】文件包含漏洞知识总结》

六、文件包含漏洞防护

1、使用str_replace等方法过滤掉危险字符

2、配置open_basedir,防止目录遍历

3、php版本升级,防止%00截断

4、对上传的文件进行重命名,防止被读取

5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件

6、做好管理员权限划分,做好文件的权限管理

好啦,以上就是今天的全部内容了,大家都明白了吗?

《【文件包含】文件包含漏洞知识总结》
最后,欢迎关注我的个人微信公众号。

Peace !
《【文件包含】文件包含漏洞知识总结》

    原文作者:Monsterlz123
    原文地址: https://blog.csdn.net/Monsterlz123/article/details/93964916
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞