tom@home.htb:~$

Blog o HTB

8 November 2020

Nebezpečné uploady: polygloty, WAR deploy a plugin upload

Úvod a kontext

Upload je jedna z nejzrádnějších funkcí v celé webové bezpečnosti. Na první pohled vypadá jednoduše: uživatel pošle soubor, aplikace ho uloží a hotovo. Ve skutečnosti ale upload skoro nikdy nekončí uložením. Soubor se někde pojmenuje, přesune, zobrazí, rozbalí, přečte plugin loader, zpracuje aplikační server nebo obslouží CMS administrace. Právě v tom se skrývá skutečné riziko.

Proto nedává smysl mluvit o uploadu jen jako o “nahrání shellu”. Nebezpečný upload má několik odlišných podob: filtrační bypass přes polyglot nebo dvojitou příponu, legitimní deployment rozhraní typu WAR upload v Tomcatu a plugin nebo theme mechanizmy, které samy slouží k nahrání a spuštění kódu. Všechny vedou k RCE, ale každá jiným způsobem a vyžaduje jinou obranu.

Co přesně je na uploadu nebezpečné

Upload nebývá problém ve chvíli, kdy server přijme bajty. Problém vzniká ve chvíli, kdy aplikace:

Jinými slovy: riziko uploadu je vždy kombinací tří otázek:

  1. Co server přijme?
  2. Kam to uloží?
  3. Kdo a jak to později zpracuje?

Varianta 1: polyglot a obcházení validační logiky

Nejznámější upload pattern je ten, kdy aplikace věří koncovce, MIME typu nebo povrchní kontrole obsahu, ale uloží soubor do místa, kde se může vykonat.

Typický scénář:

To může vypadat třeba jako:

V takovém řetězci nebývá největší chyba v tom, že validace není perfektní. Největší chyba je v tom, že se uživatelský upload ukládá tam, kde jeho pozdější interpretace znamená spuštění kódu.

Varianta 2: upload jako legitimní deploy rozhraní

Jiná situace nastává tam, kde nahrání souboru není bezpečnostní omyl, ale zamýšlená funkce. Typickým příkladem je aplikační server nebo administrační rozhraní, které dovoluje deploy aplikace.

Tomcat Manager je učebnicový případ:

To technicky není “bypass upload filtru”. Je to správcovská funkce, která sama představuje deployment kanál. Bezpečnostní problém vzniká ve chvíli, kdy:

Upload tedy není zranitelnost v klasickém smyslu. Je to přímý RCE endpoint, který byl špatně zpřístupněný.

Varianta 3: plugin, theme nebo modul jako oficiální cesta ke kódu

CMS a blogovací systémy často dovolují do administrace nahrát:

Tady je zásadní rozdíl oproti polyglotu. Útočník neobchází ochranu tím, že soubor vydává za něco jiného. On využívá fakt, že administrace sama nabízí cestu, jak dostat na server kód nebo soubor, který se později vykoná.

Prakticky se to láme ve dvou bodech:

Jakmile se tyto dvě věci potkají špatně, stává se z admin uploadu nejkratší cesta k shellu.

Jak tenhle vzorec vypadal v různých případech

Na jednom hostu upload přijímal obrázek dostatečně povrchně na to, aby prošel soubor s vloženým PHP payloadem a dvojitou příponou. Rozhodující nebyla “kreativita payloadu”, ale fakt, že server nahraný soubor obsloužil z vykonatelného webového prostoru.

Jinde byl celý řetězec ještě přímočařejší: veřejně dostupný Tomcat Manager chránilo slabé heslo a samotná administrace umožnila nahrát WAR. Tam už nešlo o obcházení filtru. Šlo o to, že deployment rozhraní bylo fakticky otevřeným RCE kanálem.

U další dvojice případů byl problém v tom, že blogovací nebo CMS administrace sama dovolovala nahrát soubor, plugin nebo obrázek způsobem, který vedl ke spuštění kódu. Jakmile se podařilo získat přístup do adminu, upload už nebyl omezením. Byl právě tou oficiální funkcí, přes kterou se na host dostal payload.

Proč je chyba často jinde než v validaci

Upload review se často smrskne na otázku:

To je důležité, ale samo o sobě nestačí. Ve skutečnosti jsou stejně podstatné tyto otázky:

Právě tady se rozhoduje, jestli chyba skončí jako neškodný obsahový problém, nebo jako plnohodnotné RCE.

Co při analýze ověřovat

Kam se upload ukládá

Kdo upload později interpretuje

Jak silná je skutečná kontrola typu

Kdo smí nahrávat

U deploy a plugin cest je tohle klíčové. I “autentizovaný upload” je často jen jinak pojmenované RCE, pokud je admin účet dosažitelný nebo špatně chráněný.

Obrana a bezpečnější návrh

1. Upload ukládat mimo vykonatelný prostor

Pokud nahraný soubor není určený k vykonání, nemá ležet tam, kde ho může interpretovat PHP, JSP nebo jiná runtime vrstva.

2. Rekonvertovat, ne jen kontrolovat

U obrázků a podobných formátů je bezpečnější obsah znovu vyrenderovat nebo převést do bezpečného výstupu, než spoléhat na to, že validátor rozpozná každý škodlivý trik.

3. Přísně oddělit upload obsahu od deploymentu kódu

Plugin upload, WAR deploy nebo instalace modulu jsou z principu vysoce citlivé funkce. Nemají být dostupné na veřejném rozhraní bez silné autentizace, víceúrovňového schválení a síťového omezení.

4. CMS administraci chápat jako code-execution hranici

Jestli administrace dovoluje nahrát plugin, theme nebo skript, nejde o obyčejný backoffice. Jde o rozhraní, které samo rozhoduje o spuštění kódu na serveru.

5. Minimalizovat práva procesu, který uploady obsluhuje

I při kompromitaci uploadu má rozhodovat, s jakými právy běží cílový proces. Pokud webserver nebo aplikační server běží příliš vysoko, zkracuje se celá cesta k plnému kompromisu.

Shrnutí klíčových poznatků

Co si odnést do praxe

tags: upload - web - cms - tomcat - files