PHP web shell: čo to je a ako sa mu na vlastnom serveri ubrániť
Jeden nenápadný súbor nahraný na server dá útočníkovi plnú kontrolu — a často o ňom mesiace nikto nevie. O tom, čo to je, ako sa tam dostane a čím sa tomu dá predísť.
Web shell je jeden súbor, ktorý útočníkovi premení váš server na server, ktorý ovláda on. Nie je to prielom do operačného systému ani nič exotické — je to obyčajný skript, ktorý sa tvári ako súčasť vašej aplikácie a potichu počúva príkazy zvonku.
Tento článok vysvetľuje, čo to je a ako sa pred tým chrániť. Zámerne neobsahuje kód takého skriptu ani návod, ako ho prispôsobiť alebo skryť pred antivírusom — to by bola príručka pre útočníka. Zaujíma nás opačná strana: ako zariadiť, aby sa k vám taký súbor nedostal, a ako ho rýchlo odhaliť, ak sa dostane.
Čo je PHP web shell
PHP je jazyk, v ktorom beží veľká časť webu — od redakčných systémov po e-shopy. Server berie PHP súbory ako pokyny na vykonanie: keď naň pošle prehliadač požiadavku, server súbor spustí a vráti výsledok. To je úplne normálne a takto funguje každá PHP stránka.
Web shell túto vlastnosť zneužíva. Je to PHP súbor, ktorý nie je súčasťou vašej aplikácie — prepašoval ho tam niekto cudzí — a jeho jediná úloha je prijať príkaz z internetu a nechať ho server vykonať. Vo výsledku má útočník to isté, ako keby sedel pri vašom serveri: vidí súbory, číta databázu, sťahuje dáta, pridáva ďalšie skripty.
Prečo práve „shell": v IT je shell rozhranie, cez ktoré človek zadáva počítaču príkazy. Web shell je presne to, len dostupné cez webovú adresu — a dostupné komukoľvek, kto pozná tú adresu.
Na pohľad býva nenápadný. Môže to byť súbor s menom, ktoré vyzerá ako zvyšok systému, uložený medzi stovkami legitímnych súborov. Práve preto je nebezpečný: nič nespadne, nič sa nerozbije, stránka beží ďalej úplne normálne.
Čo dokáže a ako sa vôbec dostane na server
Dopad a cesta dnu sú dve rôzne veci a obe treba poznať, aby dávalo zmysel, ako sa bránime.
Čo s ním útočník dokáže
Keď web shell raz beží, hranicou je to, k čomu má prístup používateľ, pod ktorým beží web. V praxi to býva dosť na to, aby útočník čítal a menil súbory aplikácie, dostal sa k prístupovým údajom do databázy uloženým v konfigurácii, stiahol osobné údaje zákazníkov, rozposielal z vášho servera spam alebo nasadil ďalší kód, ktorý presmeruje návštevníkov alebo ťaží kryptomenu. Server pritom navonok funguje — a to je presne cieľ.
Ako sa tam dostane
Nevzniká zo vzduchu. Takmer vždy prejde jednou z mála obyčajných dverí:
- Nahrávanie súborov, ktoré dôveruje tomu, čo dostane. Formulár na nahratie fotky, ktorý v skutočnosti prijme a uloží aj PHP súbor, je najčastejšia cesta. Problém nie je v nahrávaní, ale v tom, že sa nahraný súbor dá následne spustiť.
- Stará závislosť so známou zraniteľnosťou. Neaktualizovaný plugin, knižnica alebo verzia systému, pre ktorú už existuje verejne známy spôsob, ako cez ňu súbor podstrčiť.
- Odcudzené alebo slabé prístupy. Uniknuté heslo do administrácie, na FTP alebo do správcovského rozhrania — vtedy útočník súbor jednoducho nahrá ako „oprávnený" používateľ.
- Zdieľaný server so slabým susedom. Na lacnom hostingu, kde beží veľa webov vedľa seba, môže prielom do cudzieho webu otvoriť cestu aj k vášmu.
Spoločné je, že žiadna z tých dverí nie je útok na PHP ako také. Sú to bežné prevádzkové zanedbania — a práve preto sa dajú zavrieť vopred.
Prečo o ňom nikto dlho nevie
Web shell nerobí hluk. Stránka nepadá, zákazníci si nič nevšimnú, v bežných reportoch sa nič nezmení. Kým niekto necielene nehľadá súbor, ktorý tam nepatrí, alebo si nevšimne nezvyčajnú aktivitu, shell môže čakať mesiace. Preto obrana nemôže stáť na tom, že „by sme si to všimli".
Ako sa mu bránime my a ako pomôžeme vám
Web shell nie je problém, ktorý sa rieši jedným antivírusom na konci. Rieši sa rozhodnutiami pri návrhu — tými istými, o ktorých je bezpečnosť v návrhu — a potom tým, že server vie povedať, keď sa niečo zmenilo.
Pri stavbe riešenia to znamená niekoľko konkrétnych vecí. Nahrané súbory ukladáme mimo priestor, z ktorého server čokoľvek spúšťa, takže ani podstrčený PHP súbor nemá ako „ožiť". Overujeme, čo smie prísť, podľa zoznamu povoleného, nie podľa prípony v názve. Web beží s najmenšími potrebnými oprávneniami, oddelene od iných projektov, aby prípadný prielom nemal kam expandovať. A závislosti držíme aktuálne, pretože väčšina ciest dnu vedie cez niečo, pre čo oprava už dávno existuje.
Druhá polovica je viditeľnosť. Sledujeme integritu súborov — server vie, ktoré súbory k aplikácii patria, takže nový, ktorý tam nemá čo robiť, sa dá zachytiť, a nie až keď napácha škodu. Citlivé operácie a prístupy idú do oddeleného auditného záznamu, ktorý sa nedá prepísať zvnútra aplikácie.
A keď sa niečo nájde, poradie je dané: najprv zastaviť škodu a zachovať dôkazy, potom zrotovať všetky prístupy, ktoré sa mohli dostať von, až potom čistiť — a nakoniec zavrieť tie dvere, ktorými sa to dostalo dnu, aby sa to nezopakovalo.
Ak preberáte systém po niekom inom, prevádzkujete web, pri ktorom by únik dát bolel, alebo máte len podozrenie, že na serveri je niečo, čo tam nepatrí, ozvite sa — prejdeme to a povieme, na čom ste. Viac o tejto oblasti je na stránke služieb.
Riešite niečo podobné vo vašej firme?
Chcem nezáväznú konzultáciu