Xss Açığı ile Ne Yapabiliriz ?

Başlıktan da anlayacağınız gibi XSS Açığı İle ne yapılabilir onu yazdım. Ama yazı bana ait değil. Çok iyi anlatıldığından ve hoşuma gittiğinden burda paylaşmak istedim. Yazının asıl sahibi “Türk Güvenliği ekibinden Yasir Taşdemir (Agd_Scorp)”dir. Kendileri Dünyanın en iyilerindendir.(bence en iyisi)  Hepsine selam olsun ; )

 

1) SSI Injection
SSI (server side include) shtml sayfaların çalışma mantığıdır. Sayfa html olsa bile yorum satırı arasına yazılan komutlar client side değil, server side olarak çalıştırılır.
Örnek kullanım şekli şudur;

örneğin yukarıdaki satır bir .shtml sayfada bulunursa; veya sayfa shtml olmasa, php,asp,aspx ve hatta html olsa bile web application serverda SSI ayarları açıksa, ekrana sistem tarih saatini basacaktır.

Bu özelliği xss ile kombo çekersek sistemde komut çalıştırmamız mümkün olur.
örneğin;

açığımız olsun

gönderdiğimizde sayfada tarihi görüyorsak SSI komutları çalıştırabiliriz demektir.
SSI komutlarına aşağıda detaylı bi şekilde erişebilirsiniz;

ama benim favorim;
<!–#exec cmd=”ls -la”–>

Not: Dom xss te çıktılar javascript üzerinden alınıp tarayıcı tarafından üretildiği için, doğrudan response a yansımadığı için SSI injection’a çevirme lüksüne sahip değiliz.

 

2) COOKIE Çalma;
Bildiğiniz üzere XSS ile javascript çalıştırabiliriz, bu da demektir ki javascript üzerinden erişilebilen her şeye erişebiliriz.
Buna document.cookie nesnesi de dahil.
Peki cookie yi nasıl çalarız?

Açıklı parametre GET metodu ile alınıyorsa;

Burada “a” sayfası kendi hazırladığımız javascripttir. Kullandığım snifferdan örnek verecek olursam şuna benzer bi kod barındırır;

Burada javascript kodu üzerinden bir image nesnesi oluşturulur ve

verileri img src edilir.
log.php sayfamızda ise dışarıdan gelen değerleri loglarız.
Bu sayede document.cookie ve document.location değerlerini loglamış oluruz.

kodunu da kullanabilirdik, burada amaç karmaşıklığı azaltmak ve mümkün olduğunca özel karakter kullanmamak.

Peki bunu admine nasıl tıklatırız?

Adama doğrudan

şeklinde link atarsanız muhtemelen tıklamayacaktır.
Onun yerine 2 farklı yöntem kullanabilirsiniz
1. yöntem “ara=” dan sonraki tüm karakterleri hex formatında yazmaktır. Ancak çoğu tarayıcı artık özel karakterler dışındakileri hex formatında yazsanız da karakter olarak gösterdiğinden eskisi gibi iş görmüyor.
Onun yerine en mantıklısı size ait bir sitede sayfaya şuna benzer bir kod eklemenizdir;

Daha sonra adama http://benimsitem.com/sayfa.html şeklinde iframe kodlu sayfanın linkini atmaktır.

POST metoduyla alınan parametre üzerinde var olan XSS açığının kullanımı;
Örneğin xss imiz “ara” parametresini get değil de post metodu ile alıyor olsun; POST dedimmi akla “form” gelir.
Önce şu şekilde bir form hazırlarız;

Bu formu hazırlasak bile açıldığında kendi kendine post yaptırmamız lazım. O yüzden şu javascript kodunu da sayfanın sonuna ekliyoruz.

Bu kod sayfa ziyaret edildiği anda formu otomatik post yapacaktır.

Sayfamızı “xss.htm” olarak kaydettik ve sayfayı admine direk atmayacağımıza göre kendi sitemize yükledik.
http://benimsitem.com/xss.htm” şeklinde linkimiz oldu.
Ancak bunu da admine direk attığımızda açar açmaz form yönleneceği için kıllanma ihtimali yüksek. Tekrar iframe li sayfa hazırlıyoruz.

ve bu kodu örneğin index.html sonuna ekliyoruz.
Admine http://benimsitem.com linkini atıyoruz ve admin tıkladığında arka planda cookie’ler bize geliyor.

NOT:
HttpOnly cookieler;
Server cookie üretirken sonuna  “; HttpOnly eklediyse, tarayıcı bu cookielere erişimi javascripte kısıtlar. Yani javascriptin document.cookie nesnesinde bu cookieleri göremezsiniz. Eskiden bu kısıtlama Trace metodu ile Set-Cookie response headerı okunarak aşılabiliyordu. Normalde bu header’a javascript istekleriyle erişemezsiniz. Ancak akıllandılar ve bu yöntem de yalan oldu.

 

Örneğin resimde http başlığı işaretli olanlar bu sınıfa girmektedir. Bu cookielere javascript üzerinden erişemezsiniz.

Geriye tek bir yöntem kalır. CSRF

Bildiğiniz gibi csrf, “csrf token” parametresi veya HTTP header‘lar üzerinden kod doğrulaması yapmayan sayfalarda kullanıcıya otomatik istek göndertme saldırılarıdır. Misal bu tip bir saldırı ile kullanıcıya bir sayfa ziyaret ettirilir. Bu sayfaya kendi profili veya ayarları üzerinde değişiklik yaptırtacak forma veya url ye aynı xss te hazırladığımız gibi otomatik gönderecek bir sayfa iframe ettirilir. Kişi sayfayı ziyaret ettiğinde otomatik olarak örneğin email bilgisi güncellenmiş olur.

Ancak dediğimiz gibi artık hemen hemen her script csrf-token kullanmaktadır. Burada XSS ten faydalanırsak, form ziyaret edildiğinde üretilen csrf-token bilgisini çekebiliriz.

Bu iş için XmlHttpRequest ten faydalanacağız. Normalde XHR isteği tarayıcıların güvenlik poliçesi gereği sadece aynı domaine gönderilebilir(same-origin policy). Bu da demektir ki
http://site.com/profil.php” ye “http://site.com” altında bir sayfadan istek gönderebiliriz.
Zaten XSS açığımız da bu işe yarayacak 😉

Saldırı yapılacak sitedeki bilgi güncelleme formu şu şekilde olsun;

Bu form dikkat ettiyseniz site tarafından üretilmiş bir csrf-token parametresi barındırmaktadır ve kullanıcıdan aldığı tokenle sitedekini karşılaştırıp eşleştirme sağlarsa güncelleme işlemi gerçekleştirmektedir.

Örnek bir XmlHttpRequest kodu aşağıda verilmiştir;

Bu kodda en üstte formumuz mevcuttur. Bu form postlandığında girdiğimiz değerler güncellenecektir ancak csrf-tokeni bilmemekteyiz.
Yukarıdaki javascript kodları çalıştığında şu adımlar gerçekleşir;
1. http://site.com/profil.php sayfasına istek gönderilir.
2. Geri dönen yanıt sayfası alınır ve ayıkla fonksiyonuna gönderilir. Burada ayıkla fonksiyonunu yazmadım. Bu fonksiyon profil.php nin ürettiği yanıt sayfasından csrf-token değerini ayıklar.
3. Alınan değer formumuzdaki csrf-token parametresine verilir.
4. Form postlanır.
5. Heklediniz.

Bu kodları xss kodu olarak yazmak zor bir iştir. Neticede uzun ve karmaşık, artı özel karakterlerden oluşan kodlardır.
Önce kodları base64 e çeviririz.

Elde etmiş oluruz. Artık XSS li sayfadan saldırı kodunu şu şekilde çağırabiliriz.

Veya script tag’leri arasındaki kodu kendi sitenize yükleyip, <Script src=” ile de çağırabilirsiniz.

Okuduğunuz için teşekkürler 🙂 Diğer Yazılarda ilginizi çekebilir 🙂 Bir başka yazıda görüşmek üzere 🙂

Bunlara da bakmak isteyebilirsin ;)

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir