Archive for July 2014

Sqlmap ile CSRF Bypass

Merhabalar,

 

Birçok güvenlik araştırmacısı penetrasyon testleri yaparken, zafiyet tespit edebilmek için veya tespit ettikleri zafiyetleri exploit edebilmek adına çeşitli araçlardan faydalanmaktadır. Bu araçlar genel olarak işlemleri otomatik hale getiriyor olsalar da kısmen yetersiz kaldıkları durumlar veya güvenlik denetimlerine takıldıkları zamanlar vardır. Bu başlık altında SQLMap aracını kullanarak CSRF(Cross-site Request Forgery) için alınmış bir dizi önlemi bypass etmenin yollarına deyineceğim.

ttttaaa

 

Burada kullanılan CSRF mekanizmasının çalışma anatomisine göz atacak olursak, Server’ın, Client için gönderdiği cevapta (response) sayfa içerisindeki formlar için random bir token oluşturulmuş. Server Client’tan gelecek olan her istek için bu token değerini beklemektedir. Eğer bu token gönderilirse, Istek(request) için Cevap(response) verilecektir. Sayfa her yenilendiğinde (her request için) o sayfaya özel uniq bir token oluşturulmakta ve yapılacak istek için bu token beklenmektedir.

 

SQLMap aracının bu seneryo/mekanizma içerisinde kullanacağımızı düşünürsek, yapılacak atack’ın başarısız olacağını hemen anlayabiliriz.SQLMap’ın bu seneryo içerisinde server için yapacağı her istek içerisinde server için bir token göndermesi gerekmektedir. Bu tip bir durum için SQLMap içerisinde yapılacak ufak bir kaç değişiklik ile SQLMap için bu yetenek kazandırılabilinir.

Hedefimiz SQLMap aracığını çalışma mekanizmasını değiştirmek suretiyle yapacağı her istek(request) öncesinde Server’dan ilgili token değerini alıp, yapacağı bir sonraki istek(request) içerisinde bu token’ı kullanması. Bu sebeple bulmamız gereken öncelikli şey SQLMap aracının istek yapmış olduğu modül.

https://github.com/sqlmapproject/sqlmap/blob/master/lib/request/connect.py

SQLMap aracı biraz incelediğimizde yapılan her istek için connect.py içerisinde bulunan getPage functionını kullandığını açıkça görebilmekteyiz. Seneryomuza göre yapılacak her işlem için SQLMap aracının server ile iletişim sağlaması ise bu function içerisinde değişiklik yapmamız bizim için yeterli olacaktır.

Seneryomuza göre şimdiki hedefimiz server’ın client için oluşturduğu token’ı sayfa içerisinde tespit etmek. Bunu anlamak için giden trafiği veya sayfa içerisinde source code’un incelenmesi faydalı olacaktır.

Bizim örneğimizde __RequestVerificationToken değeri içerisinde gidip geldiğini görüyoruz.

 

fffkret

Server’ın client için oluşturduğu random token’ın tutulduğu input değerini tespit ettik, Şimdiki hedefimiz sunucuya kendi cookie değerimiz ile istekte(request) bulunup, bize göndermiş olduğu cevap(response) içerisinde __RequestVerificationToken değerini alıp, SQLMap içerisinde gönderilecek post değeri içerisine yerleştirmek.

connectpy

 

Yukarıda görmüş olduğunuz gibi connect.py içerisinde getpage functionında değişiklikler yaptım, 1. aşama olarak server için kendi cookie değerimi set ediyorum ve 2. aşamada bu cookie değeri ile server’a istek yapıyorum(request). 2. aşamada server’ın bana göndermiş olduğu cevap(response) içerisinde aradığım __RequestVerificationToken değerini parçalıyorum(parse ediyorum). Bu değeri alıp 4 aşamada SQLMap’in post parametresinin içerisindeki csrfid değişkeni ile server’dan aldığım değişkeni yer değiştiriyorum. Bu sayede SQLMap yapacağı her istek içerisinde server’a requestverification token yollamış oluyor.
ffffa

Sqlmap içerisinde __RequestVerificationToken parametresinin değerini csrfid olarak verdiğim için her istekte alınan request token burayla yer değiştirilecektir.

Bu mantık ile farklı uygulamalarda farklı denetimleri bypass edebilirsiniz.

Herkese iyi çalışmalar dilerim

İbrahim

Baliç Bilişim Sitesi ve Eğitim İçerikleri Yenilendi.

Merhabalar,

Baliç Bilişim’in websitesi ve eğitim içerikleri yenilendi.

www.balicbilisim.com