XML External Entity Attack (XEE)
Last updated
Last updated
Üzerinde farklı teknolojilerin koştuğu servisler veya sistemlerin haberleşmesi için datayı ortak formatta taşımaya sağlayan bir formattır.
[!NOTE] Sample Case Örneğin bir servisten bir data çekilmek isteniyor. Ama bu dataya erişebilen sınıf Python ile yazılmış olsun. Datayı kendi servisine çekip kullanmak isteyen servis ise Java ile yazılmış olsun. İkisinin de datayı alıp göndermek üzere ortak bir dil kullanması gerekir. Bunu XML, JSON gibi data types ile yapabilir.
Örnek bir XML data;
Bir sistem bizden XML veri alıyorsa öncelikli aranması gereken konu XXE'dir. Aslında olaya sadece XXE zafiyeti arayarak ilerlememek gerekir. Çünkü sistem bizden aldığı değeri XML formattan parse edip arkada bir SQL sorgusunda geçiriyor ise bu sefer SQLi aranabilir. Bu şekilde örnekler çoğaltılabilir.
Note.dtd;
Bunu farklı bir şekilde kullanmanın yolu ise
şeklindedir. Ama bu kullanım dinamik kullanıma aykırı olduğu için farklı bir dökümanda bu DTD'yi kullanmak istediğimiz zaman kod tekrarına düşmüş oluruz. O yüzden bu kullanım pek uygun değildir.
XML Parser bu satırı gördüğü zaman benim bir Document Type Definition değerim var ve bunun adı da note olarak yorumluyor. Ama burada SYSTEM operandını söylüyor ve SYSTEM operandın karşılığı da ==External Document Type Definition== olarak geçer. Yani burada diyor ki gelen XML değerleri Note.dtd değerlerinde olacak demiş oluyoruz. Burada sisteme şu dosyayı oku demiş oluyoruz.
Entity aslında XML'de değişken oluşturmaya yarayan değerler olarak düşünebiliriz. Entity ile string değerler tanımlayabiliyoruz.
Burada ELEMENT yerine ENTITY tanımlayarak oluşturmuş olduğumuz tayfun ENTITY değerine "Tayfun Ürkut" değerini atamış olduk. XML taglarinin içerisinde pointer olarak çağırdığımız tayfun değeri sayesinde artık to taglari arasında "Tayfun Ürkut" değerini göreceğiz:
[!warning] Uyarı ENTITY operandının SYSTEM operandına erişimi vardır.
Bu durumda XML kaynağının bulunduğu sistem x.com adresine HTTP requesti gönderir. Burada SYSTEM operandından sonra URI SCHEMA (Protokol Handler) değerleri kullanılıp çeşitli isteklerde bulunabilir.
Örneğin: file:///folder/file, http://x.com
Burada zafiyetin tespiti için genellikle kullanılan payloada değinecek olursak;
şeklindedir.
Peki dönen cevap içerisinde bir XML format varsa;
Yani kısacası;
==&tayfun;== yerine XML veri formatı dönüyorsa. Yani
gibi bir durumda XML bunu parse edemez. Kendi içerisinde XML'i parse et gibi bir değer de yoktur.
Burada devreye Parameter Entity kavramı girer. Bir örnek saldırı simüle edecek olursak XML responsunda yine bir XML değer olduğunu varsayarsak;
İlk payloadımızın bu olur. Bu payload Parameter Entity değeri olan remote değerine bir HTTP isteği atar. Belirtilen URL bir .dtd dosyasını işaret eder. Dosyanın içeriği ise
şeklindedir.
Burada ==payl== parameter entity değeri ile bir dosyaya erişim işlemi yapılır. Daha sonrasında yine tanımlanmış olan ==int== parameter entity içerisine bir entity tanımı daha yapılır; içerideki ==&=37;== değeri ==int== değerinin encoded halidir. =="trick"== değeri ile bir HTTP request daha oluşturulur ve saldırgan kendi sunucusuna ==payl== değerini parametre olarak geçer ve dosyayı okuma işlemini başarı ile sonuçlandırır.