CVE-2025-66923

7.2 HIGH

📋 TL;DR

This Cross-site scripting (XSS) vulnerability in Open Source Point of Sale v3.4.1 allows remote attackers to inject malicious scripts via the phone_number parameter when creating or updating customer records. Attackers can execute arbitrary JavaScript in victims' browsers, potentially stealing session cookies or performing actions on behalf of authenticated users. Anyone using Open Source Point of Sale v3.4.1 with customer management functionality enabled is affected.

💻 Affected Systems

Products:
  • Open Source Point of Sale
Versions: v3.4.1
Operating Systems: All
Default Config Vulnerable: ⚠️ Yes
Notes: Only affects systems with customer management functionality enabled. The vulnerability exists in the web interface component.

📦 What is this software?

⚠️ Risk & Real-World Impact

🔴

Worst Case

Attackers steal administrator session cookies, gain full administrative access to the POS system, manipulate transactions, steal customer data, or deploy ransomware.

🟠

Likely Case

Attackers steal user session cookies to access customer data, modify customer records, or perform unauthorized transactions.

🟢

If Mitigated

With proper input validation and output encoding, the attack fails silently with no impact.

🌐 Internet-Facing: HIGH
🏢 Internal Only: MEDIUM

🎯 Exploit Status

Public PoC: ⚠️ Yes
Weaponized: LIKELY
Unauthenticated Exploit: ✅ No
Complexity: LOW

Exploitation requires the attacker to have access to create or update customer records, typically requiring some level of authentication. The vulnerability is in a common web parameter with straightforward injection.

🛠️ Fix & Mitigation

✅ Official Fix

Patch Version: Not available

Vendor Advisory: https://github.com/opensourcepos/opensourcepos

Restart Required: No

Instructions:

1. Monitor the official Open Source Point of Sale repository for security updates. 2. Apply any available patches immediately when released. 3. Consider upgrading to a newer version if available and compatible.

🔧 Temporary Workarounds

Input Validation and Sanitization

all

Implement server-side validation to reject phone numbers containing HTML/JavaScript tags and sanitize all user inputs.

Implement input validation in PHP: if(preg_match('/[<>"\']/', $phone_number)) { reject input; }
Use htmlspecialchars() or similar functions when outputting phone numbers

Content Security Policy

all

Implement a strict Content Security Policy header to prevent execution of inline scripts and restrict script sources.

Add to web server config or PHP header: Content-Security-Policy: default-src 'self'; script-src 'self'

🧯 If You Can't Patch

  • Implement a Web Application Firewall (WAF) with XSS protection rules to block malicious payloads in the phone_number parameter.
  • Disable customer management functionality if not required, or restrict access to authorized administrators only.

🔍 How to Verify

Check if Vulnerable:

Test by attempting to inject a simple XSS payload like <script>alert('XSS')</script> into the phone_number field when creating/updating a customer. If the script executes when viewing the customer record, the system is vulnerable.

Check Version:

Check the version in the application's admin interface or configuration files. For Open Source Point of Sale, check the application version displayed in the admin panel.

Verify Fix Applied:

After implementing fixes, repeat the XSS test with the same payload. The script should not execute, and special characters should be properly encoded in the output.

📡 Detection & Monitoring

Log Indicators:

  • Unusual customer record modifications with special characters in phone_number field
  • Multiple failed login attempts followed by customer record creation/updates
  • Log entries showing script tags or JavaScript in phone_number parameter

Network Indicators:

  • HTTP POST requests to customer creation/update endpoints containing script tags in parameters
  • Unusual outbound connections from the POS system to external domains

SIEM Query:

source="web_server_logs" AND (uri_path="/customers/create" OR uri_path="/customers/update") AND (param_phone_number CONTAINS "<script>" OR param_phone_number CONTAINS "javascript:")

🔗 References

📤 Share & Export