command_injection
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| command_injection [2023/11/09 16:13] – zrinka | command_injection [2026/06/12 18:21] (current) – //host// višak mbunic | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====Command injection==== | ====Command injection==== | ||
| - | **Command injection** je tip napada u kojem napadač izvršava | + | **Command injection** je tip napada u kojem napadač izvršava naredbe na operacijskom sustavu |
| - | Uzmimo za primjer naredbu cat (concatenate) u Linuxu koja služi kako bi korisnik mogao vidjeti | + | Ovaj napad omogućuje napadaču izvršavanje naredbi s privilegijama korisnika pod kojim se izvršava web-aplikacija, |
| + | |||
| + | Uzmimo za primjer naredbu | ||
| < | < | ||
| - | int main(char* argc, char** argv) { | + | |
| + | int main(int argc, char** argv) { | ||
| char cmd[CMD_MAX] = "/ | char cmd[CMD_MAX] = "/ | ||
| strcat(cmd, argv[1]); | strcat(cmd, argv[1]); | ||
| Line 12: | Line 15: | ||
| </ | </ | ||
| - | Ključna stvar koju treba primijetiti je da korisnik nema mogućnost uređivanja te datoteke, već ju samo može čitati. Funkcija | + | Funkcija **system()** predaje sastavljeni niz znakova ljusci operacijskog sustava |
| - | Međutim, korisnik bi mogao unijeti | + | |
| + | Ovaj kod bi trebao korisniku omogućiti isključivo čitanje drugih datoteka Linux naredbom **cat**, pri tome je korištena apsolutna putanja do izvršne datoteke "/ | ||
| < | < | ||
| - | cat ;rm -rf / | + | filename.txt; rm -rf / |
| </ | </ | ||
| - | Rm je funkcija za brisanje (remove), | ||
| - | Ovo je primjer command injectiona jer je u naredbu za čitanje datoteke ubačena naredba rm -rf. Poziv funkcije system() neće uspjeti jer je argument neispravan. No, budući da je ; znak koji odjeljuje naredbe (u Unix sustavima), | ||
| - | Drugi je primjer internetska trgovina koja ima tražilicu proizvoda i prima parametre preko URL-a. Primjerice, upit | + | Nakon ovog unosa konačna sastavljena naredba bi bila: |
| + | |||
| < | < | ||
| - | https://insecure-webshop.com/stockStatus? | + | /usr/bin/cat filename.txt; rm -rf / |
| </ | </ | ||
| - | pretražuje postoji li proizvod s id-jem 381 u trgovini s id-jem 29. Sustav zatim parsira upit tako što izvuče productID i storeID te izvede naredbu koja može izgledati ovako: | + | |
| + | Točka-zarez (;) je znak koji odjeljuje naredbe (u Linux i Unix sustavima), tako da ovaj unos odgovara pokretanju dviju naredbi. | ||
| < | < | ||
| - | stockreport.pl 381 29 | + | / |
| + | rm -rf / | ||
| </ | </ | ||
| - | Međutim, napadač | + | |
| + | |||
| + | **rm** je naredba za brisanje (od engl. //remove//), -r je opcija koja označava rekurzivno brisanje, odnosno brisanje svih poddirektorija, | ||
| + | |||
| + | |||
| + | Ovo je primjer | ||
| + | |||
| + | Nakon izvođenja naredbe čitanja datoteke " | ||
| + | |||
| + | |||
| + | Drugi je primjer internetska trgovina koja nudi tražilicu proizvoda za koju prima parametre putem URL-a. Primjerice, upit | ||
| < | < | ||
| - | https:// | + | https:// |
| </ | </ | ||
| - | Dakle, umjesto productID parametra unio je **& echo aiwefwlguh**.Nakon parsiranja | + | |
| + | pretražuje postoji li proizvod s ID-om 381 u trgovini s ID-om 29. Sustav zatim parsira upit tako što izvlači vrijednosti productID i storeID parametara te zatim izvršava | ||
| < | < | ||
| - | stockreport.pl | + | stockreport.pl |
| </ | </ | ||
| - | Prvi se izvodi stockreport.pl koji nema argumente, dakle unos je neispravan. Nakon njega postoji još jedna naredba (echo aiwefwlguh) koja se nesmetano izvede, iako u sustavu nije predviđena. U ovome slučaju nije bila maliciozna naredba, ali služi za demonstraciju mogućnosti ubacivanja naredbe koja bi mogla napraviti štetu na sustavu. Zatim ide znak & koji služi za razvdajanje parametara u URL-u te ostaje " | ||
| - | Command injection moguć je i u naredbama koje ne zahtjevaju unos korisnika ako napadač manipulira varijablama okruženja. Primjerice, napadač može promijeniti varijablu APPHOME koja u ovome primjeru određuje lokaciju gdje će se aplikacija instalirati: | ||
| - | < | ||
| - | char* home=getenv(" | ||
| - | char* cmd=(char*)malloc(strlen(home)+strlen(INITCMD)); | ||
| - | if (cmd) { | ||
| - | strcpy(cmd, | ||
| - | strcat(cmd, | ||
| - | execl(cmd, NULL); | ||
| - | } | ||
| - | </ | ||
| - | Skripta dohvaća varijablu okruženja APPHOME (varijabla home) i lokaciju radni direktorij (varijabla cmd). Ako naredba postoji, varijabla okruženja se kopira na to mjesto. Ranjivost se krije u tome što nema nikakve provjere APPHOME varijable. To znači da, ako napadač | + | Međutim, napadač |
| + | |||
| + | < | ||
| + | https:// | ||
| + | </ | ||
| + | Kao vrijednost parametra productID, umjesto broja, uneseno je **;cat**, dok je kao vrijednost parametra storeID uneseno **/ | ||
| - | Također, napadač bi mogao izvesti ovu naredbu za promjenu lozinke: | ||
| < | < | ||
| - | system(" | + | stockreport.pl; |
| </ | </ | ||
| - | Naredba mijenja radni direktorij u /var/yap i tamo poziva make. Ona je sama po sebi sigurna jer nema korisničkog unosa, što znači da ju ni napadač ne može izmijeniti. Međutim, budući da nije zadana apsolutna putanja do make filea, ako napadač promijeni $PATH varijablu okruženja, može na tu putanju unijeti malicioznu verziju make binarne datoteke. | + | Prvo se pokušava izvesti stockreport.pl, ali bez postavljenih argumenata, što je neispravan unos te se izvršavanje ove naredbe završava greškom. Ova greška ne utječe na naredbu koja se izvršava nakon operatora točka-zarez za odjeljivanje naredbi. |
| + | Nakon toga se pokreće sljedeća naredba **cat / | ||
| - | Ukratko, command injection napad može se izvesti u naredbama koja nemaju dobro provedenu validaciju korisničkog unosa. Kako bi se izbjegao, aplikacija ne bi trebala ignorirati svaki unos koji djeluje neispravno, već bi trebala pogledati postoji li nešto u toj naredbi što bi moglo potencijalno biti command injection napad. | ||
| - | __**PRIMJER**__ **Zadatak | + | U oba opisana primjera, kada bi validacija korisničkog unosa bila adekvatno implementirana, |
| + | |||
| + | __**PRIMJER**__ **Zadatak | ||
| < | < | ||
| Ivica obožava raditi s Linuxom, i pokušava koristiti Linux naredbe gdje god može. Budući da mu je trebao | Ivica obožava raditi s Linuxom, i pokušava koristiti Linux naredbe gdje god može. Budući da mu je trebao | ||
| ROT13 kalkulator za CTF natjecanje, odlučio je napraviti web stranicu na kojoj se nalazi ROT13 kalkulator | ROT13 kalkulator za CTF natjecanje, odlučio je napraviti web stranicu na kojoj se nalazi ROT13 kalkulator | ||
| - | napravljen pomoću Linux naredbi. | + | napravljen |
| - | Flag je u formatu CTF2021[brojevi] | + | Flag je u formatu CTF2021[brojevi]. |
| http:// | http:// | ||
| </ | </ | ||
| Line 78: | Line 94: | ||
| {{ : | {{ : | ||
| - | Objašnjenje: | ||
| Sustav očekuje tekst koji će kodirati Cezarovom šifrom. Budući da smo mi unijeli oznaku kraja naredbe (;), ta je naredba neispravna, ali nije nikako definirano da se nakon toga ne smije definirati neka druga naredba. Mi smo dodali naredbu cat .../flag i, iako je prva naredba možda bacila grešku, druga je izvedena. Navodnici su važni jer imamo razmake između riječi.\\ | Sustav očekuje tekst koji će kodirati Cezarovom šifrom. Budući da smo mi unijeli oznaku kraja naredbe (;), ta je naredba neispravna, ali nije nikako definirano da se nakon toga ne smije definirati neka druga naredba. Mi smo dodali naredbu cat .../flag i, iako je prva naredba možda bacila grešku, druga je izvedena. Navodnici su važni jer imamo razmake između riječi.\\ | ||
| - | Primijetimo da smo istu stvar mogli postići da smo dodali | + | Primijetimo da smo istu stvar mogli postići da smo u URL dodali |
| + | Objasnimo točno zašto ovo funkcionira. Najčešće se korisnički zahtjevi šalju tzv. POST zahtjevom. On se često na neki način kodira i nadodaje na trenutni URL. U ovom slučaju koristi se ASCII kodiranje, no postoje još neke metode. Nije presudno da korisnik zaista upiše podatak u polje koje je predviđeno za to budući da bi se njegov unos ionako prenio u URL i nakon toga dalje obradio. Tekst "; cat / | ||
| + | Oznaka **%3B** označava **;**\\ | ||
| + | **+** označava **razmak**.\\ | ||
| + | **%2F** je oznaka za **/**. \\ | ||
| - | __**PRIMJER**__ **Zadatak | + | __**PRIMJER**__ **Zadatak |
| < | < | ||
| Kroz učenje razvoja web stranica Ivica sve više uči i o Linuxu. Kako bi uspješno zapamtio sve što je naučio o Linux naredbama te ujedno vježbao izradu web stranica, napravio je interaktivnu web stranicu koja demonstrira što rade različite Linux naredbe. | Kroz učenje razvoja web stranica Ivica sve više uči i o Linuxu. Kako bi uspješno zapamtio sve što je naučio o Linux naredbama te ujedno vježbao izradu web stranica, napravio je interaktivnu web stranicu koja demonstrira što rade različite Linux naredbe. | ||
| Line 90: | Line 109: | ||
| </ | </ | ||
| - | Rješenje je slično prethodnom, samo što nemamo prostor za korisnički unos, već unosimo naredbu u URL. Pri tome moramo paziti na kodiranje znakova. Oznaka %20 označava razmak. Ako želimo izvesti naredbu preko URL-a, moramo zadati naredbu (parametar //cmd//) i argumente (parametar //arg//). Zadat ćemo neku nepostojeću naredbu koja će baciti grešku (npr. neki broj), a cijelu malicioznu naredbu stavit ćemu u argument. Isto kao i prije, krenut ćemo oznakom kraja naredbe (;) i nakon toga upisati cat naredbu datoteke koju želimo pročitati. Budući da stranice predefinirano povlače datoteke s putanje /var/www, pretpostavit ćemo da postoji datoteka " | + | Rješenje je slično prethodnom, samo što nemamo prostor za korisnički unos, već unosimo naredbu u URL. Pri tome moramo paziti na kodiranje znakova. U ovom se slučaju koristi klasično URL kodiranje. Oznaka %20 označava razmak. Ako želimo izvesti naredbu preko URL-a, moramo zadati naredbu (parametar //cmd//) i argumente (parametar //arg//). Zadat ćemo neku nepostojeću naredbu koja će baciti grešku (npr. neki broj), a cijelu malicioznu naredbu stavit ćemo argument. Isto kao i prije, krenut ćemo oznakom kraja naredbe (;) i nakon toga upisati cat naredbu datoteke koju želimo pročitati. Budući da stranice predefinirano povlače datoteke s putanje /var/www, pretpostavit ćemo da postoji datoteka " |
| < | < | ||
| To je ujedno i naše rješenje. | To je ujedno i naše rješenje. | ||
| + | {{ : | ||
| ===Izvori=== | ===Izvori=== | ||
| [1]https:// | [1]https:// | ||
| [2]https:// | [2]https:// | ||
| [3]https:// | [3]https:// | ||
| + | [4]https:// | ||
command_injection.1699546388.txt.gz · Last modified: 2025/12/01 11:40 (external edit)