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/12/07 16:08] – kresimir | 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 |
| + | |||
| + | 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/yp 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 s Hacknite platforme - Linux ROT13** | __**PRIMJER**__ **Zadatak s Hacknite platforme - Linux ROT13** | ||
command_injection.1701965291.txt.gz · Last modified: 2025/12/01 11:40 (external edit)