什么是文件包含漏洞
动态的包含引入危险文件,并没有对文件名或内容作校验
本地文件包含
- local file inclusion(LFI)目录遍历漏洞、任意文件访问漏洞
- 四种用途:
- 固定包含文件名
- 通过接口动态包含
- 包含恶意代码或者图片马——获得shell
- 包含敏感文件
远程文件包含
-
remote file inclusion (RFI)
-
和XXE、SSRF作对比
漏洞 描述 原因 后果 XXE XML外部实体注入 使用XML传输数据,并且允许解析外部实体 导致访问敏感文件、探测端口、执行系统命令等等 SSRF 服务端请求伪造 使用了curl_exec()之类的函数 导致端口扫描、攻击内网主机、绕过防火墙、获取敏感信息、访问大文件造成内存溢出、操作Redis等等问题 RFI 远程文件包含 使用了include函数 导致任意文件访问、包含shell代码 -
tips:执行远程访问需在php.ini中设置:
allow_url_fopen=On allow_url_include=On
PHP相关函数和伪协议
函数 | 作用 |
---|---|
include() | include语句包含并运行指定文件 |
include_once() | 只包含一次,不重复包含 |
require() | 和include一样,不过出错时会停止 |
require_once() | 和include_once一样 |
fopen() | 打开文件或者URL |
readfile | 读取并写入到输出缓冲 |
highlight_file | 语法高亮一个文件 |
show_source | 等于highlight_file() |
file_get_contents | 将整个文件读入一个字符串 |
file | 把整个文件读入一个数组中 |
php伪协议
- parse_str(file_get_contents(‘php://input’),$_PUT);
- 官网描述
- 需要对伪协议有一定的了解,且php使用某协议之前需要安装开启其扩展模块
CTF题目案例
- php://input 是 PHP 提供的一个伪协议,允许开发者访问 POST 请求的原始内容。
从源代码看出,include会调用客户端传来的参数。使用bp进行抓包,修改传入的数据。注:php://input只能用POST传输。
(该伪协议优先级比$_GET高,跳过GET限制直接将数据传给include。)
- php://filter 是 PHP 内置的过滤器流,可以读取源代码,并过滤输出。
题目直接告诉你了flag在/flag
中,直接构造伪协议加在url后面:?file=php://filter/resource=/flag
结果:
文件包含漏洞的挖掘和利用
判断漏洞:
- URL关键字
- 参数名字出现了page、file、filename、include等
- 参数值出现了文件名,比如xxx.php xxx.html
利用流程:
- 发现漏洞
- 上传shell / 读取敏感文件(FUZZ)
- 执行恶意代码
工具:
-
wfuzz --hw 30 -w /usr/share/wordlists/wfuzz/vulns/apache.txt http://192.168.133.1/upload-labs/include.php?file=FUZZ
防御措施
- PHP配置
- 禁用动态包含
- 过滤协议、目录字符
- 设置文件白名单
复习建议
- 漏洞的发生原因是什么?定义是什么?
- 怎么确定是否存在这个漏洞?怎么发现这种漏洞?
- 漏洞会造成什么危害?
- 如何防御和修复这种漏洞?
- 有防御措施的情况下,怎么绕过这种漏洞?