文件包含漏洞介绍
文件包含:开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称为文件包含
文件包含漏洞:开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。
文件包含函数
PHP中文件包含函数有四种:
require():找不到被包含的文件,报错,并停止运行脚本
require_once():与require()类似,区别在于当重复调用同一文件时,程序只执行一次
include():找不到被包含的文件,只会报错
include_once():与include()类似,区别在于当重复调用同一文件时,程序只执行一次
当使用这四个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核并不会在意该包含的文件是什么类型。(无论是txt、图片文件,远程URL,全都作为PHP代码执行)
特征
?page=
?name=
?home=
目录遍历和文件包含的区别
目录遍历是可以读取web目录以外的其他目录,根源在于对路径访问权限设置不严格,针对本系统
文件包含是利用函数来包含web目录以外的文件,分为本地包含和远程包含
本地文件包含
本地文件包含就是通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤允许遍历目录的字符注入浏览器并执行
利用方式
1、在目标根目录下创建1.php文件
2、正常访问时,服务器包含了file1.php文件
3、将文件更换成1.php文件,浏览器成功包含出phpinfo
包含日志文件
如:http://www.abc.com/test.php?page=<?php phpinfo();?>
http://www.abc.com/test.php?page=/var/log/apache2/access.log 将代码写入url,中间件会将代码记录到日志文件中,包含日志文件,可以达到执行代码的效果。
使用场景
Windows:
C:oot.ini // 查看系统版本
C:WindowsSystem32configsam // 存储Windows系统初次安装的密码
C:ProgramFilesmysqlmy.ini // MySQL配置
C:ProgramFilesmysqldatamysqluser.MYD // MySQL root密码
C:windowsphp.ini // php 配置信息
Linux:
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/etc/resolv.conf
/root/.ssh/known_hosts
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
远程文件包含
远程文件包含就是允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本。此漏洞是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击甚至在目标服务器上执行代码
利用方式
1、包含vps中的1.txt文件
2、远程包含
伪协议
File:// 访问本地文件系统
http:// 访问 HTTPs 网址
ftp:// 访 问 ftp URL
php:// 访问输入输出流
Zlib:// 压缩流
data:// 控制输入流数据
input:// 利用POST方式传数据
filter:// 用于本地磁盘文件进行读取
file伪协议
前提:PHP版本大于等于5.2
php://input伪协议
1、以POST方式传参
2、执行系统命令
3、写入一句话木马
绕过方式
1、复写,比如相对路径:..././..././
2、%00截断,(? / # / 等截断方式)
3、大小写绕过
文件包含漏洞危害
1、敏感信息泄露
2、获取webshell
3、任意命令执行
文件包含漏洞防御方式
1. 包含文件的参数过滤
① 文件名过滤:白名单或者黑名单过滤;
②不使用动态变量进行包含操作,设置字典等静态处理。
③文件名后缀固定
2、路径限制
①目录限制,在用户提交的变量前增加固定的路径,限制用户可调用的目录范围;
②目录回退符过滤,避免回退符生效导致路径变化;
3、中间件的安全配置
①PHP版本小于5.4在php.ini中设置magic_quotes_gpc=on(5.4 以后被放弃用)
magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的’"加上反斜线。
②限制访问区域:php.ini 中设置 open_basedir 来限制用户访问文件的活动范围等;apache 也有相关配置
③设置访问权限:限制当前中间件所在用户的访问权限,例如;web 服务器独立用户,并且只拥有访问目录和使用中间件的权限,从而有效避免越权访问其他文件;
4.搭建RASP阻止代码注执行