介绍
所谓文件包含漏洞,故名思意,就是在文件中包含(引用)了其他文件所导致的漏洞。例如有些函数在不同代码中的作用都是相同的,在这里我们可以称呼它为“变量”,那么这时程序员就会将该“变量”放在一个文件中,在其他代码中引用该变量文件即可。 当这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校验或者校验被绕过就造成了文件包含漏洞。
脚本利用 我们先创建一个带有文件包含脚本的PHP文件放在服务器上,代码如下
<?php
$filename=$_GET['filename'];
include($filename);
?>
这时我又在同一目录下创建了一个a.txt文件 内容就一句:<?php phpinfo();?> 当我在浏览器中访问test.php文件时,里面的变量?filename=a.txt。 可以看出,a.txt里的内容是以PHP脚本执行的。
对文件包含的检测
白盒可以通过代码审计 黑盒可以通过扫描工具扫出、可以利用网上公开的漏洞、还可以手工去尝试包含检测
文件包含类型
分为本地包含、远程包含,也可以分为有限制和无限制类型 所谓有限制就是在利用该漏洞时有一定的干扰,而无限制则可以直接包含(上面的脚本利用就是无限制) 像这样就是有限制的,这里就只能指向html文件。
但是我们可以通过“%00”去将后面.html代码截断,“a.txt%00”即可正常访问 在PHP中,这个%00的使用有两个条件 1.magic_quotes_gpc=off 2.PHP版本<5.3.4 若不满足这两个条件,则无法使用该截断
还有一种方法,可以利用长度截断 在Windows中文件命令长度256,Linux中文件命名长度4096。 当文件名长度超过服务器命名长度数值,则后面的.html也不会生效。
危险更大的是远程包含 在phpinfo中我们可以查看“allow_url_include”来判定是否有远程包含 状态为“On”的话就可以包含远程服务器的文件去执行了 远程包含如果有限制,我们可以通过在代码后加入相关干扰字符尝试去绕过,如%20、%23、?等
各种协议流玩法
伪协议用法:https://segmentfault.com/a/1190000018991087 如果 PHP 的配置选项 allow_url_include、allow_url_fopen 状态为 ON 的话,则include/require 函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(RFI)
file:
data:
php:
读取源代码并进行 base64 编码输出,不然会直接当做 php 代码执行就看不到源代码
内容了
php:
春秋靶场web include练习
进入后是这个页面,一串代码加上phpinfo信息 代码分析
<?php
show_source(__FILE__);
if(isset($_REQUEST['path'])){
include($_REQUEST['path']);
}else{
include('phpinfo.php');
}
由上可知,存在phpinfo.php这个文件在,所以我们尝试访问下此文件 没问题 既然是文件包含漏洞,我们查看下phpinfo中的allow_url_include是否为On 这样的话我们尝试利用上面说的伪协议,去读取相关信息 用php://input+POST【php脚本】试试 可以看到这里含有三个文件,很明显‘dle345aae.php’这个文件就是我们通过的flag文件 访问它试试 好像什么都没有爆出,不急,看看网页源代码 flag出现了
防御手段
- 将包含文件固定,不要设置为变量。
- 如果有设置变量的必要,那么最好固定文件后缀,如.html
|