web_nemoguca_misija
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| web_nemoguca_misija [2025/02/21 15:21] – created kresimir | web_nemoguca_misija [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 12: | Line 12: | ||
| - | {{unicodeiterp: | + | {{unicodeinterp: |
| Analizom izvornog koda zadatka u datoteci index.php vidi se da se „payload“ uzima kao parametar GET zahtjeva. Izvorni kod prikazan je na slici 2. | Analizom izvornog koda zadatka u datoteci index.php vidi se da se „payload“ uzima kao parametar GET zahtjeva. Izvorni kod prikazan je na slici 2. | ||
| Line 24: | Line 24: | ||
| Slanjem ovog parametra pri pristupu web stranici, poruka greške se više ne pojavljuje. | Slanjem ovog parametra pri pristupu web stranici, poruka greške se više ne pojavljuje. | ||
| - | Sljedeći korak je analizirati izvorni kod da se pronađe način kako se manipulacijom | + | Sljedeći korak je analizirati izvorni kod da se pronađe način kako se manipulacijom parametra |
| - | Pregledom dokumentacije funkcija mb_strpos i mb_substr, može se vidjeti da mb_strpos u kodu pronalazi indeks prvog pojavljivanja substringa „flag“ u stringu | + | Pregledom dokumentacije funkcija mb_strpos i mb_substr, može se vidjeti da mb_strpos u kodu pronalazi indeks prvog pojavljivanja substringa „flag“ u stringu |
| - | Važno je za uočiti da obje funkcije imaju prefiks „mb“ – multibyte. Obje funkcije su iz PHP Multibyte String paketa koji služi za obrađivanje znakova i stringova koji su enkodirani s više od jednog bajta. Dok su ASCII znakovi enkodirani | + | Važno je uočiti da obje funkcije imaju prefiks „mb“ – multibyte. Obje funkcije su iz PHP Multibyte String paketa koji služi za obrađivanje znakova i stringova koji su enkodirani s više od jednog bajta. Dok su ASCII znakovi enkodirani |
| - | Logika programa je da prvo nalazi poziciju prvog substringa „flag“ u stringu koji je zadan u payloadu, onda od njega radi novi substring, od indexa 0 do indexa pojavljivanja substringa „flag“, te tako efektivno „izrezuje“ ostatak poslanog stringa od indeksa nakon što je pronađen substring „flag“ u njemu. Nakon toga u if provjeri ponovno poziva funkciju mb_strpos s kojom provjerava nalazi se substring „flag“ u izrezanom stringu, koji će vratiti false ako se ne nalazi „string“ u sanitized varijabli ili će vratiti true, ako mb_strpos pronađe „flag“ i vrati bilo koji broj. | + | Logika programa je da prvo nalazi poziciju prvog substringa „flag“ u stringu koji je zadan u payloadu, onda od njega radi novi substring, od indexa 0 do indexa pojavljivanja substringa „flag“, te tako efektivno „izrezuje“ ostatak poslanog stringa od indeksa nakon što je pronađen substring „flag“ u njemu. Nakon toga u if provjeri ponovno poziva funkciju mb_strpos s kojom provjerava nalazi |
| Na prvi pogled, nemoguće je unijeti payload koji će vratiti true u if provjeri, jer će dio stringa od prvog pojavljivanja znakova „flag“ uvijek biti izrezan. | Na prvi pogled, nemoguće je unijeti payload koji će vratiti true u if provjeri, jer će dio stringa od prvog pojavljivanja znakova „flag“ uvijek biti izrezan. | ||
| - | Npr. slanjem stringa | + | Npr. slanjem stringa: |
| < | < | ||
| /? | /? | ||
| Line 39: | Line 39: | ||
| U sanitized varijabli će se nakon poziva funkcija nalaziti samo podstring | U sanitized varijabli će se nakon poziva funkcija nalaziti samo podstring | ||
| - | Kako bi se detaljnije analizirao izvorni kod programa, može se lokalno | + | Kako bi se detaljnije analizirao izvorni kod programa, može se lokalno |
| - | Na Linux-Ubuntu operacijskom sustavu, php engine se može instalirati naredbom | + | Na Linux-Ubuntu operacijskom sustavu, php engine se može instalirati naredbom: |
| < | < | ||
| apt install php8.1-cli | apt install php8.1-cli | ||
| Line 51: | Line 51: | ||
| apt-get install php8.1-mbstring | apt-get install php8.1-mbstring | ||
| </ | </ | ||
| - | Pozicioniranjem u direktorij u kojemu se nalazi index.php, lokalna instanca zadatka se može pokrenuti na portu 8000 s naredbom: | + | Pozicioniranjem u direktorij u kojemu se nalazi index.php, lokalna instanca zadatka se može pokrenuti na portu 8000 naredbom: |
| < | < | ||
| php -S localhost: | php -S localhost: | ||
| </ | </ | ||
| + | |||
| + | ===Korištenje Docker kontejnera za namještanje okoline=== | ||
| Osim ovog načina, može se koristiti i Docker kontejner, što je preporučeni način korištenja. Dockerizacijom se može olakšati korištenje točnih verzija i paketa kao što se koriste u zadatku, u slučaju da paketi php8.1-cli i php8.1-mbstring budu uklonjeni iz Ubuntu repozitorija. | Osim ovog načina, može se koristiti i Docker kontejner, što je preporučeni način korištenja. Dockerizacijom se može olakšati korištenje točnih verzija i paketa kao što se koriste u zadatku, u slučaju da paketi php8.1-cli i php8.1-mbstring budu uklonjeni iz Ubuntu repozitorija. | ||
| - | !!!...Dovrsiti upute za postupak stvaranje Dockerfilea u kojem su adekvatno postavljene verzije i env varijable, FROM php: | ||
| - | Sada se može promijeniti izvorni kod zadatka koji se lokalno | + | Na stranici greške može se vidjeti poruka prikazana na slici 3. |
| - | ** Može se dogoditi da verzija | + | |
| + | |||
| + | {{unicodeinterp: | ||
| + | |||
| + | Uzevši u obzir da je za server kotišten Apache, a verzija PHP-a 8.1.X, | ||
| + | |||
| + | |||
| + | {{unicodeinterp: | ||
| + | |||
| + | Ovaj Docker kontejner se prvo treba sagraditi, pozicionirajući se u isti direktorij kao i Dockerfile, u kojem je također postavljen i index.php, te pokretanjem naredbe: | ||
| + | |||
| + | < | ||
| + | docker build -t php- zadatak. | ||
| + | </ | ||
| + | |||
| + | Nakon toga se iz izgrađene slike može stvoriti i pokrenuti kontejner naredbom: | ||
| + | |||
| + | < | ||
| + | Docker run -p 8000:80 php-zadatak | ||
| + | </ | ||
| + | |||
| + | Ovom kontejneru će se onda također moći pristupiti na URL-u: | ||
| + | |||
| + | < | ||
| + | http:// | ||
| + | </ | ||
| + | |||
| + | Ako se kontejner gradi i pokreće | ||
| + | ** Može se dogoditi da verzija | ||
| + | |||
| + | ===Dodavanje ispisa u lokalnu instancu pokrenutog zadatka=== | ||
| + | |||
| + | Kada je osiguran jedan od dva opisana načina pokretanja zadatka lokalno (preporučeno je korištenje Dockera), može se modificirati lokalna instanca zadatka, dodajući ispise kako bi se lakše i efikasnije našao prikladan payload, koji će se onda iskoristiti na stvarnoj instanci zadatka. Ispisi omogućuju jednostavniju i efikasniju analizu varijabli i stanja programa pri unosu različitih payloadova. | ||
| - | Kod indeks.php skripte se onda može promijeniti, | + | Primjer |
| {{unicodeinterp: | {{unicodeinterp: | ||
| - | Slanjem payloada | + | Slanjem payloada: |
| < | < | ||
| /? | /? | ||
| Line 75: | Line 108: | ||
| </ | </ | ||
| - | Može se vidjeti stanje varijabli prikazano na slici 4. | + | Može se vidjeti stanje varijabli prikazano na slici 6. |
| {{unicodeinterp: | {{unicodeinterp: | ||
| - | Vidi se da je flag_position | + | Vidi se da je varijabla |
| - | Pristup | + | Pristup |
| https:// | https:// | ||
| Članak objašnjava kako je Joomla CMS imao XSS ranjivost u prethodnim verzijama koja se temeljila na nedostatku u sanitizaciji korisničkog unosa radi korištenja funkcija iz PHP multibyte strings paketa koje se koristi u zadatku. Patch koji je popravio nedostatak je prisutan u PHP verzijama 8.3, 8.4 i daljnjim verzijama, ali je nedostatak i dalje prisutan u PHP verziji 8.1 koja se koristi u zadatku. | Članak objašnjava kako je Joomla CMS imao XSS ranjivost u prethodnim verzijama koja se temeljila na nedostatku u sanitizaciji korisničkog unosa radi korištenja funkcija iz PHP multibyte strings paketa koje se koristi u zadatku. Patch koji je popravio nedostatak je prisutan u PHP verzijama 8.3, 8.4 i daljnjim verzijama, ali je nedostatak i dalje prisutan u PHP verziji 8.1 koja se koristi u zadatku. | ||
| - | Ranjivost se temeljila na razlici u procesiranju nevažećih (eng. invalid) UTF-8 sekvenci između funkcija mb_strpos i mb_substr. UTF-8 (Unicode Transformation Format-8 ) znakovi mogu biti enkodirani s 1 do 4 bajtova. Po vrijednosti prvog bajta se zna broj bajtova | + | Ranjivost se temeljila na razlici u procesiranju nevažećih (eng. invalid) UTF-8 sekvenci između funkcija mb_strpos i mb_substr. UTF-8 (Unicode Transformation Format-8) znakovi mogu biti enkodirani s 1 do 4 bajtova. Po vrijednosti prvog bajta se zna broj bajtova |
| - | | + | Funkcija mb_substr, nakon što pročita prvi bajt Unicode znaka u kojemu je zapisan broj bajtova s kojim je znak enkodiran, preskače taj broj bajtova, tretirajući ga kao jedan znak. U slučaju kada je ovoj funkciji poslan nevažeći Unicode znak, koji počinje npr. bajtom koji daje informaciju da se znak sastoji od 4 bajtova, ali su samo dva bajta prisutna, nakon čega su npr. znakovi AA -, funkcija će tretirati prva dva bajta nevažećeg unicode znaka zajedno s dva važeća znaka AA kao samo jedan znak. Pravilan Unicode znak bi bio \xf0\x9f\x9f\x9f, |
| - | Funkcija mb_strpos | + | Funkcija mb_strpos |
| Ovo znači da se pri istom unosu koji se sastoji od jednog ili više nevažećih Unicode znakova, tako da je broj bajtova nevažećih Unicode znakova manji nego što je zapisano u prvom bajtu, dobiva drugačije ponašanje ovih dviju funkcija. Za svaku razliku od 2 nedostajuća bajta nevažećeg Unicode znaka, funkcija mb_strpos će indeks naknadnih znakova u unosu „vidjeti“ kao da je veći za vrijednost 2. | Ovo znači da se pri istom unosu koji se sastoji od jednog ili više nevažećih Unicode znakova, tako da je broj bajtova nevažećih Unicode znakova manji nego što je zapisano u prvom bajtu, dobiva drugačije ponašanje ovih dviju funkcija. Za svaku razliku od 2 nedostajuća bajta nevažećeg Unicode znaka, funkcija mb_strpos će indeks naknadnih znakova u unosu „vidjeti“ kao da je veći za vrijednost 2. | ||
| Korištenjem unosa \xf0\x9fAAflag, | Korištenjem unosa \xf0\x9fAAflag, | ||
| - | Upravo ova razlika između načina na koji ove dvije funkcije | + | Upravo ova razlika između načina na koji ove dvije funkcije |
| Testiranjem prethodno spomenutog skupa znakova na lokalnoj instanci, da bi testirali payload \xf0\x9fAAflag, | Testiranjem prethodno spomenutog skupa znakova na lokalnoj instanci, da bi testirali payload \xf0\x9fAAflag, | ||
| Line 100: | Line 133: | ||
| </ | </ | ||
| - | Rezultat pri slanju ovog payloada prikazan je na slici 5. | + | Rezultat pri slanju ovog payloada prikazan je na slici 7. |
| {{unicodeinterp: | {{unicodeinterp: | ||
| - | Može se uočiti da je pretpostavljeni scenarij točan, radi razlike od 2 bajta u nevažećem Unicode znaku, sanitized varijabla | + | Može se uočiti da je pretpostavljeni scenarij točan, radi razlike od 2 bajta u nevažećem Unicode znaku, sanitized varijabla |
| Kako bi se cijeli skup znakova „flag“ nalazio u varijabli sanitized, potrebno je samo dodati još jedan isti nevažeći Unicode znak na početak payloada, kako bi pomaknuli indeks rezanja payload stringa za još 2 znaka dalje i tako uspjeli sadržati cijeli skup znakova „flag“ u varijabli sanitized. | Kako bi se cijeli skup znakova „flag“ nalazio u varijabli sanitized, potrebno je samo dodati još jedan isti nevažeći Unicode znak na početak payloada, kako bi pomaknuli indeks rezanja payload stringa za još 2 znaka dalje i tako uspjeli sadržati cijeli skup znakova „flag“ u varijabli sanitized. | ||
| Line 111: | Line 144: | ||
| http:// | http:// | ||
| </ | </ | ||
| - | Može se vidjeti da je if uvjet za ispisivanje flaga uspješno zadovoljen, prikazano na slici 6. | + | Može se vidjeti da je if uvjet za ispisivanje flaga uspješno zadovoljen, prikazano na slici 8. |
| {{unicodeinterp: | {{unicodeinterp: | ||
web_nemoguca_misija.1740151307.txt.gz · Last modified: 2025/12/01 11:40 (external edit)