# Ghost CMS Content API SQL Injection CVE-2026-26980 — Large-Scale ClickFix Watering-Hole Campaign Compromising 700+ Domains (XLab)

> Multi-cluster threat activity is exploiting CVE-2026-26980, an unauthenticated SQL injection in Ghost CMS Content API (slug filter), to dump Admin API Keys and inject malicious JavaScript loaders into article pages. The poisoned pages serve a cloaked second-stage that displays a fake Cloudflare verification overlay (ClickFix), tricking visitors into pasting attacker commands into Windows Run. XLab confirmed 700+ compromised domains including Harvard, Oxford, Auburn, and DuckDuckGo, with payloads ranging from DLL loaders to an Electron-based UtilifySetup.exe.

- **Published:** 2026-05-24T00:00:00Z
- **Last reviewed:** 2026-09-27T02:43:58.262Z
- **Canonical:** https://intel.threadlinqs.com/threat/TL-2026-0575
- **ID:** TL-2026-0575
- **Severity:** CRITICAL (CVSS 9.4)
- **Category:** VULNERABILITY
- **Status:** ACTIVE
- **Actor:** Multi-cluster
- **Detections:** 9 · **IOCs:** 61 (full data via the Threadlinqs MCP server — Purple tier)
- **CVEs:** CVE-2026-26980

## Description

Ghost is a Node.js content management system used by news publishers, universities, and corporate sites. CVE-2026-26980 is an unauthenticated SQL injection in the Content API endpoint GET /ghost/api/content/posts/, rooted in slug-filter-order.js. The function parses slug:[a,b,c] expressions from NQL (Ghost Query Language) filters and concatenates the slug values directly into a raw SQL CASE WHEN ... END ASC fragment used in ORDER BY, with no parameterization. Because NQL's STRING token grammar is more permissive than slugFilterOrder's naive comma split, an attacker can use SQL concatenation operators (||) to stitch attacker-controlled SQL into the ORDER BY clause, enabling arbitrary database reads, including disclosure of the admin_api_keys table. The Content API key required to reach the endpoint is embedded in theme HTML and effectively public. Versions 3.24.0 through 6.19.0 are affected; 6.19.1 (released 2026-02-19) fixes the issue.

Exploitation chain. (1) Unauthenticated SQLi against /ghost/api/content/posts/?filter=slug:[...] returns the Admin API Key. (2) The attacker uses the Admin API Key to call PUT /ghost/api/admin/posts/:id/ and append a small JavaScript loader to the bottom of published articles. The loader is highly recognisable: it base64-decodes a hard-coded stage-2 URL using atob() and POSTs the page origin back using btoa(a.origin). (3) The stage-2 cloaking script fingerprints the visitor (user-agent, geo, prior visit cookies) and decides whether to serve the lure. (4) Qualifying visitors are served a full-screen iframe overlay impersonating Cloudflare's Just-A-Moment human-verification page (FakeCaptcha / ClickFix). The overlay instructs the victim to open Windows Run (Win+R), paste a clipboard-staged command, and press Enter. (5) The clipboard command pulls a ZIP from attacker infrastructure (update.zip, NotepadPlusPlus.zip), expands it, and executes the bundled installer.dll / NotepadPlusPlus.dll via rundll32 or a .cmd/.js launcher. Observed second-stage payloads include the Electron-packaged UtilifySetup.exe (Inno Setup wrapper) and SuperAppizeSetup.msi, which deploy pay-per-install ad/loader malware (sup.exe, publl.dll).

Threat clustering. XLab tracks at least two distinct clusters operating on overlapping target sets. Cluster A uses domains clo4shara[.]xyz, com-apps[.]cc, platecrumbs[.]com (all serving the same /11z77u3.php cloaking script), with payload-staging on cloud-verification[.]com, jalwat[.]com, and taketwolabs[.]com. Cluster B uses the staticcloudflare[.]pro / script-dev[.]digital / script-dev[.]buzz / updatesecurity[.]pro / updatefilescf[.]top family, all sharing the /api/css.js stage-2 URI pattern and partially resolving to 144.31.236.66. The two clusters have been observed cleaning up each other's injected scripts on shared victims and reinfecting, indicating ongoing competition rather than coordination.

Scale and victims. As of XLab's 2026-05-17 enumeration, 700+ live compromised Ghost sites carried the injected loader, up from 156 sites on 2026-05-10. Named victim sites include Harvard University, Oxford University, Auburn University, and DuckDuckGo. The campaign is opportunistic mass exploitation, not targeted intrusion, and effectively turns each compromised CMS into a watering-hole for visitor-side ClickFix social engineering.

Remediation. Upgrade Ghost CMS to >= 6.19.1 immediately. Because Admin API Keys were almost certainly disclosed on any pre-patch Internet-exposed instance, rotate ALL credentials (Admin API Key, Content API Key, administrator passwords, active sessions) after upgrade. Audit posts, snippets, and themes for injected <script> tags or atob() / btoa(a.origin) patterns and remove them at the database level. Review nginx/access logs for GET /ghost/api/content/posts/ requests containing 'slug:[' and '||' substrings, and for PUT /ghost/api/admin/posts/ requests from unfamiliar IPs.

## MITRE ATT&CK

- T1595 Active Scanning
- T1583 Acquire Infrastructure
- T1608 Stage Capabilities
- T1190 Exploit Public-Facing Application
- T1189 Drive-by Compromise
- T1204 User Execution
- T1059 Command and Scripting Interpreter
- T1505 Server Software Component
- T1098 Account Manipulation
- T1218 System Binary Proxy Execution
- T1027 Obfuscated Files or Information
- T1036 Masquerading
- T1212 Exploitation for Credential Access
- T1552 Unsecured Credentials
- T1082 System Information Discovery
- T1071 Application Layer Protocol
- T1105 Ingress Tool Transfer
- T1573 Encrypted Channel
- T1491 Defacement
- T1553 Subvert Trust Controls
- T1665 Hide Infrastructure
- T1539 Steal Web Session Cookie
- T1555 Credentials from Password Stores
- T1005 Data from Local System
- T1102 Web Service
- T1041 Exfiltration Over C2 Channel
- T1583.001 Domains
- T1584.004 Compromise Infrastructure
- T1608.004 Stage Capabilities
- T1204.004 User Execution
- T1059.001 Command and Scripting Interpreter
- T1059.002 Command and Scripting Interpreter
- T1528 Steal Application Access Token
- T1555.003 Credentials from Password Stores
- T1213 Data from Information Repositories
- T1071.001 Application Layer Protocol
- T1036.005 Masquerading
- T1553.002 Subvert Trust Controls
- T1497.001 Virtualization/Sandbox Evasion

## Sources

- [Ghost CMS SQL injection flaw exploited in large-scale ClickFix campaign](https://www.bleepingcomputer.com/news/security/ghost-cms-sql-injection-flaw-exploited-in-large-scale-clickfix-campaign/)
- [Ghost CMS Mass Compromised via CVE-2026-26980, Now Fueling ClickFix Attacks](https://blog.xlab.qianxin.com/ghost-cms-mass-compromised-via-cve-2026-26980-now-fueling-clickfix-attacks/)
- [CVE-2026-26980 — NVD Detail](https://nvd.nist.gov/vuln/detail/CVE-2026-26980)
- [GHSA-w52v-v783-gw97 — Ghost has a SQL injection in Content API](https://github.com/advisories/GHSA-w52v-v783-gw97)
- [Ghost 6.19.1 release notes](https://github.com/TryGhost/Ghost/releases/tag/v6.19.1)
- [Ghost fix commit 30868d632b2252b638bc8a4c8ebf73964592ed91](https://github.com/TryGhost/Ghost/commit/30868d632b2252b638bc8a4c8ebf73964592ed91)
- [Ghost CMS Content API Blind SQL Injection — SonicWall analysis](https://www.sonicwall.com/blog/ghost-cms-content-api-blind-sql-injection)
- [CVE-2026-26980: Ghost CMS Information Disclosure Flaw — SentinelOne](https://www.sentinelone.com/vulnerability-database/cve-2026-26980/)
- [Ghost CMS Content API SQL Injection — Pentest-Tools exploit DB](https://pentest-tools.com/vulnerabilities-exploits/ghost-cms-content-api-sql-injection_29129)
- [vognik/CVE-2026-26980 — public PoC exploit](https://github.com/vognik/CVE-2026-26980)
- [Ghost.CMS.slug.filter.SQL.Injection — FortiGuard IPS](https://www.fortiguard.com/encyclopedia/ips/60606)

## Full data

Detection queries (Splunk SPL / Microsoft KQL / Sigma) and IOC values require the Threadlinqs MCP server (Purple tier): https://intel.threadlinqs.com/mcp

Canonical: https://intel.threadlinqs.com/threat/TL-2026-0575
