
lighttpd 1.4.85 - Alto - Remoto - Percorso - Win32 nativo GET /..%20/ legge al di fuori della document-root
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · lighttpd-win32-dotdot-space
Classe: Lettura di file Reach: Remoto
lighttpd 1.4.85 (4852959) - lighttpd
Il _WIN32 nativo di staticfile unisce document-root a rel_path dopo buffer_path_simplify. Simplify ripiega ../ solo quando il terzo byte è /. http_response_prepare_physical rimuove spazi e punti finali dal percorso intero soltanto. GET /..%20/windows/win.ini rimane quindi /.. /windows/win.ini. _wstati64 / _wopen senza prefisso \\?\ lasciano poi che Win32 rimuova lo spazio per componente e tratti quel segmento come ...
GET/HEAD non autenticato su lighttpd nativo Windows legge un file regolare al di fuori di document-root che l'account del worker può aprire. Unix/Linux non è questo residuo. Lettura di file, non RCE.
Il lab è un gadget di quelle funzioni di pin. Non è un worker Win32 nativo live. L'ultima riga usa how=gadget.
| ID | nessuna CVE al momento |
| Classe | Lettura di file (path traversal, ..%20/ nativo Win32) |
| Reach | Remoto (GET/HEAD non autenticato) |
| CWE | CWE-22 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Prodotto | lighttpd1.4 |
| Affetto | 1.4.85 (4852959e67ef51ea68084984400d3264b854c97d) _WIN32 nativo |
| Auth | nessuna. mod_staticfile predefinito |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1, how=gadget |
Richiede lighttpd nativo Windows che serve file statici. L'account del worker deve poter aprire il file regolare di destinazione.
| Privilegio | Metodo / sink | Provato in lab o dedotto |
|---|---|---|
Leggere un file al di fuori di document-root | GET /..%20/<name> non autenticato | Provato in lab (gadget). Il corpo HTTP 200 è il segreto genitore |
Stessa classe per altri spazi/punti ASCII finali su una componente .. non finale | url-decode poi simplify mantiene .. | Provato in lab per %20. Dedotto per altri spazi/punti finali |
| HEAD sullo stesso percorso | staticfile HEAD | Dedotto. Il lab ha usato GET |
Negativo: /../ reale | buffer_path_simplify ripiega ../ | Provato in lab. 404, /windows/win.ini semplificato, nessun witness |
| Negativo: open POSIX Unix della stringa fisica non semplificata | open("/srv/htdocs/.. /windows/win.ini") | Provato in lab. ENOENT |
Chiuso su questo residuo: staticfile Unix/Linux; Cygwin (stessa rimozione, open POSIX); %5C parseopt di 1.4.85; alias CVE-2018-19052; Host CVE-2014-2324. Non RCE. Non una scrittura.
Ho fissato il tag lighttpd-1.4.85. Venti ricerche. staticfile Unix/Linux predefinito, FastCGI, proxy, TLS, auth, HTTP/2, alias/rewrite: nulla a questo livello. L'ondata di parser 1.4.81-1.4.85 aveva già chiuso trailers, conflitti di header CGI e Content-Length di backend non valido.
buffer_path_simplify ripiega ../ solo quando walk[2] == '/'. La rimozione WIN32 in http_response_prepare_physical (src/response.c 334-360) è la coda dell'intero percorso. _wstati64 / _wopen (src/fs_win32.c 24-77) passano UTF-16 senza \\?\, quindi Win32 rimuove gli spazi finali per componente e .. diventa ... Il join fisico è doc_root + rel_path senza controllo basedir post-stat.
Vicoli ciechi già registrati: trattare ENOENT Unix come "non un bug" (è il controllo negativo); chiamare Cygwin Win32 nativo; affermare che %5C di 1.4.85 è questo residuo; gonfiare la lettura di file a RCE. Teatro: una reverse shell. L'oracolo è un corpo 200 dal genitore di document-root.
python3 lighttpd-win32-dotdot-space-Abraxas-Labs.py
oppure
cd lab
./run.sh
Il lab è un gadget fedele di buffer_urldecode_path, buffer_path_simplify (mappa '\\' Win32), la rimozione della coda in response.c, e _wstati64 senza \\?\. L'open POSIX Unix è il controllo negativo. La risoluzione Win32 è implementata come la stessa rimozione di spazi finali per componente, poi . / .., poi un open POSIX del percorso risolto. HTTP su loopback 127.0.0.1:19400.
/index.html -> 200 public-index, nessun witness./../windows/win.ini -> 404, /windows/win.ini semplificato./..%20/windows/win.ini -> decodificato /.. /windows/win.ini, simplify ha mantenuto lo spazio, ENOENT Unix, Win32 ha risolto /srv/windows/win.ini, 200 witness.SUCCESS lighttpd-win32-dotdot-space how=gadget win32-get=200 unix-open=enoent simplify-kept-dotdot-space=yes LIGHTTPD-WIN32-DOTDOT-SPACE-WITNESS
Rimuovere spazi e punti finali per componente di percorso prima di simplify, oppure prefissare gli open Win32 con \\?\ e rifiutare un percorso fisico che non rimane sotto document-root.
4852959e67ef51ea68084984400d3264b854c97d)src/buffer.c · src/response.c · src/fs_win32.c%5C parseopt 1.4.85 · alias CVE-2018-19052 · Host CVE-2014-2324GNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.