====Command injection==== **Command injection** je tip napada u kojem napadač izvršava naredbe na operacijskom sustavu poslužitelja kroz neku ranjivu aplikaciju. Ranjivost nastaje kada se korisnički unos, bez odgovarajuće validacije, izravno ili neizravno koristi za sastavljanje naredbe koja se izvršava u ljusci operacijskog sustava (engl. //shell//, npr. Bash na Linuxu ili PowerShell na Windowsima). Primjeri korisničkih unosa u web-aplikaciji koji se mogu naknadno koristiti za sastavljanje naredbi za izvršavanje u ljusci operacijskog sustava mogu biti podaci iz obrazaca (formi), kolačića, URL parametara te ponekad čak i korisnička imena ili lozinke. Ovaj napad omogućuje napadaču izvršavanje naredbi s privilegijama korisnika pod kojim se izvršava web-aplikacija, no ako sustav nije ispravno konfiguriran, može doći do podizanja razine privilegija (engl. //privilege escalation//) do administratorskog korisnika, što napadaču daje potpunu kontrolu sustava. Uzmimo za primjer naredbu **cat** (od engl. //concatenate//) u Linuxu koja se koristi za prikaz sadržaja datoteka: int main(int argc, char** argv) { char cmd[CMD_MAX] = "/usr/bin/cat "; strcat(cmd, argv[1]); system(cmd); } Funkcija **system()** predaje sastavljeni niz znakova ljusci operacijskog sustava na izvršavanje. 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 "/usr/bin/cat" (ekvivalentno kao samo pozivanje naredbe cat, koristi se ista izvršna datoteka). Program kao argument prima naziv datoteke, primjerice: "filename.txt", nakon čega bi konstruirana naredba bila "cat filename.txt". Međutim, korisnik bi mogao unijeti zlonamjeran unos, primjerice: filename.txt; rm -rf / Nakon ovog unosa konačna sastavljena naredba bi bila: /usr/bin/cat filename.txt; rm -rf / Točka-zarez (;) je znak koji odjeljuje naredbe (u Linux i Unix sustavima), tako da ovaj unos odgovara pokretanju dviju naredbi. /usr/bin/cat filename.txt rm -rf / **rm** je naredba za brisanje (od engl. //remove//), -r je opcija koja označava rekurzivno brisanje, odnosno brisanje svih poddirektorija, a -f označava prisilno izvršavanje bez traženja dodatne potvrde korisnika. Kosa crta (/) označava korijenski (engl. root) direktorij datotečnog sustava u Linuxu. Ovo je primjer napada command injection jer je u legitimnu naredbu za čitanje datoteke umetnuta dodatna naredba **rm -rf /**. Nakon izvođenja naredbe čitanja datoteke "filename.txt", pokreće se naredba "rm -rf /", koja pokušava rekurzivno brisati sve datoteke i direktorije počevši od root direktorija, efektivno brišući sve što je dostupno procesu. Drugi je primjer internetska trgovina koja nudi tražilicu proizvoda za koju prima parametre putem URL-a. Primjerice, upit https://insecure-webshop.com/stockStatus?productID=381&storeID=29 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 naredbu koja izgleda ovako: stockreport.pl 381 29 Međutim, napadač bi mogao unijeti sljedeće: https://insecure-website.com/stockStatus?productID=;cat&storeID=/etc/passwd Kao vrijednost parametra productID, umjesto broja, uneseno je **;cat**, dok je kao vrijednost parametra storeID uneseno **/etc/passwd**. Nakon parsiranja izvršava se: stockreport.pl;cat /etc/passwd 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 /etc/passwd** koja se uspješno izvršava. Ako se rezultat izvršavanja naredbe ispisuje u odgovoru poslužitelja, bit će prikazan sadržaj datoteke /etc/passwd. U oba opisana primjera, kada bi validacija korisničkog unosa bila adekvatno implementirana, primjerice dozvoljavanjem unosa samo brojeva za parametre te odbacivanjem unosa koji sadrže operator točka-zarez ili druge specijalne znakove (&, /, razmak, *, itd.), ranjivost ne bi postojala. Još bolji pristup je, umjesto zabranjivanja znakova (engl. //blacklist//), ograničiti unos tako da smije sadržavati samo znakove iz dozvoljenog skupa (engl. //whitelist//). Za parametre bi u tom slučaju jedini dozvoljeni znakovi za unos bile znamenke 0–9, a za prvi primjer samo znakovi koji se mogu pojaviti unutar imena datoteke. __**PRIMJER**__ **Zadatak s Hacknite platforme - Linux ROT13** 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 napravljen uz pomoć Linux naredbi. Flag je u formatu CTF2021[brojevi]. http://chal.platforma.hacknite.hr:10013 Odlaskom na početnu stranicu i pritiskom na "ROT13" dolazimo na ovo sučelje: {{ :cmdi-zad1.png?600 |}} Vidimo prostor za korisnički unos i idemo ispitati je li ono ranjivo. Ako upišemo u kućicu **'; cat ../flag;'** (s navodnicima), dobili smo rješenje: {{ :cmdi-rj1.png?600 |}} 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 u URL dodali //rot13.php?tekst='%3B+cat+..%2Fflag%3B'//.\\ 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 /flag;" kad se kodira u URL na kraju ispadne upravo //%3B+cat+..%2Fflag%3B// jer: \\ Oznaka **%3B** označava **;**\\ **+** označava **razmak**.\\ **%2F** je oznaka za **/**. \\ __**PRIMJER**__ **Zadatak s Hacknite platforme - 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. Možeš li pogledati web stranicu koju je Ivica napravio i provjeriti ima li Ivica još što za naučiti? Flag je u formatu CTF2020[brojevi]. http://chal.platforma.hacknite.hr:11005 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 "flag" na toj putanju i na trenutni URL u tražilici dodati sljedeće: http://.../linux.php?cmd=3&arg=;%20cat%20/var/www/flag To je ujedno i naše rješenje. {{ :cmdi-rj2.png?600 |}} ===Izvori=== [1]https://owasp.org/www-community/attacks/Command_Injection \\ [2]https://www.imperva.com/learn/application-security/command-injection/\\ [3]https://portswigger.net/web-security/os-command-injection\\ [4]https://platforma.hacknite.hr/challenges\\