赞
踩
所谓文件包含漏洞,故名思意,就是在文件中包含(引用)了其他文件所导致的漏洞。例如有些函数在不同代码中的作用都是相同的,在这里我们可以称呼它为“变量”,那么这时程序员就会将该“变量”放在一个文件中,在其他代码中引用该变量文件即可。
当这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校验或者校验被绕过就造成了文件包含漏洞。
脚本利用
我们先创建一个带有文件包含脚本的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支持的协议和封装协议https://www.php.net/manual/zh/wrappers.php
如果 PHP 的配置选项 allow_url_include、allow_url_fopen 状态为 ON 的话,则include/require 函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(RFI)
file://+路径:将文件以脚本执行
data://
php://filter 可以在执行代码前将代码换个方式读取出来,只是读取,不需要开启,
读取源代码并进行 base64 编码输出,不然会直接当做 php 代码执行就看不到源代码
内容了
php://input?test=php://input 【post data】<?php phpinfo();?>
春秋靶场web include练习
进入后是这个页面,一串代码加上phpinfo信息
代码分析
<?php
show_source(__FILE__);//文件高亮
if(isset($_REQUEST['path'])){//isset — 检测变量是否已声明并且其值不为 null
include($_REQUEST['path']);//包含变量‘path’请求的文件
}else{
include('phpinfo.php');//否则展示phpinfo.php这个文件
}
由上可知,存在phpinfo.php这个文件在,所以我们尝试访问下此文件
没问题
既然是文件包含漏洞,我们查看下phpinfo中的allow_url_include是否为On
这样的话我们尝试利用上面说的伪协议,去读取相关信息
用php://input+POST【php脚本】试试
可以看到这里含有三个文件,很明显‘dle345aae.php’这个文件就是我们通过的flag文件
访问它试试
好像什么都没有爆出,不急,看看网页源代码
flag出现了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。