MightCore
Zpět na blog
Návody22. října 20267 min čtení

PHP web shell: co to je a jak se mu na vlastním serveru ubránit

Jeden nenápadný soubor nahraný na server dá útočníkovi plnou kontrolu — a často o něm měsíce nikdo neví. O tom, co to je, jak se tam dostane a čím se tomu dá předejít.

Web shell je jeden soubor, který útočníkovi promění váš server na server, který ovládá on. Není to průnik do operačního systému ani nic exotického — je to obyčejný skript, který se tváří jako součást vaší aplikace a potichu naslouchá příkazům zvenčí.

Tento článek vysvětluje, co to je a jak se před tím chránit. Záměrně neobsahuje kód takového skriptu ani návod, jak ho upravit nebo skrýt před antivirem — to by byla příručka pro útočníka. Zajímá nás opačná strana: jak zařídit, aby se k vám takový soubor nedostal, a jak ho rychle odhalit, pokud se dostane.

Co je PHP web shell

PHP je jazyk, ve kterém běží velká část webu — od redakčních systémů po e-shopy. Server bere PHP soubory jako pokyny k vykonání: když na něj pošle prohlížeč požadavek, server soubor spustí a vrátí výsledek. To je úplně normální a takto funguje každá PHP stránka.

Web shell tuto vlastnost zneužívá. Je to PHP soubor, který není součástí vaší aplikace — propašoval ho tam někdo cizí — a jeho jediný úkol je přijmout příkaz z internetu a nechat ho server vykonat. Ve výsledku má útočník totéž, jako by seděl u vašeho serveru: vidí soubory, čte databázi, stahuje data, přidává další skripty.

Proč zrovna „shell": v IT je shell rozhraní, přes které člověk zadává počítači příkazy. Web shell je přesně to, jen dostupné přes webovou adresu — a dostupné komukoli, kdo tu adresu zná.

Na pohled bývá nenápadný. Může to být soubor se jménem, které vypadá jako zbytek systému, uložený mezi stovkami legitimních souborů. Právě proto je nebezpečný: nic nespadne, nic se nerozbije, stránka běží dál úplně normálně.

Co dokáže a jak se vůbec dostane na server

Dopad a cesta dovnitř jsou dvě různé věci a obě je potřeba znát, aby dávalo smysl, jak se bráníme.

Co s ním útočník dokáže

Když web shell jednou běží, hranicí je to, k čemu má přístup uživatel, pod kterým běží web. V praxi to bývá dost na to, aby útočník četl a měnil soubory aplikace, dostal se k přístupovým údajům do databáze uloženým v konfiguraci, stáhl osobní údaje zákazníků, rozesílal z vašeho serveru spam nebo nasadil další kód, který přesměruje návštěvníky nebo těží kryptoměnu. Server přitom navenek funguje — a to je přesně cíl.

Jak se tam dostane

Nevzniká ze vzduchu. Téměř vždy projde jedněmi z mála obyčejných dveří:

  • Nahrávání souborů, které důvěřuje tomu, co dostane. Formulář na nahrání fotky, který ve skutečnosti přijme a uloží i PHP soubor, je nejčastější cesta. Problém není v nahrávání, ale v tom, že se nahraný soubor dá následně spustit.
  • Stará závislost se známou zranitelností. Neaktualizovaný plugin, knihovna nebo verze systému, pro kterou už existuje veřejně známý způsob, jak přes ni soubor podstrčit.
  • Odcizené nebo slabé přístupy. Uniklé heslo do administrace, na FTP nebo do správcovského rozhraní — tehdy útočník soubor jednoduše nahraje jako „oprávněný" uživatel.
  • Sdílený server se slabým sousedem. Na levném hostingu, kde běží mnoho webů vedle sebe, může průnik do cizího webu otevřít cestu i k vašemu.

Společné je, že žádné z těch dveří nejsou útok na PHP jako takové. Jsou to běžná provozní zanedbání — a právě proto se dají zavřít předem.

Proč o něm nikdo dlouho neví

Web shell nedělá hluk. Stránka nepadá, zákazníci si ničeho nevšimnou, v běžných reportech se nic nezmění. Dokud někdo cíleně nehledá soubor, který tam nepatří, nebo si nevšimne nezvyklé aktivity, shell může čekat měsíce. Proto obrana nemůže stát na tom, že „bychom si toho všimli".

Jak se mu bráníme my a jak pomůžeme vám

Web shell není problém, který se řeší jedním antivirem na konci. Řeší se rozhodnutími při návrhu — těmi samými, o kterých je bezpečnost v návrhu — a potom tím, že server umí říct, když se něco změnilo.

Při stavbě řešení to znamená několik konkrétních věcí. Nahrané soubory ukládáme mimo prostor, ze kterého server cokoli spouští, takže ani podstrčený PHP soubor nemá jak „ožít". Ověřujeme, co smí přijít, podle seznamu povoleného, ne podle přípony v názvu. Web běží s nejmenšími potřebnými oprávněními, odděleně od jiných projektů, aby případný průnik neměl kam expandovat. A závislosti držíme aktuální, protože většina cest dovnitř vede přes něco, pro co oprava už dávno existuje.

Druhá polovina je viditelnost. Sledujeme integritu souborů — server ví, které soubory k aplikaci patří, takže nový, který tam nemá co dělat, se dá zachytit, a ne až když napáchá škodu. Citlivé operace a přístupy jdou do odděleného auditního záznamu, který nejde přepsat zevnitř aplikace.

A když se něco najde, pořadí je dané: nejdřív zastavit škodu a zachovat důkazy, potom zrotovat všechny přístupy, které se mohly dostat ven, teprve potom čistit — a nakonec zavřít ty dveře, kterými se to dostalo dovnitř, aby se to neopakovalo.

Pokud přebíráte systém po někom jiném, provozujete web, u kterého by únik dat bolel, nebo máte jen podezření, že na serveru je něco, co tam nepatří, ozvěte se — projdeme to a řekneme, na čem jste. Víc o této oblasti je na stránce služeb.

Řešíte něco podobného ve vaší firmě?

Chci nezávaznou konzultaci

15minutový úvod

Nejste si jistí? Pojďme si promluvit.

Nerozumíte něčemu nebo nevíte, kde začít? Domluvte si krátký 15minutový úvod do problematiky — vše vám zdarma a nezávazně vysvětlíme.

Rezervovat 15min hovor