米斯特白帽培训讲义 漏洞篇 文件包含
讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0
原理
文件包含就是将一个文件包含到自己的文件中执行。它可分为本地包含和远程包含,本地包含即包含本地磁盘上的文件,文件名称是相对路径或绝对路径,远程包含即包含互联网上的文件,文件名称是 URL。
本地包含
比如我们有一个test.txt
文件,仅仅调用phpinfo
来测试:
<?php phpinfo();?>
然后我们在相同目录下放置一个fileinclude.php
,如下:
<?php
$file=@$_GET['file'];
if($file){
echo "<center>File:".$file."<br/>Result:</center>";
include $file;
}
第一行代码获取 URL 参数file
的内容。2 ~ 4 行首先判断$file
是否为空,若不为空,输出其内容,并将其作为文件名称包含。
我们将其部署在localhost
下,之后访问http://localhost/fileinclude.php?file=test.txt
,会看到phpinfo
的输出。
我这里之所以用txt
文件,就是想说明这个漏洞是无视扩展名的。跟文件上传漏洞不一样,文件上传漏洞中如果我们上传的文件不是.php
就执行不了(当然也有一些绕过手段),但是文件包含漏洞中的扩展名是任意的,这里我们上传了.txt
,证实有效,那么这个.jpg
也是有效的。
要注意,如果被包含的文件里面没有 PHP 标签,那么就当成 HTML 内容如实显示出来。就比如我们放入之前的top100.txt
:
远程包含
为了演示远程包含,我们需要将 PHP 配置文件中的allow_url_include
设置为on
,之后重启 PHP。PHP 配置文件的位置可以在phpinfo
的输出中寻找,我们搜索ini
即可:
我这里是C:php-5.5.10php.ini
,你那里可能有些差别。我们打开它,搜索allow_url_include
,会看到下面这些行,如果是Off
把它改成On
。
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-include
allow_url_include = On
我们需要将file
参数改为http://localhost/text.txt
,可以看到相同结果。
技巧
00 截断
有些程序会给被包含内容加一些后缀,比如如果fileinclude.php
是这样。
<?php
$file=@$_GET['file'];
if($file){
$file .= '.php';
echo "<center>File:".$file."<br/>Result:</center>";
include $file;
}
它后面加了个.php
,也就是说,如果我们传入file=test
则是正常的,传入file=test.txt
,或变成test.txt.php
,从而包含失败。那么我们应该怎么办呢?
如果 PHP 版本小于 5.3,并且magic_quotes_gpc
已取消,我们就可以使用