web安全——文件包含漏洞

本地文件包含中四个../回到www文件夹下

文件包含漏洞

文件包含漏洞成因

文件包含漏洞是代码注入的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务器端执行。文件包含可能出现在jsp、php、asp等语言中。但是asp、jsp文件只能本地包含,而php既可以本地包含也可以远程包含。服务器通过函数去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。常见的文件包含函数如下:

PHP:include()、include_one()、require()、require_one()、fopen()、readfile()

JSP/Servlet:ava.io.file()、java.io.filereader()

ASP:include file、include virtual

本地包含

本地包含条件:1、allow_url_fopen=ON 2、用户可以动态控制变量

测试文件包含代码:

 

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

利用该代码,我们可以读取一些系统本地的敏感信息。例如C:\\windows\system.ini文件。

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

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

../../windows/system.ini。

(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 配置文件

本地包含漏洞利用技巧

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、配合文件上传使用

3、包含Apache日志文件

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

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

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

 

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

127.0.0.1/<?php phpinfo();?>

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

 

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

我们将报文修改回去,再进行发送即可:

此时再查看access日志,正确写入php代码:

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

远程文件包含

如果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伪协议

 

1、php://filter

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

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

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

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

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、做好管理员权限划分,做好文件的权限管理

posted @ 2021-09-16 22:38  学安全的小白  阅读(485)  评论(0编辑  收藏  举报