本文已参与「新人创作礼」活动,一起开启掘金创作之路。
什么是文件包含漏洞
指的是一个代码文件需要去包含其他的代码文件而导致的一种漏洞。
场景
1.内容的包含
一些网页的导航条出现在了多个地方,那我们是在一个文件里面写多段重复的代码吗?
明显不是这样的,我们会把导航条写到一个文件里面,然后让多个文件去包含引用就可以了。
2.函数的包含
多个页面需要用到同样的函数,那我们也会像上面的操作一样,先把函数提取出来,然后让多个页面去包含引用。
从位置来分类
本地文件包含
英文缩写: LFI
也可以叫: 目录遍历漏洞/任意文件访问漏洞
包含方法
1.固定文件名
2.通过接口动态包含
潜在危险
可能包含恶意代码,或者图片木马来获得shell 包含敏感文件
远程问价包含
英文缩写: RFI
类似于: XXE,SSRF
| 漏洞 | 描述 | 原因 | 后果 |
|---|---|---|---|
| XXE | XML外部实体注入 | 使用XML传输数据,并且允许解析外部实体 | 导致访问敏感文件、探测端口、执行系统命令等等 |
| SSRF | 服务端请求伪造 | 因为使用了curl_exec()之类的函数 | 导致端口扫描、攻击内网主机、绕过防火墙、获取敏感信息、访问大文件造成内存溢出、操作Redis等等问题 |
| RFI | 远程文件包含 | 使用include | 导致任意文件访问、包含shell代码 |
PHP相关函数和伪协议
函数
1.include()
包含并运行指定文件
2.include_once()
只包含一次,不重复包含
3.require()
包含并运行指定文件,出错时会停止
4.require_once()
只包含一次,不重复包含,出错时会停止
5.fopen()
打开文件或者URL
6.readfile
读取文件并写入到输出缓冲区
7.highlight_file
语法高亮一个文件
8.show_source
语法高亮一个文件
9.file_get_contents
将整个文件读入一个字符串
10.file
把整个文件读入一个数组
伪协议
1.file://
访问本地文件系统
2.http://
访问HTTP(s)网址
3.ftp://
访问FTP(s)URLs
4.php://
访问各个输入输出流
5.zlib://
压缩流
6.data://
数据
7.glob://
查找匹配的文件路径模式
8.phar://
PHP归档
9.ssh2://
Secure Shell 2
10.rar://
RAR
11.ogg://
音频流
12.expect://
处理交互式流
文件包含漏洞的挖掘和利用
URL参数名字出现了page/file/filename/include等等关键字
URL参数值出现XXX.php XXX.html
上传shell/读取敏感文件
文件包含漏洞修复方案
1.PHP配置
2.禁用动态包含
3.过滤协议、目录字符
4.设置文件白名单