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:15] – 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č | + | 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 |
| + | |||
| + | Nakon toga se pokreće sljedeća naredba **cat / | ||
| - | Ukratko, command injection napad može se izvesti u naredbama koja nemaju dobro provedenu validaciju | + | U oba opisana primjera, kada bi validacija |
| - | __**PRIMJER**__ **Zadatak | + | __**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. | ||
| Line 98: | Line 117: | ||
| [2]https:// | [2]https:// | ||
| [3]https:// | [3]https:// | ||
| + | [4]https:// | ||
command_injection.1699546509.txt.gz · Last modified: 2025/12/01 11:40 (external edit)