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/路径,以及.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代码:
发送报文,可以看到本地生成了一句话木马:
文件包含漏洞的防护
1、使用str_replace等方法过滤掉危险字符
2、配置open_basedir,防止目录遍历
3、php版本升级,防止%00截断
4、对上传的文件进行重命名,防止被读取
5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件
6、做好管理员权限划分,做好文件的权限管理