User Tools

Site Tools


command_injection

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
command_injection [2023/10/09 11:48] zrinkacommand_injection [2023/11/22 10:17] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====Command injection==== ====Command injection====
  
-**Command injection** je tip napada u kojem napadač izvršava proizvoljne naredbe na host operacijskom sustavu kroz neku ranjivu aplikaciju. Ranjivost se obično očituje u nedostatku validacije korisničkog unosa. Nesigurni se podatci najčešće prenose putem formi i kolačića. Ovo je jedan od opasnijih napada jer napadaču omogućuje eksalaciju ovlasti čak do te mjere da može brisati datoteke na računalu za koje ne bi trebao bi znati da postoje. Uz to, naredba se može izvesti na sistemskoj ljusci, što znači da napadač ima mogućnost utjecati na cijeli operacijski sustav. +**Command injection** je tip napada u kojem napadač izvršava proizvoljne naredbe na //host// operacijskom sustavu kroz neku ranjivu aplikaciju. Ranjivost se obično očituje u nedostatku validacije korisničkog unosa. Nesigurni se podatci najčešće prenose putem formi i kolačića. Ovo je jedan od opasnijih napada jer napadaču omogućuje eskalaciju ovlasti čak do te mjere da može brisati datoteke na računalu za koje ne bi trebao bi znati da postoje. Uz to, naredba se može izvesti na sistemskoj ljusci, što znači da napadač ima mogućnost utjecati na cijeli operacijski sustav. 
  
 Uzmimo za primjer naredbu cat (concatenate) u Linuxu koja služi kako bi korisnik mogao vidjeti sadržaj neke datoteke u čitljivom formatu:  Uzmimo za primjer naredbu cat (concatenate) u Linuxu koja služi kako bi korisnik mogao vidjeti sadržaj neke datoteke u čitljivom formatu: 
Line 12: Line 12:
 </file> </file>
  
-Ključna stvar koju treba primijetiti je da korisnik nema mogućnost uređivanja te datoteke, već ju samo može čitati. Funkcija kao argument prima naziv datoteke, primjerice: cat filename.txt +Ključna stvar koju treba primijetiti je da korisnik nema mogućnost uređivanja te datoteke, već ju samo može čitati. Funkcija kao argument prima naziv datoteke, primjerice: cat filename.txtMeđutim, korisnik bi mogao unijeti nešto drugačiji upit, primjerice
-Međutim, korisnik bi mogao unijeti nešto drugačiji upit, primjerice +
 <code> <code>
 cat ;rm -rf /   cat ;rm -rf /  
 </code> </code>
 Rm je funkcija za brisanje (remove),  -r je opcija koja označava rekurzivno brisanje, odnosno brisanje svih poddirektorija, a –f znači force, dakle korisnika se ne traži dopuštenje za brisanje svake datoteke. / je oznaka za home direktorij u Linux sustavima. Rm je funkcija za brisanje (remove),  -r je opcija koja označava rekurzivno brisanje, odnosno brisanje svih poddirektorija, a –f znači force, dakle korisnika se ne traži dopuštenje za brisanje svake datoteke. / je oznaka za home direktorij u Linux sustavima.
-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),  “rm -rf /” se izvodi kao zasebna naredba i briše sve datoteke i direktorije iz home direktorija nekog sustava. Već se na ovome primjeru vidi potencijal za eskalaciju ovlasti u command injection napadu. Korisnik je umjesto čitanja datoteke dobio mogućnost brisanja ostalih datoteka na tom računalu koje nisu ni izravno povezane s datotekom koju je čitao.+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),  “rm -rf /” se izvodi kao zasebna naredba i briše sve datoteke i direktorije iz home direktorija nekog sustava. Već se na ovome primjeru vidi potencijal za eskalaciju ovlasti u command injection napadu. Korisnik je umjesto čitanja datoteke dobio mogućnost brisanja ostalih datoteka na tom računalu koje nisu ni izravno povezane s datotekom koju je čitao.
  
 Drugi je primjer internetska trgovina koja ima tražilicu proizvoda i prima parametre preko URL-a. Primjerice, upit  Drugi je primjer internetska trgovina koja ima tražilicu proizvoda i prima parametre preko URL-a. Primjerice, upit 
Line 24: Line 23:
 https://insecure-webshop.com/stockStatus?productID=381&storeID=29  https://insecure-webshop.com/stockStatus?productID=381&storeID=29 
 </code> </code>
-pretražuje postoji li proizvod s id-jem 381 u trgovini s id-jem 29. Sustav zatim parsira naredbu tako što izvuče productID i storeID te izvede naredbu koja može izgledati ovako:+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:
 <code> <code>
 stockreport.pl 381 29 stockreport.pl 381 29
 </code> </code>
-Međutim, uzmimo napadača koji je unio sljedeće: +Međutim, napadač bi mogao unijeti sljedeće: 
 <code> <code>
 https://insecure-website.com/stockStatus?productID= & echo aiwefwlguh &storeID=29 https://insecure-website.com/stockStatus?productID= & echo aiwefwlguh &storeID=29
 </code> </code>
-Dakle, umjesto productID parametra uneseno je **& echo aiwefwlguh**  +Dakle, umjesto productID parametra unio je **& echo aiwefwlguh**.Nakon parsiranja izvršava se : 
-Nakon parsiranja izvršava se : +
 <code> <code>
 stockreport.pl & echo aiwefwlguh & 29 stockreport.pl & echo aiwefwlguh & 29
 </code> </code>
-Prvi se izvodi stockreport.pl koji nema argumente, dakle unos je neispravan. Nakon njega postoji još jedna naredba (echo aiwefwlguh) koja se izvodi zato što ju je napadač ubacioa ne zato što je sustav tako zamišljen. U ovome slučaju nije bila maliciozna naredba, ali služi za demonstraciju mogućnost ubacivanja naredbe koja bi mogla napraviti štetu na sustavu. Zatim ide znak & koji služi za razvdajanje parametara u URL-u te ostaje "29" što sustav pokušava pročitati kao naredbu, ali ne postoji pa se ni ne izvede+Prvi se izvodi stockreport.pl koji nema argumente, dakle unos je neispravan. Nakon njega postoji još jedna naredba (echo aiwefwlguh) koja se nesmetano izvedeiako 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 "29" što sustav pokušava pročitati kao naredbu, ali ne postoji pa se ni ne izvede.\\
 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: 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:
 <file> <file>
Line 49: Line 47:
 </file> </file>
  
-Ukratko, 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č promijeni varijablu APPHOME na neku putanju koja sadrži malicioznu verziju inicijalizacijske skripte (INITCMD), ona će se izvršiti zajedno s kodom koji bi inače trebao.+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č promijeni varijablu APPHOME na neku putanju koja sadrži malicioznu verziju inicijalizacijske skripte (INITCMD), ona će se izvršiti zajedno s kodom koji bi inače trebao.
  
  
Line 57: Line 55:
 </code> </code>
  
-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.+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č 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.
  
  
 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.  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 sa Hacknite platforme - Linux ROT13**
 +<file>
 +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 pomoću Linux naredbi.
 +Flag je u formatu CTF2021[brojevi].
 +http://chal.platforma.hacknite.hr:10013
 +</file>
 +
 +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 sa Hacknite platforme - Linux naredbe**
 +<file>
 +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
 +</file>
 +
 +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 ć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 "flag" na toj putanju i na trenutni URL u tražilici dodati sljedeće: 
 +<code>http://.../linux.php?cmd=3&arg=;%20cat%20/var/www/flag</code>
 +To je ujedno i naše rješenje.
 +{{ :cmdi-rj2.png?600 |}}
 ===Izvori=== ===Izvori===
 [1]https://owasp.org/www-community/attacks/Command_Injection \\ [1]https://owasp.org/www-community/attacks/Command_Injection \\
 [2]https://www.imperva.com/learn/application-security/command-injection/\\ [2]https://www.imperva.com/learn/application-security/command-injection/\\
 [3]https://portswigger.net/web-security/os-command-injection\\ [3]https://portswigger.net/web-security/os-command-injection\\
 +[4]https://platforma.hacknite.hr/challenges\\
command_injection.1696852104.txt.gz · Last modified: 2025/06/03 10:22 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki