
lighttpd 1.4.85 - عالي - عن بُعد - مسار - Win32 الأصلي GET /..%20/ يقرأ خارج جذر المستند
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · lighttpd-win32-dotdot-space
التقرير: https://abraxaslabs.tech/research/lighttpd-win32-dotdot-space
الفئة: قراءة ملف الوصول: عن بُعد
lighttpd 1.4.85 (4852959) - lighttpd
يقوم _WIN32 الأصلي في staticfile بضم document-root إلى rel_path بعد buffer_path_simplify. لا يقوم Simplify بطي ../ إلا عندما يكون البايت الثالث هو /. يقوم http_response_prepare_physical بإزالة المسافات والنقاط اللاحقة من المسار بأكمله فقط. لذلك يبقى GET /..%20/windows/win.ini على هيئة /.. /windows/win.ini. بعد ذلك، تسمح _wstati64 / _wopen بدون بادئة \\?\ لـ Win32 بإزالة المسافة لكل مكوّن ومعاملة ذلك المقطع على أنه ...
طلب GET/HEAD غير مُصادَق على lighttpd الأصلي على Windows يقرأ ملفًا عاديًا خارج document-root يمكن لحساب العامل فتحه. لا ينطبق هذا على Unix/Linux. قراءة ملف، وليست RCE.
المختبر عبارة عن أداة (gadget) لتلك الدوال المثبَّتة. وهو ليس عامل Win32 أصليًا حيًّا. يستخدم السطر الأخير how=gadget.
| المعرّف | لا يوجد CVE بعد |
| الفئة | قراءة ملف (اجتياز المسار، ..%20/ الأصلي على Win32) |
| الوصول | عن بُعد (GET/HEAD غير مُصادَق) |
| CWE | CWE-22 |
| CVSS | عالٍ: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| المنتج | lighttpd1.4 |
| المتأثر | 1.4.85 (4852959e67ef51ea68084984400d3264b854c97d) _WIN32 الأصلي |
| المصادقة | لا شيء. mod_staticfile الافتراضي |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط، how=gadget |
يتطلب lighttpd أصليًا على Windows يقدّم الملفات الثابتة. يجب أن يكون حساب العامل قادرًا على فتح الملف العادي الهدف.
| الصلاحية | الطريقة / نقطة الوصول | مُثبَت في المختبر أم مُستنتَج |
|---|---|---|
قراءة ملف خارج document-root | GET /..%20/<name> غير مُصادَق | مُثبَت في المختبر (gadget). جسم HTTP 200 هو السرّ في المجلد الأب |
نفس الفئة لمسافة/نقطة ASCII لاحقة أخرى على مكوّن .. غير نهائي | فك ترميز url ثم simplify يُبقي .. | مُثبَت في المختبر لـ %20. مُستنتَج للمسافة/النقطة اللاحقة الأخرى |
| HEAD على نفس المسار | staticfile HEAD | مُستنتَج. استخدم المختبر GET |
سلبي: /../ حقيقي | buffer_path_simplify يطوي ../ | مُثبَت في المختبر. 404، مسار مبسَّط /windows/win.ini، لا دليل |
| سلبي: فتح Unix POSIX للسلسلة الفيزيائية غير المبسَّطة | open("/srv/htdocs/.. /windows/win.ini") | مُثبَت في المختبر. ENOENT |
مغلق على هذه البقايا: staticfile على Unix/Linux؛ Cygwin (نفس الإزالة، فتح POSIX)؛ %5C parseopt في 1.4.85؛ اسم CVE-2018-19052 المستعار؛ CVE-2014-2324 Host. ليست RCE. وليست كتابة.
ثبّتُ الوسم lighttpd-1.4.85. عشرون عملية بحث. staticfile الافتراضي على Unix/Linux، وFastCGI، والوكيل (proxy)، وTLS، والمصادقة، وHTTP/2، وalias/rewrite: لا شيء عند هذا المستوى. موجة المحلّل في 1.4.81-1.4.85 أغلقت بالفعل trailers، وتعارضات ترويسة CGI، وContent-Length الخلفي غير الصالح.
يطوي buffer_path_simplify فقط ../ عندما يكون walk[2] == '/'. إزالة WIN32 في http_response_prepare_physical (src/response.c 334-360) هي ذيل المسار بأكمله. تمرّر _wstati64 / _wopen (src/fs_win32.c 24-77) UTF-16 بدون \\?\، لذا يزيل Win32 المسافات اللاحقة لكل مكوّن ويصبح .. هو ... الضم الفيزيائي هو doc_root + rel_path دون فحص basedir بعد stat.
المسارات الخاطئة المسجّلة مسبقًا: اعتبار Unix ENOENT على أنه "ليس خطأً" (فهو الضابط السلبي)؛ ووصف Cygwin بأنه Win32 أصلي؛ والادعاء بأن %5C في 1.4.85 هو من هذا المخلف؛ وتضخيم قراءة الملف إلى RCE. المسرح: صدفة عكسية. أوراكل هو جسم 200 من أصل document-root.
python3 lighttpd-win32-dotdot-space-Abraxas-Labs.py
أو
cd lab
./run.sh
المختبر هو محاكاة أمينة لـ buffer_urldecode_path وbuffer_path_simplify (خريطة '\\' في Win32)، وإزالة الذيل في response.c، و_wstati64 بدون \\?\. فتح Unix POSIX هو الضابط السلبي. يُنفَّذ حل Win32 على أنه نفس إزالة المسافات اللاحقة لكل مكوّن، ثم . / ..، ثم فتح POSIX للمسار المحلول. HTTP عبر الاسترجاع المحلي 127.0.0.1:19400.
/index.html -> 200 public-index، دون شاهد./../windows/win.ini -> 404، مبسَّط إلى /windows/win.ini./..%20/windows/win.ini -> مفكوك إلى /.. /windows/win.ini، أبقى التبسيط على المسافة، Unix ENOENT، حلّ Win32 إلى /srv/windows/win.ini، 200 شاهد.SUCCESS lighttpd-win32-dotdot-space how=gadget win32-get=200 unix-open=enoent simplify-kept-dotdot-space=yes LIGHTTPD-WIN32-DOTDOT-SPACE-WITNESS
أزل المسافات والنقاط اللاحقة لكل مكوّن من مكوّنات المسار قبل simplify، أو ابدأ عمليات فتح Win32 بـ \\?\ وارفض أي مسار فعلي لا يبقى ضمن document-root.
4852959e67ef51ea68084984400d3264b854c97d)src/buffer.c · src/response.c · src/fs_win32.c%5C parseopt · CVE-2018-19052 alias · CVE-2014-2324 HostGNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.