
lighttpd 1.4.85 — высокий уровень — удалённый — путь — нативный Win32 GET /..%20/ читает за пределами document-root
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 на нативном Windows lighttpd читает обычный файл за пределами document-root, который может открыть учётная запись worker. Unix/Linux — это не данный остаток. Чтение файлов, не RCE.
Лаборатория — это гаджет этих pin-функций. Это не живой нативный Win32 worker. Последняя строка использует how=gadget.
| ID | CVE пока нет |
| Класс | Чтение файлов (обход пути, нативный Win32 ..%20/) |
| Доступ | Удалённый (неаутентифицированный 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 |
Требуется нативный Windows lighttpd, обслуживающий статические файлы. Учётная запись worker должна иметь возможность открыть целевой обычный файл.
| Привилегия | Метод / sink | Доказано в лаборатории или выведено |
|---|---|---|
Чтение файла за пределами document-root | Неаутентифицированный GET /..%20/<name> | Доказано в лаборатории (гаджет). Тело HTTP 200 — это секрет родительского каталога |
Тот же класс для другого завершающего ASCII-пробела/точки в неконечном компоненте .. | url-decode, затем simplify сохраняет .. | Доказано в лаборатории для %20. Выведено для другого завершающего пробела/точки |
| HEAD по тому же пути | staticfile HEAD | Выведено. В лаборатории использовался GET |
Отрицательный: настоящий /../ | buffer_path_simplify сворачивает ../ | Доказано в лаборатории. 404, упрощённый /windows/win.ini, без свидетеля |
| Отрицательный: Unix POSIX open несокращённой физической строки | open("/srv/htdocs/.. /windows/win.ini") | Доказано в лаборатории. ENOENT |
Закрыто для данного остатка: Unix/Linux staticfile; Cygwin (тот же strip, POSIX open); 1.4.85 %5C parseopt; CVE-2018-19052 alias; CVE-2014-2324 Host. Не RCE. Не запись.
Я зафиксировал тег lighttpd-1.4.85. Двадцать поисков. Стандартный Unix/Linux staticfile, FastCGI, proxy, TLS, auth, HTTP/2, alias/rewrite: ничего на этом уровне. Волна парсера 1.4.81-1.4.85 уже закрыла trailers, конфликты заголовков CGI и некорректный Content-Length бэкенда.
buffer_path_simplify сворачивает ../ только когда walk[2] == '/'. WIN32 strip в 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; утверждение, что 1.4.85 %5C — это данный остаток; раздувание чтения файлов до 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-отображение '\\'), хвостового strip в response.c и _wstati64 без \\?\. Unix POSIX open — отрицательный контроль. Win32 resolve реализован как тот же покомпонентный strip завершающих пробелов, затем . / .., затем POSIX open разрешённого пути. Loopback 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, 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 · CVE-2018-19052 alias · CVE-2014-2324 HostGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.