Description
InvoiceNinja v5-stable renders an invoice or quote's "terms" field in the client portal using Laravel Blade's raw output directive {!! ->terms !!} (resources/views/portal/ninja2020/invoices/includes/terms.blade.php) with no HTML sanitization.
Published: 2026-08-05
Score: 8.7 High
EPSS: < 1% Very Low
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

InvoiceNinja v5‑stable renders an invoice or quote’s “terms” field within the client portal using Laravel Blade’s raw output directive without any HTML sanitization. This allows an attacker to inject arbitrary HTML or JavaScript into the terms field, which is stored and subsequently rendered whenever a client views the invoice or quote. Based on the description, it is inferred that the injected script can steal the client’s session cookies and potentially take over the client account. This compromise targets the confidentiality of client credentials and the integrity of account permissions, enabling the attacker to execute arbitrary actions within the portal.

Affected Systems

Based on the description, it is inferred that the affected product is InvoiceNinja, specifically the v5‑stable release that contains the unfiltered terms rendering logic. Any installation that allows users to create or modify invoices and supply a value for the terms field, whether via the web interface or an API, is vulnerable. The vulnerability is independent of the previously disclosed invoice line‑item description XSS flaw.

Risk and Exploitability

The CVSS score of 8.7 indicates a high‑severity vulnerability with wide impact. The EPSS score of 0.00199 demonstrates a low but non‑zero probability of exploitation, roughly 0.2%. The lack of a KEV listing means no confirmed exploit has been documented publicly yet. Based on the described functionality, it is inferred that the attack path only requires an authenticated user with invoice‑creation permissions, so insider or compromised accounts can trivially exploit it. The script executes in the victim’s browser when the invoice is viewed, making it a straightforward client‑side attack that requires no additional network connectivity once the malicious payload is stored.

Generated by OpenCVE AI on August 10, 2026 at 22:21 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade to the latest InvoiceNinja release that includes the fix for unsanitized invoice terms rendering.
  • If an immediate upgrade is not possible, block or restrict write access to the terms field for non‑trusted users and enforce server‑side sanitization of the terms field to strip all HTML and JavaScript.
  • In the interim, force all affected clients to log out and re‑authenticate, rotate session cookies, and monitor the portal for anomalous activity indicative of cookie theft or unauthorized actions.

Generated by OpenCVE AI on August 10, 2026 at 22:21 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Mon, 10 Aug 2026 12:00:00 +0000

Type Values Removed Values Added
Description InvoiceNinja v5-stable renders an invoice or quote's "terms" field in the client portal using Laravel Blade's raw output directive {!! $entity->terms !!} (resources/views/portal/ninja2020/invoices/includes/terms.blade.php) with no HTML sanitization. StoreInvoiceRequest.php only strips newlines from the field and does not purify HTML. An authenticated user with invoice creation access can set the terms field via the REST API (PUT /api/v1/invoices/{id}) to an HTML/JavaScript payload that executes in the client's browser when they view the invoice, enabling session cookie theft and client account takeover. This is a distinct code path from the previously published invoice line-item description field XSS (GHSA-98wm-cxpw-847p / CVE-2026-33628). InvoiceNinja v5-stable renders an invoice or quote's "terms" field in the client portal using Laravel Blade's raw output directive {!! ->terms !!} (resources/views/portal/ninja2020/invoices/includes/terms.blade.php) with no HTML sanitization.

Mon, 10 Aug 2026 11:30:00 +0000

Type Values Removed Values Added
Title InvoiceNinja: Stored XSS via Invoice/Quote Terms Field InvoiceNinja - Stored XSS via Invoice/Quote Terms Field

Wed, 05 Aug 2026 14:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'none', 'Technical Impact': 'total'}, 'version': '2.0.3'}


Wed, 05 Aug 2026 13:15:00 +0000

Type Values Removed Values Added
First Time appeared Invoiceninja
Invoiceninja invoice Ninja
Vendors & Products Invoiceninja
Invoiceninja invoice Ninja

Wed, 05 Aug 2026 11:15:00 +0000

Type Values Removed Values Added
Description InvoiceNinja v5-stable renders an invoice or quote's "terms" field in the client portal using Laravel Blade's raw output directive {!! $entity->terms !!} (resources/views/portal/ninja2020/invoices/includes/terms.blade.php) with no HTML sanitization. StoreInvoiceRequest.php only strips newlines from the field and does not purify HTML. An authenticated user with invoice creation access can set the terms field via the REST API (PUT /api/v1/invoices/{id}) to an HTML/JavaScript payload that executes in the client's browser when they view the invoice, enabling session cookie theft and client account takeover. This is a distinct code path from the previously published invoice line-item description field XSS (GHSA-98wm-cxpw-847p / CVE-2026-33628).
Title InvoiceNinja: Stored XSS via Invoice/Quote Terms Field
Weaknesses CWE-79
References
Metrics cvssV3_1

{'score': 8.7, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N'}


Subscriptions

Invoiceninja Invoice Ninja
cve-icon MITRE

Status: PUBLISHED

Assigner: TuranSec

Published:

Updated: 2026-08-10T11:45:31.919Z

Reserved: 2026-08-05T10:53:53.175Z

Link: CVE-2026-71233

cve-icon Vulnrichment

Updated: 2026-08-05T12:54:56.448Z

cve-icon NVD

Status : Received

Published: 2026-08-05T11:16:25.997

Modified: 2026-08-10T12:17:25.770

Link: CVE-2026-71233

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-08-10T22:30:06Z

Weaknesses
  • CWE-79

    Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')