当前位置: 首页 > news >正文

DVWA文件包含漏洞实战:从LFI/RFI原理到高级利用与防御

1. 项目概述:从靶场到实战,理解文件包含漏洞的本质

如果你正在学习网络安全,尤其是Web安全,那么“DVWA-文件包含(File Inclusion)”这个标题对你来说一定不陌生。DVWA(Damn Vulnerable Web Application)是一个著名的、故意设计得漏洞百出的PHP/MySQL应用,是无数安全从业者和爱好者的“练功房”。而“文件包含”漏洞,则是Web安全领域中一个极具代表性且危害巨大的漏洞类型,它允许攻击者将服务器上的任意文件(甚至远程文件)包含到当前脚本中执行。这听起来可能有点抽象,我打个比方:你家里的水管(Web应用)本来只应该从自家的水龙头(指定目录)取水(包含文件),但因为这个漏洞,水管工(攻击者)可以偷偷把水管接到隔壁邻居家,甚至接到化工厂的排污口(系统敏感文件或远程恶意脚本),结果可想而知。

我接触DVWA和文件包含漏洞已经很多年了,从最初照着教程点点鼠标,到后来在真实渗透测试项目中遇到它的各种变体,深知这个漏洞的狡猾与危险。很多人觉得在靶场里通关很简单,但到了真实、复杂的生产环境,往往就束手无策。这篇文章,我将以一个老鸟的视角,带你彻底拆解DVWA中的文件包含漏洞。我们不止步于完成靶场任务,更要深挖其背后的四种包含类型(本地文件包含LFI、远程文件包含RFI)、PHP相关配置的深层影响、绕过各种防护限制的技巧,以及如何将靶场经验转化为实战能力。无论你是刚入门的新手,还是想巩固基础的中级选手,这篇超过5000字的深度解析,都将为你提供从原理到实战的完整地图。

2. 漏洞原理深度剖析:为什么“包含”会变得危险?

在深入操作之前,我们必须先搞清楚文件包含漏洞到底是怎么产生的。这不仅仅是知道“怎么利用”,更重要的是理解“为什么能被利用”,这是你未来进行代码审计和漏洞挖掘的基础。

2.1 PHP包含函数的工作机制

文件包含漏洞的核心在于PHP(或其他服务端语言,如JSP、ASP)提供的文件包含函数。在PHP中,主要有四个:

  • include()
  • require()
  • include_once()
  • require_once()

它们的本意是优秀的代码复用工具。想象一下,你有一个网站,每个页面的头部(导航栏)和尾部(版权信息)都是一样的。聪明的做法是把这些公共部分写成header.phpfooter.php,然后在每个页面里,只需要写一行include(‘header.php’);就行了。这样既便于维护,也减少了代码冗余。

这些函数在执行时,会读取指定路径的文件内容,并将其中的PHP代码当作当前脚本的一部分来执行。关键就在这里:如果开发者能够严格控制这个“指定路径”,那就安全;但如果这个路径的一部分或全部,可以由用户通过URL参数、表单输入等方式来控制,危险就产生了。

在DVWA的File Inclusion模块中,模拟的正是这种场景。通常,它会有一个类似这样的脆弱代码:

$file = $_GET[‘page’]; // 直接从用户输入获取文件名 include($file . ‘.php’); // 直接包含该文件

攻击者可以通过构造?page=../../../../etc/passwd这样的参数,让$file变量变成../../../etc/passwd,最终拼接成../../../etc/passwd.php。虽然加了.php后缀,但通过路径遍历(../)跳出了程序设定的目录,去包含系统敏感文件/etc/passwd。由于/etc/passwd不是PHP文件,include()函数会将其内容以文本形式读出并显示在页面上,从而造成信息泄露。

2.2 本地文件包含与远程文件包含

根据包含文件的来源,漏洞分为两类:

  1. 本地文件包含:包含的是服务器本地的文件,如上文的/etc/passwd。这是最常见的情况。
  2. 远程文件包含:包含的是远程服务器上的文件。例如,攻击者在自己控制的服务器上放置一个包含PHP代码的文本文件,然后通过漏洞让目标服务器去包含这个远程URL。如果成功,目标服务器会下载并执行该文件中的恶意代码,相当于直接获得了Webshell。

RFI的危害比LFI大得多,因为它意味着攻击者可以从外部注入任意代码。但RFI的实现需要一个关键前提:PHP的allow_url_include配置项必须为On(默认是Off)。在DVWA中,你可以通过调整安全等级来模拟该配置开启或关闭的环境。

2.3 文件包含漏洞的常见危害

理解了原理,我们来看看它能做什么:

  • 敏感信息泄露:读取服务器配置文件(如/etc/passwd,/etc/shadow,.env数据库配置文件)、应用程序源码、日志文件等。
  • 获取Webshell:结合文件上传漏洞,上传一个图片马(将PHP代码嵌入图片),然后通过LFI包含这个图片文件,其中的PHP代码会被执行。或者,在RFI开启时,直接包含远程的恶意脚本。
  • 执行系统命令:包含一些存储了命令输出的特殊文件,如/proc/self/environ(环境变量)、日志文件(如果其中写入了用户输入),在特定条件下可导致命令执行。
  • 拒绝服务:包含一个巨大的文件或设备文件(如/dev/zero),可能导致服务器资源耗尽。

注意:在真实环境中进行未经授权的渗透测试是违法行为。所有学习研究都应在像DVWA这样的授权靶场或自己搭建的隔离环境中进行。

3. DVWA环境搭建与配置要点

工欲善其事,必先利其器。一个稳定、配置正确的DVWA环境是实验的基础。网络上教程很多,但坑也不少,我结合自己的经验,梳理几个关键点。

3.1 选择你的“练功房”搭建方式

主要有三种路径:

  1. 集成环境包:如XAMPPPHPStudy。这是对新手最友好的方式,特别是在Windows系统上。以PHPStudy为例,你只需要下载安装,启动Apache和MySQL,然后将下载的DVWA压缩包解压到www目录下,访问localhost/DVWA即可。但要注意,PHPStudy的不同版本可能集成的PHP版本也不同,需要调整DVWA的配置文件以匹配。
  2. Docker方式:这是目前最干净、最推荐的方式。一条命令就能拉起一个包含所有依赖的DVWA环境,与宿主机环境隔离,玩坏了删掉容器重来就行。
    docker run -d --name dvwa -p 80:80 vulnerables/web-dvwa
    访问http://localhost即可。Docker镜像通常已经做好了最佳配置。
  3. 手动搭建:在Linux(如Kali)或macOS上手动配置Apache、PHP、MySQL。这个过程能让你更深入地理解Web服务的运行机制,适合希望夯实基础的学习者。

3.2 必须解决的常见配置问题

无论哪种方式,第一次访问DVWA时,大概率会遇到红字报错。别慌,这是正常步骤。

  • 数据库连接配置:这是第一个拦路虎。你需要编辑DVWA/config/config.inc.php文件(Docker方式可能不需要)。关键参数是:

    $_DVWA[ ‘db_server’ ] = ‘127.0.0.1’; // 数据库地址,Docker内可能是‘db’ $_DVWA[ ‘db_user’ ] = ‘root’; // 数据库用户名 $_DVWA[ ‘db_password’ ] = ‘p@ssw0rd’; // 数据库密码,PHPStudy默认可能是‘root’或空

    实操心得:密码错误是最常见的问题。用PHPStudy的,去它的“MySQL管理器”里查看或修改密码;用Docker的,默认密码通常是p@ssw0rd;手动搭建的,就是你安装MySQL时设定的密码。

  • PHP函数禁用问题:DVWA的某些模块(如命令执行)需要用到system(),passthru()等函数,这些函数可能在php.inidisable_functions列表中被禁用。你需要找到所用的PHP版本的php.ini文件,将相关函数从禁用列表中移除,并重启Web服务。查找php.ini路径:在DVWA的phpinfo()页面(/DVWA/phpinfo.php)里搜索“Loaded Configuration File”。

  • 文件权限问题DVWA/hackable/uploads/目录需要写入权限,用于文件上传模块。在Linux下,可能需要执行chmod 777 hackable/uploads/

  • 安全等级设置:DVWA左下方可以设置安全等级:Low, Medium, High, Impossible。务必从Low开始,否则很多漏洞的防护机制会让你无从下手。我们的实验主要在Low和Medium下进行。

3.3 给你的环境“装个镜子”——配置浏览器代理

单纯在页面上操作,你只能看到输入和输出,看不到背后的HTTP请求和响应细节。强烈建议配置一个代理工具,如Burp SuiteOWASP ZAP。将浏览器代理设置为127.0.0.1:8080,这样所有流量都会经过代理工具,你可以拦截、查看、修改每一个请求,这对于理解漏洞利用过程和构造复杂Payload至关重要。这是从业余走向专业的关键一步。

4. 通关实战:DVWA文件包含四重奏

现在,让我们进入DVWA,将安全等级设为“Low”,点击“File Inclusion”开始实战。页面通常有两个链接:“file1.php”和“file2.php”。查看URL,你会发现类似?page=file1.php的参数。这就是我们的攻击入口。

4.1 Low级别:毫无防护的“裸奔”

Low级别的代码几乎没有任何过滤,就像我们前面原理中提到的那样。我们的目标是读取服务器上的/etc/passwd文件(Linux系统)。

  1. 直接路径遍历:将URL中的参数改为?page=../../../../etc/passwd。你可能需要尝试不同数量的../来跳出Web根目录。成功的话,页面上会显示系统的用户列表。
  2. 利用PHP封装协议:这是更强大的技巧。PHP内置了一些“封装协议”,可以像访问文件一样访问各种数据流。
    • 读取PHP源码:使用php://filter协议。?page=php://filter/read=convert.base64-encode/resource=index.php。这个Payload的意思是:用php://filterindex.php文件进行读取,并将其内容用base64编码后输出。为什么要编码?因为如果直接包含index.php,其中的PHP代码会被执行,我们看不到源代码。Base64编码后,我们拿到一串字符,解码后就能得到纯净的源码。这是审计代码、寻找其他漏洞的利器。
    • 包含日志文件获取Shell(进阶):如果服务器开启了错误日志,并且我们能知道其路径(如/var/log/apache2/access.log),我们可以尝试在User-Agent或请求参数中插入一段PHP代码,比如 ``。然后,去包含这个日志文件?page=../../../../var/log/apache2/access.log。服务器执行日志文件时,就会执行我们插入的代码。这需要日志文件有可读权限,并且其中存储的内容能被解析。

注意事项php://input协议允许你读取POST请求的原始主体数据并执行。在Low级别且allow_url_include=On时,你可以用Burp Suite拦截请求,将GET改为POST,然后在请求体里写<?php system(‘whoami’);?>,同时将URL参数改为?page=php://input。但这在DVWA默认配置下往往受限于allow_url_include设置。

4.2 Medium级别:初级的字符串过滤

将安全等级调到Medium,刷新页面。你会发现之前的Payload可能失效了。查看源码(DVWA提供了“View Source”按钮),你会看到类似这样的过滤:

$file = str_replace( array( “../”, “..\” ), “”, $_GET[ ‘page’ ] );

代码试图将../..\替换为空字符串。这是一种非常幼稚的过滤,很容易绕过。

  1. 双写绕过:既然它删除一次,我们就写两次。构造?page=….//….//….//….//etc/passwd。经过str_replace处理后,相邻的两个../中间的//会被留下,当第一次删除../后,剩下的/会和后面的..再次组合成新的../,从而成功绕过。最终,….//在处理后会变成一个../
  2. 绝对路径绕过:如果知道目标文件的绝对路径,可以直接使用。例如?page=/etc/passwd。但这通常需要信息收集,猜解路径。
  3. 利用PHP封装协议php://filter等协议路径通常不包含../,所以依然可以直接使用:?page=php://filter/read=convert.base64-encode/resource=index.php

4.3 High级别:白名单机制的挑战

High级别的防护看起来强了很多,通常采用白名单机制:

$file = $_GET[ ‘page’ ]; if( !fnmatch( “file*”, $file ) && $file != “include.php” ) { echo “ERROR: File not found!”; exit; } include( $file );

代码要求page参数必须以 “file” 开头,或者等于 “include.php”。这似乎堵死了所有外部文件包含的可能。但是,漏洞依然存在,关键在于路径截断(但此技巧受PHP版本影响较大)。

在PHP版本小于5.3.4,且magic_quotes_gpc=Off的情况下,可以利用空字符(%00)进行截断。因为include()在读取文件时,会认为空字符是字符串的结束。假设代码是include($file . ‘.php’),我们传入?page=../../../../etc/passwd%00,那么拼接后就是../../../../etc/passwd%00.phpinclude()读到%00就停止了,实际去包含的就是/etc/passwd然而,需要注意的是,现代PHP环境(>=5.3.4)已经修复了空字符截断的问题,且DVWA的High级别代码不一定有后缀拼接,因此此方法在现代靶场中可能无效。

那么,在High级别下真正的突破口往往不在这里,而在于利用已有的、合法的“file”开头文件。例如,如果服务器上存在一个叫fileupload.php的文件,并且存在文件上传功能,我们可以先上传一个包含恶意代码的图片文件,然后通过文件包含去调用这个上传的文件。因为文件名可能是file_xxxx.jpg,符合“file*”的白名单规则。这需要结合其他漏洞,属于组合拳。

4.4 Impossible级别:如何从根本上防御?

Impossible级别的代码展示了最佳实践:

$file = $_GET[‘page’]; // 只允许包含“include.php”或“file1.php”、“file2.php” switch ($file) { case ‘include.php’: case ‘file1.php’: case ‘file2.php’: break; default: $file = ‘include.php’; break; } include( DVWA_WEB_PAGE_TO_ROOT . $file );

它使用一个严格的switch-case白名单,只允许包含预设的几个文件。用户输入根本无法改变包含的目标。同时,它使用了DVWA_WEB_PAGE_TO_ROOT这个绝对路径常量进行拼接,彻底杜绝了路径遍历。这就是最有效的防御方式:不要信任任何用户输入,对包含的文件名采用严格的白名单控制

5. 实战扩展与高级利用技巧

在真实世界中,漏洞很少像Low级别那样赤裸裸。我们需要更多技巧。

5.1 利用日志文件包含获取Shell

这是一个经典的LFI到RCE(远程代码执行)的案例。前提是:

  1. 你知道Web服务器(如Apache、Nginx)访问日志的绝对路径。
  2. 该日志文件对Web进程可读。
  3. 你能将PHP代码注入到日志内容中。

步骤

  1. 信息收集:通过报错、已知漏洞或常见路径列表猜解日志路径。如/var/log/apache2/access.log,/var/log/nginx/access.log,C:\xampp\apache\logs\access.log等。
  2. 注入代码:在浏览器请求、User-Agent、Referer等HTTP头中插入PHP代码。例如,使用Burp Suite或Curl发送一个请求,其中User-Agent设置为 ``。
  3. 包含日志:发起文件包含请求:?page=../../../../var/log/apache2/access.log。服务器执行日志时,就会执行phpinfo()
  4. 升级为Webshell:将注入的代码改为一句话木马:``。然后就可以用中国菜刀或蚁剑等工具连接http://target/shell.php?cmd=whoami来执行命令。

实操心得:日志文件通常很大,包含时可能超时或返回空白。可以尝试先截断日志(如果有权限),或注入代码后立即进行包含,以提高成功率。另外,注意日志的编码和特殊字符转义问题。

5.2 PHP封装协议全解析

php://filterphp://input只是冰山一角。PHP封装协议是一个宝库。

  • zip://:可以包含ZIP压缩包中的文件。例如,你上传了一个ZIP文件,里面有个shell.php,你可以用?page=zip://path/to/archive.zip%23shell.php(注意#要编码为%23)来包含执行它。这常用于绕过文件上传的后缀检查。
  • data://:一个更强大的协议,可以直接在URL中嵌入数据。格式:data://text/plain;base64,。例如:?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==(即<?php system(‘whoami’);?>的base64编码)。这通常需要allow_url_include=On
  • expect://:可以用来执行系统命令,如?page=expect://ls,但该模块默认不安装,非常罕见。

重要提示allow_url_includeallow_url_fopen是两个不同的配置。后者允许fopen()打开URL,是很多协议(如http://)能用的前提;前者特指include/require系列函数能否包含URL。在生产环境中,务必确保两者都为Off

5.3 绕过路径限制与编码技巧

当简单的../被过滤时,可以尝试:

  • URL编码../可以编码为%2e%2e%2f..%2f。有时双重编码可能有效:%252e%252e%252f%25%的URL编码)。
  • 操作系统特性:在Windows下,路径分隔符是\,也可以尝试..\。或者利用Windows的UNC路径(\\?\C:\...)或8.3短文件名格式。
  • 容器/环境变量:包含/proc/self/environ文件,其中包含了环境变量。如果User-Agent等HTTP头信息被记录在此,并且我们能够控制它(比如通过Burp修改),就可以注入代码。

6. 从靶场到实战:防御方案与代码审计视角

学习攻击是为了更好的防御。作为开发者,你应该:

  1. 严格使用白名单:像DVWA的Impossible级别一样,只允许包含预设的、确定的文件。这是最有效的方法。
  2. 避免动态包含:如果业务逻辑允许,尽量使用静态包含或模板引擎。
  3. 净化用户输入:如果必须动态包含,要对用户输入进行严格过滤。但记住,黑名单(过滤../等)永远会有遗漏,应作为辅助手段。
  4. 设置PHP安全配置:确保php.iniallow_url_includeallow_url_fopenOff。将open_basedir限制在Web目录,防止跨目录访问。
  5. 使用绝对路径:在包含文件时,使用基于项目根目录的绝对路径,避免相对路径遍历。
  6. 降低权限:Web服务器进程(如www-data, apache用户)应以最低必要权限运行,避免其读取系统敏感文件。

作为安全人员,在进行代码审计时,要全局搜索include(),require(),include_once(),require_once()这些函数,检查它们的参数是否用户可控,是否经过严格校验。不仅要看GET/POST参数,还要注意$_COOKIE,$_SERVER中的某些变量(如$_SERVER[‘PHP_SELF’])也可能被利用。

文件包含漏洞就像一扇不该被打开的后门。在DVWA中的练习,让我们熟悉了这扇门的各种锁芯和撬锁工具。但现实中的系统,门可能藏在更隐蔽的地方,锁也可能更复杂。真正的能力,是在代码中一眼认出这扇门,并知道如何为它装上最坚固的锁。希望这篇长文,能成为你手中那把打开Web安全大门的钥匙之一。最后一个小建议:在DVWA通关后,不妨去尝试一下更复杂的综合靶场,比如“Web for Pentester”或“HackTheBox”上的简单机器,在那里,文件包含往往只是整个攻击链中的一环,你会对它的实战价值有更深的理解。

http://www.jsqmd.com/news/1386001/

相关文章:

  • 基于K-Means聚类算法的用户群体划分与特征分析——Python大数据实战
  • Claude Code自动模式默认化:AI编程助手效率提升与实战指南
  • 2026年最值得尝试4个热门AI论文辅助平台必看排名:值得收藏
  • JavaScript浏览器自动化实战:从DOM操作到Web交互模拟
  • PDF补丁丁技术深度解析:开源PDF工具箱的架构与实现原理
  • 3步打造你的专属AI桌面宠物:告别单调工作台的终极解决方案
  • Compose Multiplatform Wizard新手入门:从安装到生成第一个跨平台应用
  • Blender插件资源库终极指南:精选工具与完整清单快速提升3D创作效率
  • 3个技巧让COLMAP点云数据开口说话:从视觉迷雾到清晰洞察
  • 卷积为何能加速字符串计数:FFT 的复数旋转因子实验
  • 从青蛙跳台阶到动态规划:算法优化与工程实践全解析
  • 119、顶会注意力机制复现:MambaVision-SSM在YOLOv12中的应用——状态空间模型与视觉注意力的创新融合
  • Windows Defender完全移除:从诊断到彻底解决方案
  • 华为云Stack故障排查实战:存储与网络域问题定位与OpenStack命令精解
  • 3步快速参与:开源仓库管理系统贡献实战指南
  • AutoSchemaKG性能优化:提升知识图谱构建与检索效率的10个技巧
  • FAB女工程师的处境:真实与偏见
  • 用 Dism++ 彻底清理系统垃圾:新手完整教程
  • Ubuntu 20.04环境部署ORB-SLAM3:从ROS Noetic到OpenCV版本兼容全攻略
  • 5分钟装好Alto Clef:Minecraft机器人模组安装、配置与进阶玩法全指南
  • TCP/IP协议栈深度解析与性能优化实践
  • book-to-skill:用AI将技术文档转化为可执行代码与交互式学习任务
  • C++字符串清理:深入解析remove_if与isspace的实战应用与陷阱
  • 网站建设情况通报:深入剖析项目进度、潜在风险及未来优化方向的全面总结
  • Windows 11系统精简完整实战:tiny11builder 让 2012 年老笔记本重新起飞
  • MySQL客户端数据导出导入实战:从CSV处理到自动化备份
  • ComfyUI中文工作流终极指南:从新手到专家的完整实战教程 [特殊字符]
  • [特殊字符] 一份 Agent 工程岗 JD,暴露了市场真正想要什么样的人
  • RyTuneX 系统优化终极指南:免费开源工具让 Windows 提速 40% 的完整玩法
  • LNReader完整指南:如何一键安装和管理轻小说插件源