web_nemoguca_misija
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| web_nemoguca_misija [2025/02/27 16:18] – kresimir | web_nemoguca_misija [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| 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: | ||
| Line 65: | Line 65: | ||
| {{unicodeinterp: | {{unicodeinterp: | ||
| - | Uzevši u obzir da je Apache korišten | + | Uzevši u obzir da je za server |
| {{unicodeinterp: | {{unicodeinterp: | ||
| - | Ovaj Docker kontejner se prvo treba sagraditi, pozicionirajući se u isti direktorij kao I Dockerfile, u kojem je i index.php | + | Ovaj Docker kontejner se prvo treba sagraditi, pozicionirajući se u isti direktorij kao i Dockerfile, u kojem je također postavljen |
| < | < | ||
| Line 89: | Line 88: | ||
| </ | </ | ||
| - | Ako se kontejner gradi i pokreće na Linuxu, bit će ga potrebno izgraditi i pokrenuti | + | Ako se kontejner gradi i pokreće na Linuxu, bit će ga potrebno izgraditi i pokrenuti naredbom |
| ** Može se dogoditi da verzija lokalnog PHP enginea u kontejneru ili izvan, bude npr. 8.1.2 ili 8.1.31, a verzija na platformi bude 8.1.30. Uglavnom ne bi trebale biti značajne promjene između ovih verzija koje bi učinile razliku između rješavanja zadatka lokalno i izvršavanja zadatka na platformi, no može se dogoditi. To se može osigurati ili instalacijom iste verzije, ili provjerom razlika između verzija, da se utvrdi da razlike neće utjecati na izvršavanje programske logike zadatka. | ** Može se dogoditi da verzija lokalnog PHP enginea u kontejneru ili izvan, bude npr. 8.1.2 ili 8.1.31, a verzija na platformi bude 8.1.30. Uglavnom ne bi trebale biti značajne promjene između ovih verzija koje bi učinile razliku između rješavanja zadatka lokalno i izvršavanja zadatka na platformi, no može se dogoditi. To se može osigurati ili instalacijom iste verzije, ili provjerom razlika između verzija, da se utvrdi da razlike neće utjecati na izvršavanje programske logike zadatka. | ||
| ===Dodavanje ispisa u lokalnu instancu pokrenutog zadatka=== | ===Dodavanje ispisa u lokalnu instancu pokrenutog zadatka=== | ||
| - | Kada je osiguran jedan od dva opisana načina pokretanja zadatka lokalno (korištenje Dockera | + | Kada je osiguran jedan od dva opisana načina pokretanja zadatka lokalno (preporučeno je korištenje Dockera), može se modificirati lokalna |
| - | Primjer | + | Primjer |
| {{unicodeinterp: | {{unicodeinterp: | ||
| - | Slanjem payloada | + | Slanjem payloada: |
| < | < | ||
| /? | /? | ||
| Line 113: | Line 112: | ||
| {{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 138: | Line 137: | ||
| {{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. | ||
web_nemoguca_misija.1740673117.txt.gz · Last modified: 2025/12/01 11:40 (external edit)