6.3 Zranitelnosti nahrávání souborů (File Upload)
Nahrávání souborů na server představuje kritický bod infrastruktury, se kterým je spojeno mnoho bezpečnostních problémů. Pokud je server špatně nastaven, může útočník obejít validace přípon, nahrát spustitelné skripty (malware) a docílit až kompromitace systému.
multipart/form-data
Obyčejné HTTP formuláře využívají k odeslání dat typ
application/x-www-form-urlencoded (textové parametry a hodnoty). Pro podporu nahrávání binárních souborů se používá strukturovanější formát multipart/form-data. Součástí hlavičky požadavku je pak i oddělovač (boundary), např. boundary=xxx, který slouží k oddělení jednotlivých souborů a formulářových polí a neměl by se objevovat v samotném obsahu nahrávaných dat.Metody obejití validace (Bypass)
Pokud webová aplikace omezuje (či se o to snaží) povolené přípony nahraných souborů (např. pouze .jpg nebo .png), existují cesty, jak taková omezení oklamat:
- Zřetězené přípony: U méně bezpečně navržených regulárních výrazů lze připojit dvojí příponu jako
file.jpg.php. - Null byte injection: Vložení znaku
%00(null byte). Systém uřízne zbytek názvu (např. ushell.php%00.jpgdojde k uložení pod názvemshell.php, i když prošel validátorem koncovky.jpg). - Unicode znaky (Right-to-Left Override): Použití znaku
U+202E(RLO) převrátí směr textu. Název se tak pro kontrolní logiku jeví jako validní přípona (např..jpg), ale filesystém to interptetuje odlišně (např. jako.php).
Základní (Generic) testy zranitelnosti uploadu
Při penetračním testu file uploadu zkoušíme řadu přístupů:
- Stored XSS: Uvedení payloadu přímo v názvu souboru nebo do jeho obsahu (např.
<script>alert(1)</script>.jpg). - Path Traversal: Skok do jiných složek (např. přepsáním cesty na
../../../../../webapps/root/rce.jsp). Toto je běžné třeba na serverech Apache Tomcat. - Spustitelné soubory: Nahrání malwaru, jako
.exenebo.cmd, pro případnou spuštění na Windows serveru. - Ověření antiviru: Lze nahrát známý bezpečný "virus" jako EICAR string v podobě
eicar.pdf, za účelem zjištění, zdali infrastruktura soubory skenuje. Pozor ale na uložení payloadu do nečekaných míst (jako HTTP hlavičky), kdy může být celá request-odezva WAF filtrem zakázána.
Obrana proti zranitelnostem File Upload
Správná ochrana File Upload
- Validace: Kontrola názvu souboru, přípony, MIME typu i obsahu proti whitelistu povolených formátů (např.
jpg, jpeg, gif). - Omezení velikosti: Nastavení maximální velikosti a délky jména souboru.
- Přejmenování: Změna jména na pseudonáhodnou hodnotu vygenerovanou na straně serveru.
- Skener: Provádění antivirových skenů na všech přijímaných souborech od uživatelů.
- Stahování místo zobrazování: Při vracení souboru uživatelům využívat
Content-Disposition: attachment; filename="..."k zamezení renderování zranitelných souborů (např. HTML či SVG) prohlížečem, nebo využívat extrémně striktní hlavičku Content Security Policy (CSP) pro endpoint zabezpečující upload/stahování.
Zranitelnosti archivů a komplexních formátů
Kromě jednoduchých souborů se rizika nabalují u formátů jako ZIP nebo CSV:
- Zip of Death (ZOD) / Decompression bomb: Vytvořený malý ZIP archiv (např. 42 KB) po rozbalení naroste do obří velikosti (např. 4.5 petabajtů), což vytvoří na serveru Denial of Service.
- Vložení symbolických odkazů (Symlink) a zranitelnosti v cestách (Path Traversal): Vytvořením komprimované složky s relativními cestami lze donutit server zapsat shell na citlivá místa nebo číst systémové soubory (jako je
/etc/passwd). - Polygloty: Soubory zkonstruované tak, aby byly validní pro více formátů (například jako PHP kód a současně jako JPG). Tím obelstí jednoduchou validaci obsahu souboru (čtení hlaviček/magických čísel).
- CSV Formula Injection: Jakmile server zpracovává CSV se vzorci v Excelu/Google Sheets (ať už server-side rendering či na straně oběti), hrozí spuštění makra, exfiltrace dat (přes funkci IMPORTXML) či Command Execution.