Brute Force(暴力(破解))、Command Injection(命令行注入)、CSRF(跨站请求伪造)、 File Inclusion(文件包含)、File Upload(文件上传)、Insecure CAPTCHA (不安全的验证码)、 SQL Injection(SQL注入)、SQL Injection(Blind)(SQL盲注)、XSS(DOM)(基于DOM树)、 XSS(Reflected)(反射型跨站脚本)、XSS(Stored)(存储型跨站脚本)
和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
以PHP为例,常用的文件包含函数有以下四种
include(),require(),include_once(),require_once()
区别如下:
require():找不到被包含的文件会产生致命错误,并停止脚本运行
include():找不到被包含的文件只会产生警告,脚本继续执行
require_once()与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
include_once()与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。
上传了一个jpg格式的一句话木马,如果网站有文件包含漏洞,jpg文件就可以被当做php文件解析,所以这就是文件上传漏洞通常配合文件上传使用。
PHP伪协议
1.file://协议
file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响
file:// [文件的绝对路径和文件名]
2.php://协议
php://filter用于读取源码。
php://input用于执行php代码。
3.ZIP://协议
4.data://协议
data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:
六、文件包含漏洞防护
1、使用str_replace等方法过滤掉危险字符
2、配置open_basedir,防止目录遍历(open_basedir 将php所能打开的文件限制在指定的目录树中)
3、php版本升级,防止%00截断
4、对上传的文件进行重命名,防止被读取
5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件。
6、做好管理员权限划分,做好文件的权限管理,allow_url_include和allow_url_fopen最小权限化
等级low
建立一个文件1.PHP,里面代码随意
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file1.php
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/1.php
等级Medium
如果传参值中有http:// https:// …/ …\都将替换为空,被过滤了
htthttp://p://127.0.0.1/1.php 双写绕过
等级high
使用fnmatch()函数对page参数进行过滤,要求page必须以“file”开头,服务器才会包含相应的文件
可利用file协议进行读文件file://D://1.php 把1.PHP放到D盘
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file://D://1.php