
lighttpd 1.4.85 - عالي - عن بُعد - مسار - Win32 الأصلي GET /..%20/ يقرأ خارج جذر المستند
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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. قراءة ملف، وليس تنفيذ كود عن بُعد.
المختبر عبارة عن أداة محاكاة لتلك الدوال المثبّتة. إنه ليس عامل 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> غير مُصادَق عليه | مُثبت مختبريًا (أداة محاكاة). جسم 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 alias؛ CVE-2014-2324 Host. ليس RCE. ليس كتابة.
ثبّتت الوسم lighttpd-1.4.85. عشرون عملية بحث. staticfile الافتراضي في Unix/Linux، FastCGI، proxy، TLS، auth، 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. مسرحية: reverse shell. الأوراكل هو جسم 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 عبر loopback على 127.0.0.1:19400.
/index.html -> 200 public-index، لا شاهد./../windows/win.ini -> 404، مبسّط إلى /windows/win.ini./..%20/windows/win.ini -> مفكوك الترميز /.. /windows/win.ini، احتفظ simplify بالمسافة، 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 في 1.4.85 · CVE-2018-19052 alias · CVE-2014-2324 HostGNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. لا ضمان.