Bu bölümde, XML external entity nedir, bazı yaygın örnekleri, çeşitli XXE injection türlerinin nasıl bulunacağını ve kullanılacağını açıklayacağız ve XXE injection saldırılarının nasıl önleneceğini özetleyeceğiz.
XML External Entity Injection Nedir?
Xml external entity injection(XXE olarak da bilinir), bir saldırganın bir uygulamanın XML verilerini işlemesine müdahale etmesine izin veren bir web güvenlik açığıdır. Genellikle bir saldırganın uygulama sunucusu dosya sistemindeki dosyaları görüntülemesine ve uygulamanın kendisinin erişebileceği herhangi bir arka uç veya harici sistemle etkileşime girmesine izin verir.
Bazı durumlarda, bir saldırgan, sunucu tarafı istek sahteciliği (SSRF) saldırıları gerçekleştirmek için XXE güvenlik açığından yararlanarak, temeldeki sunucunun veya diğer arka uç altyapısının güvenliğini aşmak için bir XXE saldırısını yükseltebilir.
XXE Güvenlik Açıkları Nasıl Ortaya Çıkıyor?
Bazı uygulamalar, tarayıcı ve sunucu arasında veri iletmek için XML biçimini kullanır. Bunu yapan uygulamalar, sunucudaki XML verilerini işlemek için neredeyse her zaman standart bir kitaplık veya platform API’si kullanır. XXE güvenlik açıkları, XML belirtiminin çeşitli potansiyel olarak tehlikeli özellikler içermesi ve standart ayrıştırıcıların, uygulama tarafından normalde kullanılmasalar bile bu özellikleri desteklemesi nedeniyle ortaya çıkar.
XML external entity , tanımlı değerleri, bildirildikleri DTD’nin dışından yüklenen bir tür özel XML varlığıdır. Dış varlıklar, bir dosya yolunun veya URL’nin içeriğine dayalı olarak bir varlığın tanımlanmasına izin verdikleri için güvenlik açısından özellikle ilginçtir.
XXE Saldırı Türleri Nelerdir?
Çeşitli XXE saldırıları türleri vardır:
- Bir dosyanın içeriğini içeren ve uygulamanın yanıtında döndürülen harici bir varlığın tanımlandığı dosyaları almak için XXE’den yararlanma .
- Bir arka uç sistemine giden bir URL’ye dayalı olarak harici bir varlığın tanımlandığı SSRF saldırılarını gerçekleştirmek için XXE’den yararlanma.
- Hassas verilerin uygulama sunucusundan saldırganın kontrol ettiği bir sisteme iletildiği, kör XXE verilerinin bant dışı sızdırılmasından yararlanma.
- Saldırganın hassas veriler içeren bir ayrıştırma hata mesajını tetikleyebildiği hata mesajları yoluyla veri almak için kör XXE’den yararlanma .
Dosyaları Almak İçin XXE’den Yararlanma
Sunucunun dosya sisteminden rastgele bir dosya alan bir XXE yerleştirme saldırısı gerçekleştirmek için, gönderilen XML’i iki şekilde değiştirmeniz gerekir:
DOCTYPE
Dosyanın yolunu içeren harici bir varlığı tanımlayan bir öğe tanıtın (veya düzenleyin) .- Tanımlanan harici varlığı kullanmak için, uygulamanın yanıtında döndürülen XML’deki bir veri değerini düzenleyin.
Örneğin, bir alışveriş uygulamasının aşağıdaki XML’i sunucuya göndererek bir ürünün stok düzeyini kontrol ettiğini varsayalım:
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>
Uygulama, XXE saldırılarına karşı belirli bir savunma gerçekleştirmez, bu nedenle /etc/passwd
aşağıdaki XXE yükünü göndererek dosyayı almak için XXE güvenlik açığından yararlanabilirsiniz :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>
Bu XXE yükü &xxe;
, değeri /etc/passwd
dosyanın içeriği olan ve değer içindeki varlığı kullanan harici bir varlığı tanımlar productId
. Bu, uygulamanın yanıtının dosyanın içeriğini içermesine neden olur:
Invalid product ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
Not
Gerçek dünyadaki XXE güvenlik açıklarıyla birlikte, gönderilen XML’de genellikle çok sayıda veri değeri bulunur ve bunlardan herhangi biri uygulamanın yanıtı içinde kullanılabilir. XXE güvenlik açıklarını sistematik olarak test etmek için, tanımlanmış varlığınızı kullanarak ve yanıtta görünüp görünmediğine bakarak genellikle XML’deki her bir veri düğümünü ayrı ayrı test etmeniz gerekir.
SSRF Saldırıları Gerçekleştirmek İçin XXE’den Yararlanma
Hassas verilerin alınmasının yanı sıra, XXE saldırılarının diğer ana etkisi, sunucu tarafı istek sahteciliği (SSRF) gerçekleştirmek için kullanılabilmesidir. Bu, sunucu tarafı uygulamanın, sunucunun erişebileceği herhangi bir URL’ye HTTP istekleri yapmaya yönlendirilebileceği potansiyel olarak ciddi bir güvenlik açığıdır.
Bir SSRF saldırısı gerçekleştirmek üzere bir XXE güvenlik açığından yararlanmak için , hedeflemek istediğiniz URL’yi kullanarak harici bir XML varlığı tanımlamanız ve tanımlanan varlığı bir veri değeri içinde kullanmanız gerekir. Tanımlanmış varlığı, uygulamanın yanıtında döndürülen bir veri değeri içinde kullanabilirseniz, uygulamanın yanıtı içindeki URL’den yanıtı görüntüleyebilir ve böylece arka uç sistemiyle iki yönlü etkileşim elde edebilirsiniz. Değilse, yalnızca kör SSRF saldırıları gerçekleştirebileceksiniz (ki bu yine de kritik sonuçlara yol açabilir).
Aşağıdaki XXE örneğinde, harici varlık, sunucunun kuruluşun altyapısı içindeki bir dahili sisteme arka uç HTTP isteği yapmasına neden olacaktır:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>
Kör XXE Güvenlik Açıkları
XXE güvenlik açıklarının çoğu örneği kördür. Bu, uygulamanın yanıtlarında tanımlı harici varlıkların değerlerini döndürmediği ve bu nedenle sunucu tarafı dosyalarının doğrudan alınmasının mümkün olmadığı anlamına gelir.
Kör XXE güvenlik açıkları hala tespit edilebilir ve kullanılabilir, ancak daha gelişmiş teknikler gereklidir. Güvenlik açıklarını bulmak için bazen bant dışı teknikleri kullanabilir ve verileri sızdırmak için bunlardan yararlanabilirsiniz. Ve bazen, hata mesajları içinde hassas verilerin ifşa edilmesine yol açan XML ayrıştırma hatalarını tetikleyebilirsiniz.
XXE Injection İçin Gizli Saldırı Yüzeyi Bulma
Uygulamanın normal HTTP trafiği, XML biçiminde veri içeren istekleri içerdiğinden, XXE injection güvenlik açıkları için saldırı yüzeyi birçok durumda açıktır. Diğer durumlarda, saldırı yüzeyi daha az görünür. Ancak, doğru yerlere bakarsanız, XML içermeyen isteklerde XXE saldırı yüzeyini bulacaksınız.
XInclude Saldırıları
Bazı uygulamalar istemci tarafından gönderilen verileri alır, bunları sunucu tarafında bir XML belgesine gömer ve ardından belgeyi ayrıştırır. Bunun bir örneği, istemci tarafından gönderilen veriler, daha sonra arka uç SOAP hizmeti tarafından işlenen bir arka uç SOAP isteğine yerleştirildiğinde ortaya çıkar.
Bu durumda, klasik bir XXE saldırısı gerçekleştiremezsiniz çünkü tüm XML belgesini kontrol edemezsiniz ve bu nedenle bir DOCTYPE
öğeyi tanımlayamaz veya değiştiremezsiniz . Ancak, XInclude
bunun yerine kullanabilirsiniz . XInclude
XML belgesinin alt belgelerden oluşturulmasına izin veren XML belirtiminin bir parçasıdır. Bir yerleştirebilirsiniz XInclude
saldırı yalnızca bir sunucu tarafı XML belgesine yerleştirilir verilerin tek bir öğe kontrol durumlarda yapılabilir, böylece bir XML belgesinde herhangi bir veri değerine dahilinde saldırıyı.
Bir XInclude
saldırı gerçekleştirmek için XInclude
ad alanına başvurmanız ve eklemek istediğiniz dosyanın yolunu sağlamanız gerekir . Örneğin:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
Dosya Yükleme Yoluyla XXE Saldırıları
Bazı uygulamalar, kullanıcıların daha sonra sunucu tarafında işlenen dosyaları yüklemesine izin verir. Bazı yaygın dosya biçimleri XML kullanır veya XML alt bileşenleri içerir. XML tabanlı biçimlere örnek olarak DOCX gibi ofis belge biçimleri ve SVG gibi görüntü biçimleri verilebilir.
Örneğin, bir uygulama, kullanıcıların görüntüleri yüklemesine ve yüklendikten sonra bunları sunucuda işlemesine veya doğrulamasına izin verebilir. Uygulama PNG veya JPEG gibi bir biçim almayı beklese bile, kullanılan görüntü işleme kitaplığı SVG görüntülerini destekleyebilir. SVG formatı XML kullandığından, bir saldırgan kötü niyetli bir SVG görüntüsü gönderebilir ve böylece XXE güvenlik açıkları için gizli saldırı yüzeyine ulaşabilir.
Değiştirilmiş İçerik Türü Aracılığıyla XXE Saldırıları
Çoğu POST isteği, HTML formları tarafından oluşturulan, örneğin application/x-www-form-urlencoded
. Bazı web siteleri bu biçimde istek almayı bekler, ancak XML dahil diğer içerik türlerini tolere eder.
Örneğin, normal bir istek aşağıdakileri içeriyorsa:
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
Ardından, aynı sonuçla aşağıdaki isteği gönderebilirsiniz:
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
Uygulama, mesaj gövdesinde XML içeren istekleri tolere ederse ve gövde içeriğini XML olarak ayrıştırırsa, istekleri XML biçimini kullanacak şekilde yeniden biçimlendirerek gizli XXE saldırı yüzeyine ulaşabilirsiniz.
XXE Güvenlik Açıkları Nasıl Bulunur ve Test Edilir?
XXE güvenlik açıklarının büyük çoğunluğu, Burp Suite’in web güvenlik açığı tarayıcısı kullanılarak hızlı ve güvenilir bir şekilde bulunabilir .
XXE güvenlik açıklarını manuel olarak test etmek genellikle şunları içerir:
- İyi bilinen bir işletim sistemi dosyasına dayalı olarak harici bir varlık tanımlayarak ve uygulamanın yanıtında döndürülen verilerde bu varlığı kullanarak dosya alımını test etme .
- Kontrol ettiğiniz bir sistemin URL’sine dayalı olarak harici bir varlık tanımlayarak ve bu sistemle etkileşimleri izleyerek kör XXE güvenlik açıklarını test etme . Burp Collaborator istemcisi bu amaç için mükemmeldir.
- İyi bilinen bir işletim sistemi dosyasını almaya çalışmak için bir XInclude saldırısı kullanarak, sunucu tarafı XML belgesine kullanıcı tarafından sağlanan XML olmayan verilerin güvenlik açığına dahil edilip edilmediğini test etme .
XXE Güvenlik Açıkları Nasıl Önlenir?
Neredeyse tüm XXE güvenlik açıkları, uygulamanın XML ayrıştırma kitaplığının, uygulamanın ihtiyaç duymadığı veya kullanmayı düşünmediği, potansiyel olarak tehlikeli XML özelliklerini desteklemesi nedeniyle ortaya çıkar. XXE saldırılarını önlemenin en kolay ve etkili yolu bu özellikleri devre dışı bırakmaktır.
Genel olarak, harici varlıkların çözümlenmesini devre dışı bırakmak ve XInclude
. Bu genellikle yapılandırma seçenekleri aracılığıyla veya program aracılığıyla varsayılan davranışı geçersiz kılarak yapılabilir. Gereksiz özelliklerin nasıl devre dışı bırakılacağına ilişkin ayrıntılar için XML ayrıştırma kitaplığınızın veya API’nizin belgelerine bakın.