SGE Blog Yayınları

Web Uygulamalarda XSS (Content-Sniffing) Açıklığı

Web Uygulamalarda XSS (Content-Sniffing) Açıklığı

yazan Hasan Fatih Şimşek -
Number of replies: 0

Web tarayıcılar web sunuculardan gelen yanıt paketlerini okurken yanıt paketlerindeki Content-Type başlığına bakarlar ve ona göre paket içeriğini okuma / yorumlama ve ekrana sunma uygularlar. Fakat yanıt paketlerinde Content-Type başlığı bozuk değerde olursa veya Content-Type başlığı hiç yer almazsa yanıt paketinin doğru okunabilmesi / yorumlanabilmesi ve ekrana sunulabilmesi amacıyla web tarayıcı yazılımları (özellikle Internet Explorer) yanıt paketi içerisindeki içerik üzerinde Content Sniffing prosedürünü uygularlar. Bu şekilde gelen paket içerisindeki içeriğin MIME türünü saptarlar ve bu bilgi doğrultusunda paketi okuma / yorumlama yapıp bize arayüzde sunarlar. Böylece yanıt paketini (uygulama sayfasını) doğru bir şekilde görüntüleyebiliyor oluruz. 

Content-Type başlığının bozuk değerde olması veya hiç olmaması web tarayıcıların yanıt paketini ekrana sunması noktasında Content-Sniffing özelliklerini çalıştırmasını tetikler. Böylece paket Content-Type bilgisi paket içerisindeki body bölgesindeki veride Content Sniff’leme yapılmak suretiyle elde edilir ve paket okuması / yorumlaması buna göre yapılarak ekrana sunma gerçekleşir. 

Web tarayıcılardaki Content Sniffing özelliği web uygulamalara bir esneklik sunmak amacıyla tasarlanmış olmalı ki bu sayede web uygulamalarda paket türü bilgisi konulmadığı / unutulduğu veya bozuk değerde olduğu durumlarda tarayıcılar yine de tür bilgisini kendileri saptayıp görüntüleme sunabilmekteler. Fakat bu aynı zamanda bir güvenlik riski teşkil etmektedir. 

Örneğin kullanıcı girdilerinin geri yansıtıldığı web uygulama sayfalarında yanıt paketlerinde Content-Type başlığının konulmaması / unutulması veya bozuk değerde olması yanıt paketinin tarayıcıda Content Sniffing’e tabi tutulmasını ve bu sayede paket içerisindeki geri yansıyan kullanıcı girdisinin türünün paket türü olarak sayılmasına sebebiyet verebilir. Bu şekilde kullanıcı gireceği zararlı girdiler ile geri yansıyan pakette normalde girdileri string sayılmalıyken çalıştırılabilir girdi haline dönüşebilir. 

XSS (Content-Sniffing) saldırısı kullanıcının girdi olarak verdiği xss payload’unun geri yansıyacağı sayfada normalde string olarak yansıması beklenirken yanıt paketinin Content-Type bilgisine sahip olmayışı veya bozuk sahip oluşu dolayısıyla tarayıcının pakette Content Sniff’leme yapması ve paketin türü bilgisini kullanıcı girdisi türü bilgisine göre değerlendirip ona göre paketi okuması / yorumlaması sonrası sunması sonucu xss payload’unun çalışır halde tarayıcıya yansıtılmasına denir. Normalde yanıt paketinde Content-Type bilgisi yer almış olsaydı kullanıcı girdisine göre yanıt paketi türü değişmeyecekti ve bu nedenle XSS payload’u string olarak değerlendirilip çalıştırılmayacaktı. 

XSS (Content-Sniffing) zafiyeti Content Sniffing yapma prosedürüne sahip web tarayıcılarda meydana gelir. Internet Explorer bu yönden önde konumdadır.

Not: Tarayıcılarda Content Sniff’leme özelliği spesifik anlarda tetiklenir. Bunun için bir http spesifikasyonuna sahiptir.

XSS (Content-Sniffing) Önlem

Bu saldırıdan kullanıcıları korumak için bir http güvenlik başlığı olan X-Content-Type-Options yanıt paketlerine eklenmelidir. Bu sayede yanıt paketi Content-Type bilgisine bozuk değerde sahip olsa da veya Content-Type bilgisine hiç sahip olmasa da X-Content-Type-Options yanıt başlığı tarayıcıya Content Sniff’leme özelliğini çalıştırmama direktifi verecektir ve paket türü bilgisi için saptama çalıştırılmayacaktır. Paket türü bilinmeyen olarak bırakılıp içerik ekrana sunulması önlenecektir. Bu sayede kullanıcı girdisinin geri yansıtıldığı yanıt paketlerinde Content-Type eksikliğinden veya bozuk değere sahip oluşundan yararlanarak girdi türünün paket türü olarak değerlendirilmesi ve girdinin normalde string kalması gerekirken çalıştırılabilir hale gelmesi önlenebilir.

Sonuç

Tarayıcılar yanıt paketleri Content-Type başlık bilgisi bozuk değerde olduğunda veya başlık bilgisi hiç olmadığında Content Sniffing adı verilen özelliklerini çalıştırırlar ve yanıt paketi türü bilgisini içerikten elde eder, sonra paketi elde edilen tür bilgisi ile yorumlayıp ekrana sunarlar. Yanıt paketleri içerisinde Content-Type’ın açıkça belirtilmemesi veya yanlış değerde belirtilmesi kullanıcı girdilerinin yer aldığı yanıt paketleri durumunda kullanıcı girdisinin yanıt paketinin türü olarak sayılmasına sebebiyet verebilir ve bu yolla kullanıcı girdisi türünde okunan / yorumlanan paketin ekrana girdinin çalışabildiği şekliyle yansıtılmasına yol açabilir. 

Örnek

Örneğin uygulama bir sayfası parametreye girdi olarak verilen değer sonucu json formatta hata yanıtı dönmektedir. Uygulamanın bu sayfasındaki parametreye XSS payload’u verildiğinde yanıt olarak hata mesajı içerisinde XSS payload’u dönmektedir. Fakat yanıt paketi json formatta hata mesajını döndüğünden içerisindeki XSS payload’u (javascript kodu) çalışmamaktadır.

// Uygulama sayfasındaki op parametresine XSS payload’u girilir

Http Talep:

GET /webhdfs/v1/?op=LISTSTATUS'"()%26%25<acx><ScRiPt%20>J4Um(9462)</ScRiPt> HTTP/1.1
Referer: http://X.X.X.X:5070/
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate
Host: X.X.X.X:5070
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
Connection: Keep-alive

Yanıt olarak dönen paket json formattadır ve içerik olarak json içerik barındırırken gönderdiğimiz XSS payload'unu da hataya sebebiyet verdi diye bilgilendirmek maksatlı geri yansıtmaktadır.

Http Yanıt:

HTTP/1.1 200 OK
Cache-Control: no-cache
Expires: Wed, 08 Jan 2020 07:30:25 GMT
Date: Wed, 08 Jan 2020 07:30:25 GMT
Pragma: no-cache
Expires: Wed, 08 Jan 2020 07:30:25 GMT
Date: Wed, 08 Jan 2020 07:30:25 GMT
Pragma: no-cache
Content-Type: application/json                                                    // Paket Json Formatta
X-FRAME-OPTIONS: SAMEORIGIN
Server: Apache
Content-Length: 288
{"RemoteException":{"exception":"IllegalArgumentException",
"javaClassName":"java.lang.IllegalArgumentException",
"message":"Invalid value for webhdfs parameter \"op\": No enum 
constant org.apache.hadoop.hdfs.web.resources.
GetOpParam.Op.LISTSTATUS'\"()&%<ACX><SCRIPT >J4UM(9462)</SCRIPT>"}}              // XSS Payload'u Barındırıyor 

Uygulama bu sayfasındaki hata mesajlarını json formatta dönmektedir. Json formatta gelen hata mesajı içerisindeki XSS kodu ise paket formatı gereği json okumasıyla okunduğundan kullanıcı ekranında çalışmayacaktır. Bu XSS kodu sayfada hata mesajıyla beraber json içeriğinde string olarak yer edecektir. Eğer uygulama sunucusunda yanıt paketlerine X-Content-Type-Options başlığı ilavesi yapılmamaktaysa Content-Type ile eş durumda olmayan paket alt içeriği XSS payload girdisi tarayıcılarda Content-Type düzeltmesi yapmak için Content Sniffing özelliğini çalıştırmayı tetikleyebilir ve bu yolla paket türü bilgisi alt içeriğe göre şekillenerek paket okuması / yorumlaması yapılabilir. Bu ise alt içeriğin tarayıcı ekranında string olarak değil, çalışır halde yansıması demek olur. Dolayısıyla kullanıcılar op parametresine XSS payload’u ekli halde url adresine gittiklerinde tarayıcıların Content Sniffing özelliğini kullanmaları ile Content-Type düzeltmesi yaşamaları ve ekrana yansıtılan yanıt paketini bu türden görüntüleme sonucu zarar görebilirler. 

Örnek bir senaryo: Bu paketi oluşturup yollayacak bir url adresi hazırlanabilir ve çeşitli yöntemlerle kurbanlara aktarılarak tıklanması sonucu kurbanların çerezleri çalınabilir, hangi tuş takımını tuşladıkları bilgisi toplanabilir, ... vs.

Kaynaklar

https://en.wikipedia.org/wiki/Content_sniffing

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options

https://www.geeksforgeeks.org/http-headers-x-content-type-options/

https://geekflare.com/http-header-implementation/

https://www.acunetix.com/vulnerabilities/web/cross-site-scripting-content-sniffing/

https://www.denimgroup.com/resources/blog/2019/05/mime-sniffing-in-browsers-and-the-security-implications/

https://hackerone.com/reports/363845


944 kelime