Pikachu靶场通关笔记(31) — File Inclusion (本地文件包含漏洞利用)

47次阅读
没有评论

摘要 / 前言:
文件包含漏洞(File Inclusion)通常出现在 PHP 应用中。开发人员为了方便代码复用,使用 include(), require() 等函数加载其他文件。如果传入的文件名参数没有经过严格过滤,攻击者就可以利用目录遍历(Directory Traversal)的方式,读取服务器上的任意文件,甚至配合文件上传漏洞执行恶意代码。
本次通关演示了从发现参数点,到利用 ../ 穿越目录读取系统配置,以及执行特定文件的全过程。


一、漏洞发现与探测

1. 观察业务逻辑

进入靶场页面,发现是一个简单的下拉菜单,用于选择 NBA 球员。
随意选择一个选项(如 “Kobe bryant”)并提交,观察 URL 的变化:
http://localhost:8899/vul/fileinclude/fi_local.php?filename=file1.php&submit=%E6%8F%90%E4%BA%A4

分析:

  • 请求方式:GET 请求。
  • 可疑参数filename
  • 后端猜测:后端代码很可能直接使用了类似 include($_GET['filename']); 的写法。这意味着我们可以尝试改变 filename 的值来加载其他文件。

2、代码示例:

if(isset($_GET['submit']) && $_GET['filename']!=null){$filename=$_GET['filename'];
    include "include/$filename";// 变量传进来直接包含, 没做任何的安全限制
//     // 安全的写法, 使用白名单,严格指定包含的文件名
//     if($filename=='file1.php' || $filename=='file2.php' || $filename=='file3.php' || $filename=='file4.php' || $filename=='file5.php'){
//         include "include/$filename";

//     }
}

二、漏洞利用实战

1. 敏感信息泄露 (Arbitrary File Read)

在 Linux 系统中,/etc/passwd 是一个保存用户账户信息的关键文件,通常所有用户可读。为了读取它,我们需要利用 ../ 回退到根目录。

构造 Payload:

../../../../etc/passwd

(注:根据当前脚本所在的目录深度,可能需要增加或减少 ../ 的数量,通常多加几个也没关系,系统会忽略多余的跳转)

利用 URL:

http://localhost:8899/vul/fileinclude/fi_local.php?filename=../../../../etc/passwd&submit= 提交

结果:
页面直接输出了 /etc/passwd 的内容(如 root:x:0:0...),验证了本地文件包含漏洞的存在,且当前 Web 服务拥有读取系统文件的权限。

Pikachu 靶场通关笔记(31) — File Inclusion (本地文件包含漏洞利用)

2. 代码执行验证 (Code Execution)

为了进一步验证 include 函数的特性,利用对靶场源码结构的了解,定位到了上级目录的一个测试文件 test/phpinfo.txt

Pikachu 靶场通关笔记(31) — File Inclusion (本地文件包含漏洞利用)

构造 Payload:

../../../test/phpinfo.txt

利用 URL:

http://localhost:8899/vul/fileinclude/fi_local.php?filename=../../../test/phpinfo.txt&submit= 提交

结果:
页面成功渲染出了 PHPInfo 的配置信息页面。

Pikachu 靶场通关笔记(31) — File Inclusion (本地文件包含漏洞利用)

关键技术点分析:
为什么 .txt 文件被执行了?
这是 PHP include() 函数的一个重要特性:它不关心文件后缀名,只关心文件内容。 只要文件内容符合 PHP 语法(包含 <?php ... ?>),PHP 解释器就会将其当作 PHP 代码执行。
这意味着,如果攻击者能通过上传漏洞上传一个包含恶意代码的图片(shell.jpg),再利用 LFI 包含这个图片,就能实现远程代码执行(RCE)。


三、实战思考:如果没有源码怎么办?

在本次练习中,直接读取了 phpinfo.txt 是基于上帝视角(已知文件路径)。而在真实的黑盒渗透测试中,我们并不知道服务器上有哪些文件。

实战中的应对策略:

  1. 读取固定文件:如 /etc/passwd (Linux), C:\Windows\win.ini (Windows),验证漏洞存在。
  2. 目录 / 文件扫描 (Fuzzing):使用工具(如 DirBuster, Ffuf, Burp Suite Intruder)配合字典,对常见的路径和文件名进行爆破扫描。
    • 例如:扫描 config.php, index.php, web.xml, access.log 等。
  3. 日志包含 (Log Poisoning):如果找不到可利用的文件,可以尝试将恶意代码写入 Web 服务器日志(如 User-Agent 中写入 PHP 代码),然后包含日志文件来实现 GetShell。

四、总结

这是一次成功的 LFI 攻击。不仅读取了系统敏感文件,证明了 信息泄露 的危害;还通过包含文本文件执行了代码,证明了 LFI 往往是通向 RCE (远程代码执行) 的跳板。

防御建议:

  • 设置 open_basedir(通常可以在 php.ini 文件中看到它),限制 PHP 程序能够访问的文件系统树(目录范围)。
  • 尽量不使用变量动态加载文件。
  • 如果必须使用,应对 filename 参数通过白名单机制进行严格校验。
正文完
 0
评论(没有评论)