Portswigger Lab: Exploiting XXE Using External Entities to Retrieve Files

Lab Çözümü
İlk olarak PortSwigger üzerinden laboratuvarı başlattım. Ardından Burp Suite'i açarak Proxy → Intercept bölümüne geçtim.

Laboratuvarda herhangi bir ürünün sayfasını açıp Check stock butonuna tıkladım. Oluşan POST /product/stock isteğini yakaladıktan sonra sağ tıklayıp Send to Repeater seçeneğiyle Repeater'a gönderdim.
Repeater'da isteği incelediğimde verilerin XML formatında gönderildiğini gördüm.

İstek başlıklarında Content-Type: application/xml bulunuyordu. Buradan uygulamanın XML verilerini işlediğini anlayabiliyoruz. Ben de XML parser'ın external entity kullanımına izin verip vermediğini test etmeye karar verdim.
Bunun için XML'in başlangıç kısmına aşağıdaki tanımlamayı ekledim:
<!DOCTYPE stockCheck [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
Burada xxe adında bir external entity tanımlıyoruz. SYSTEM ifadesiyle de sunucudaki /etc/passwd dosyasını işaret ediyoruz.
İlk denememde yalnızca bu tanımlamayı ekleyip isteği gönderdim. Ancak sunucu normal stok bilgisini döndürdü. Çünkü entity'yi tanımlamış olsam da XML içerisinde henüz kullanmamıştım.
Bunun üzerine productId alanındaki 9 değerini kaldırıp yerine &xxe; yazdım.
Son durumda gönderdiğim XML şu şekildeydi:

Bu kez Send butonuna bastığımda Repeater'ın sağ tarafındaki Response → Pretty bölümünde /etc/passwd dosyasının içeriğini görebildim.
Yanıtta aşağıdakine benzer satırlar bulunuyordu:
Peki burada ne oldu?
Normalde uygulama productId alanında bir ürün numarası bekliyor. Ancak biz bu alana &xxe; yerleştirdik. XML parser dış varlığı çözümlediği için /etc/passwd dosyasının içeriğini okumaya çalıştı ve elde ettiği veriyi productId değerinin yerine koydu.
Uygulama da bu değeri geçerli bir ürün numarası olarak kabul etmediğinden hata mesajıyla birlikte geri döndürdü.
Böylece sunucudaki yerel bir dosyayı XXE zafiyeti üzerinden okuyabildiğimizi görmüş olduk.
Sonuç olarak, /etc/passwd dosyasının içeriğini elde ederek laboratuvarı tamamladım







