A webes sérülékenységek közül az XSS (Cross-Site Scripting) és a Command Injection két olyan típus, amelyek mindegyike a felhasználói bemenet manipulációjára épít. Bár mindkettő a nem megfelelően ellenőrzött inputok kihasználásán alapul, célpontjuk és hatásuk jelentősen eltérő. Az XSS egy kliensoldali támadás, amely a böngészőben végrehajtott kódokkal célozza meg az áldozatot, míg a Command Injection szerveroldali támadás, amely közvetlenül a webalkalmazás szerverére hat. A következőkben részletesen megvizsgáljuk, hogyan működnek ezek a sérülékenységek és mi az alapvető különbség közöttük.
Az XSS-támadás során a támadó rosszindulatú JavaScript kódot injektál egy weboldalba, amelyet a böngésző hajt végre, amikor a felhasználó meglátogatja az oldalt. Ezzel a támadó számos dolgot végrehajthat a felhasználó böngészőjében, például ellophatja annak cookie-jait, manipulálhatja a weboldalt vagy hamis beviteli űrlapokat hozhat létre, amelyek phishing támadásokat segíthetnek elő. Az XSS-támadásnak több típusa létezik, beleértve a stored (tárolt), reflected (reflektált) és DOM-alapú (Document Object Model) változatokat. A tárolt XSS akkor fordul elő, amikor a támadó rosszindulatú kódot ad be, amelyet a webalkalmazás eltárol a szerveren, így később bárki, aki a sérült oldalt meglátogatja, végrehajthatja azt. A reflektált XSS a felhasználó által beírt adatot azonnal visszajuttatja a böngészőbe, ha a felhasználó egy speciális linkre kattint. A DOM-alapú XSS pedig akkor történik, amikor a JavaScript manipulálja a weboldal DOM-ot, – vagyis azt az interfészt, amely lehetővé teszi a programok és szkriptek számára, hogy dinamikusan hozzáférjenek egy dokumentum tartalmához, szerkezetéhez és stílusához, és frissítsék azt – hogy végrehajtsa a támadó által injektált kódot.

Kép forrása: PortSwigger
A leggyakoribb sérülékeny pontok az XSS-támadásokkal kapcsolatban azok a beviteli mezők, amelyeket nem megfelelően ellenőriznek, és amelyek kimeneti szűrés nélkül jelenítik meg a felhasználói adatokat. Ilyen lehet például egy keresési mező vagy egy kommentszekció. Ha a webalkalmazás nem szűri meg megfelelően a bemeneteket, akkor a támadó könnyen elhelyezhet rosszindulatú JavaScript kódot. Például ha egy felhasználó egy szkriptet ad meg, mint „<script>alert(‘XSS!’);</script>”, és a weboldal ezt anélkül jeleníti meg, hogy eltávolítaná a kódrészletet, akkor az oldal működése sérülékennyé válik. Az XSS megelőzésére fontos az input- és outputszűrés, valamint az HTML-kódolás használata.
A Command Injection egy másik típusú támadás, amely a szerver operációs rendszerét célozza meg. A támadó által megadott parancsok közvetlenül végrehajtásra kerülnek a szerver operációs rendszerén, ha a webalkalmazás nem ellenőrzi megfelelően a felhasználói bemeneteket. A Command Injection lehetővé teszi a támadónak, hogy rendszerszintű parancsokat futtasson, fájlokat módosítson, töröljön vagy hátsó kapukat hozzon létre a szerveren. Ennek az a veszélye, hogy a támadó teljes hozzáférést szerezhet a szerverhez, így elérhet bárminemű adatot, manipulálhatja a fájlokat, vagy akár teljes mértékben leállíthatja a rendszert.

Kép forrása: PortSwigger
A sérülékeny pontok leginkább azok a webalkalmazások, amelyek felhasználói bemeneteket fogadnak el, majd azt shell parancsként hajtják végre, például PHP, Python vagy Bash script használatával. Ha a bemeneteket nem ellenőrzik megfelelően, a támadó olyan parancsokat adhat meg, amelyek kárt okozhatnak a rendszerben. Például ha egy webalkalmazás egy ping parancsot futtat a felhasználó által megadott IP-cím alapján, és nem érvényesíti a bemenetet, akkor a támadó a következő módon manipulálhatja azt: „192.168.1.1; rm -rf /” – törölheti az összes fájlt a szerverről, ha nincs megfelelő szűrési mechanizmus.

Kép forrása: Security Innovation
A fő különbség az XSS és a Command Injection között az, hogy míg az XSS a felhasználó böngészőjében futtatott rosszindulatú kódra épít, a Command Injection közvetlenül a szerveren hajt végre parancsokat. Az XSS-támadások adatlopást, session hijackinget vagy weboldalmanipulációt céloznak, míg a Command Injection a rendszerszintű manipulációkat teszi lehetővé, amelyek adatvesztéssel vagy akár rendszerösszeomlással is járhatnak. A megoldások is eltérőek: XSS esetén a bemeneti és kimeneti adatok helyes szűrése, például HTML-kódolás, míg Command Injection esetén a bemenetek alapos validálása és a shell parancsok futtatásának elkerülése ajánlott.
A CTF- (Capture The Flag) versenyek során az XSS és a Command Injection kihasználása gyakran hasznos, szükséges képesség. Mindkét sérülékenységet könnyen észlelhetjük, ha figyelmesen teszteljük a webalkalmazásokat és a felhasználói bemeneteket. A tipikus feladatok a CTF-versenyeken általában olyan weboldalakat tartalmaznak, amelyek például keresőmezőt, kommentszekciót vagy űrlapokat használnak. Ilyenkor érdemes külön figyelmet fordítani a bemenetekre, hogy azok szűrés nélkül jelennek-e meg a weboldalon. Az XSS kihasználásának egyik legegyszerűbb módja, ha a felhasználói bemeneti mezőbe egy szkriptet illesztünk be. Például ha egy keresőmezőbe beírjuk a következő szkriptet: „<script>alert(‘XSS!’);</script>”, és a weboldal ezt megfelelő szűrés nélkül megjeleníti, akkor sikeresen kihasználtuk a sérülékenységet. Az ilyen típusú támadásokat gyorsan észlelhetjük azzal, hogy olyan bemenetekkel próbálkozunk, amelyek HTML- vagy JavaScript-kódokat tartalmaznak, és figyeljük, hogy az oldal hogyan reagál ezekre. Az XSS-sérülékenység kihasználásakor a cél gyakran az, hogy a támadó kódot futtasson a böngészőben, például adatokat lopjon el vagy session hijackinget hajtson végre. Mind az XSS, mind a Command Injection komoly biztonsági kockázatot jelenthet, ha nem kezeljük őket megfelelően, azonban mindkét típusú támadás alapos bemeneti validálással és megfelelő szűréssel megelőzhető.
Kiemelt kép: Freepik