1) HttpOnly Nedir ?
2) XMLHttpRequest Nedir ?
3) XMLHttpRequest Yapısı ve Kullanımı ?
4) HttpOnly Bypass ?
1) HttpOnly Nedir ?
HttpOnly, Cookie değerlerine JavaScript aracılığıyla erişilmesinin kısıtlanması amacıyla geliştirilmiş bir önlemdir diyebiliriz. HttpOnly içerikli cookie değerleri JS tarafından okunamaz, sadece http isteklerine eklenir. Bu sayede saldırganın XSS gibi saldırılar ile hedef kullanıcıların cookie bilgilerine erişilmesi önlenmiş olur. Açıkcası HttpOnly kullanmak güvenlik açısından önemlidir, fakat bazı hatalar sonucu bu güvenlik aşılabilmekte. Konunun devamında bu durumdan bahsedeceğiz.
2) XMLHttpRequest Nedir ?
XMLHttpRequest, JavaScript içerisinde HTTP istekleri yapmanıza olanak sağlayan bir nesnedir. Bu nesne genelde arka planda sunucu ile haberleşmek amacıyla kullanılmaktadır.
Daha basit anlatmak gerekirse, tarayıcıda sayfanız yenilenmeden yapılan işlemler genellikle XMLHttpRequest vasıtasıyla gerçekleşir. Bu durum, sunucunun yorulmasını önler ve kullanıcıların daha hızlı işlem yapmasına olanak verir.
Bir saldırgan gözüyle değerlendirildiğinde XMLHttpRequest sadece XSS değil, başka zafiyetlerin kullanılması açısından da önemlidir. Bu nedenle saldırganların bu nesnenin kullanımına hakim olmaları fayda sağlayacaktır.
3) XMLHttpRequest Yapısı ve Kullanımı ?
Bu bilgiler doğrultusunda XHR (XMLHttpRequest) kullanımını GET ve POST istekleri üzerinden görelim.
Aşağıdaki JS kodu ile “localhost/xhr” adresine bir GET isteği atıyoruz, bu isteğe dönen cevabı response değişkenine atıyoruz ve response değişkenini console ekranına bastırıyoruz.
Şimdide POST methodunu kullanarak bir istekte bulunup, isteğimizin çıktısını alıyoruz.
XMLHttpRequest 'in kullanımı temel manada bu şekilde. HttpOnly ile XHR ilişkisi için aşağıdan devam edelim…
4) HttpOnly Bypass ?
Yukarıda HttpOnly olan cookie değerlerinde, JavaScript ile DOM nesnelerine erişemediğimizden bahsetmiştik. Bu durumu örnekler üzerinden inceleyelim.
Bu amaçla basit bir PHP script oluşturdum, ve HttpOnly cookie değeri atadım.
Bu scriptde “HttpOnlyCookie” adında bir cookie oluşturduk ve değerini “GizliCookie” olarak atadık. Daha sonra “localhost/xss.php?yaz=” üzerinden xss payloadımızı çalıştırdık fakat HttpOnyl olmayan cookie değerimize ulaşabilirken HttpOnly olan cookie değerimize ulaşamadık.
Bu durumun henüz %100 işleyen bir bypass yöntemi bulunmamaktadır. Fakat bir çok zafiyette olduğu gibi, sistemi yazanların yaptığı bazı hatalardan yola çıkarak bu durum bypass edilebilmekte.
Bir çok sistem login işlemi yapıldıktan sonra, login sayfasına veya bazı api sayfalarına atılan bir isteğe karşılık Cookie değerlerini, şifre değerlerini vs. döndürmektedir. Saldırgan bu durumdan faydalanarak XMLHttpRequest işlemini XSS üzerinden çalıştırarak bu sayfalara istek atıp, dönen cevabı elde edebilir. Bu şekilde HttpOnly olarak belirlenen cookie değerine ulaşabilir.
Bu senaryoya uygun bir “api/login.php” sayfası oluşturalım ve saldırgan olarak XSS ile bu sayfaya istek atıp, isteğimizin çıktısını alalım.
Oluşturduğumuz “api/login.php” dosyası tarayıcı üzerinden incelenebiliyor.
Fakat aynı dosyaya istek attığımızda Cookie HttpOnly olduğu için dosya içeriğinde cookie değerimizi göremiyoruz.
Bu durumda saldırgan oluşturduğu XSS payloadını XMLHttpRequest ile tekrardan düzenleyip “api/login.php” dosyasına istek atıp isteğin çıktısını alacak ve HttpOnly olan cookie değerine erişmiş olacak.
<script>
var xhr = new XMLHttpRequest();
var method = 'GET';
var url = 'http://localhost/httponly/api/login.php';
xhr.open(method,url,true);
xhr.send(null);
xhr.onreadystatechange = function()
{
alert(xhr.responseText);
}
</script>
2) XMLHttpRequest Nedir ?
3) XMLHttpRequest Yapısı ve Kullanımı ?
4) HttpOnly Bypass ?
1) HttpOnly Nedir ?
HttpOnly, Cookie değerlerine JavaScript aracılığıyla erişilmesinin kısıtlanması amacıyla geliştirilmiş bir önlemdir diyebiliriz. HttpOnly içerikli cookie değerleri JS tarafından okunamaz, sadece http isteklerine eklenir. Bu sayede saldırganın XSS gibi saldırılar ile hedef kullanıcıların cookie bilgilerine erişilmesi önlenmiş olur. Açıkcası HttpOnly kullanmak güvenlik açısından önemlidir, fakat bazı hatalar sonucu bu güvenlik aşılabilmekte. Konunun devamında bu durumdan bahsedeceğiz.
2) XMLHttpRequest Nedir ?
XMLHttpRequest, JavaScript içerisinde HTTP istekleri yapmanıza olanak sağlayan bir nesnedir. Bu nesne genelde arka planda sunucu ile haberleşmek amacıyla kullanılmaktadır.
Daha basit anlatmak gerekirse, tarayıcıda sayfanız yenilenmeden yapılan işlemler genellikle XMLHttpRequest vasıtasıyla gerçekleşir. Bu durum, sunucunun yorulmasını önler ve kullanıcıların daha hızlı işlem yapmasına olanak verir.
Bir saldırgan gözüyle değerlendirildiğinde XMLHttpRequest sadece XSS değil, başka zafiyetlerin kullanılması açısından da önemlidir. Bu nedenle saldırganların bu nesnenin kullanımına hakim olmaları fayda sağlayacaktır.
3) XMLHttpRequest Yapısı ve Kullanımı ?
readyState = HTTP isteğinin durumunu bildirir.
0 → İstek başlamadı.
1 → Sunucuya bağlandı.
2 → İstek alındı.
3 → İstek işleniyor.
4 → İstek tamamlandı.
onreadystatechange = readyState değiştiğinde tetiklenecek bölümdür.
responseText = HTTP isteğine dönen yanıtı içerir.
status = HTTP Status kodlarını verir.
getAllResponseHeaders() = İstek Header bilgilerini verir.
open(METHOD, URL , true) = HTTP isteğinin methodunu, asenkron çalışıp çalışmaması gibi durumlarını tanımlar.
send() = HTTP isteğini başlatır, POST edilecek data varsa bu datayı alan bölümdür.
setRequestHeader(baslik,deger) = HTTP isteğine eklenmek istenen HTTP başlıklarının tanımlandığı bölüm.
Bu bilgiler doğrultusunda XHR (XMLHttpRequest) kullanımını GET ve POST istekleri üzerinden görelim.
Aşağıdaki JS kodu ile “localhost/xhr” adresine bir GET isteği atıyoruz, bu isteğe dönen cevabı response değişkenine atıyoruz ve response değişkenini console ekranına bastırıyoruz.
var xhr = new XMLHttpRequest();
var method = ‘GET’;
var url = ‘http://localhost/xhr’;
xhr.open(method,url,true);
xhr.send(null);
xhr.onreadystatechange = function()
{
var response = xhr.responseText;
console.log(response);
}
Şimdide POST methodunu kullanarak bir istekte bulunup, isteğimizin çıktısını alıyoruz.
var xhr = new XMLHttpRequest();
var method = ‘POST’;
var url = ‘http://localhost/postXHR’;
var postdata = ‘jonturk - vvHack.Org’;
xhr.open(method,url,true);
xhr.send(postdata);
xhr.onreadystatechange = function()
{
var response = xhr.responseText;
console.log(response);
}
XMLHttpRequest 'in kullanımı temel manada bu şekilde. HttpOnly ile XHR ilişkisi için aşağıdan devam edelim…
4) HttpOnly Bypass ?
Yukarıda HttpOnly olan cookie değerlerinde, JavaScript ile DOM nesnelerine erişemediğimizden bahsetmiştik. Bu durumu örnekler üzerinden inceleyelim.
Bu amaçla basit bir PHP script oluşturdum, ve HttpOnly cookie değeri atadım.
Bu scriptde “HttpOnlyCookie” adında bir cookie oluşturduk ve değerini “GizliCookie” olarak atadık. Daha sonra “localhost/xss.php?yaz=” üzerinden xss payloadımızı çalıştırdık fakat HttpOnyl olmayan cookie değerimize ulaşabilirken HttpOnly olan cookie değerimize ulaşamadık.
Bu durumun henüz %100 işleyen bir bypass yöntemi bulunmamaktadır. Fakat bir çok zafiyette olduğu gibi, sistemi yazanların yaptığı bazı hatalardan yola çıkarak bu durum bypass edilebilmekte.
Bir çok sistem login işlemi yapıldıktan sonra, login sayfasına veya bazı api sayfalarına atılan bir isteğe karşılık Cookie değerlerini, şifre değerlerini vs. döndürmektedir. Saldırgan bu durumdan faydalanarak XMLHttpRequest işlemini XSS üzerinden çalıştırarak bu sayfalara istek atıp, dönen cevabı elde edebilir. Bu şekilde HttpOnly olarak belirlenen cookie değerine ulaşabilir.
Bu senaryoya uygun bir “api/login.php” sayfası oluşturalım ve saldırgan olarak XSS ile bu sayfaya istek atıp, isteğimizin çıktısını alalım.
Oluşturduğumuz “api/login.php” dosyası tarayıcı üzerinden incelenebiliyor.
Fakat aynı dosyaya istek attığımızda Cookie HttpOnly olduğu için dosya içeriğinde cookie değerimizi göremiyoruz.
Bu durumda saldırgan oluşturduğu XSS payloadını XMLHttpRequest ile tekrardan düzenleyip “api/login.php” dosyasına istek atıp isteğin çıktısını alacak ve HttpOnly olan cookie değerine erişmiş olacak.
<script>
var xhr = new XMLHttpRequest();
var method = 'GET';
var url = 'http://localhost/httponly/api/login.php';
xhr.open(method,url,true);
xhr.send(null);
xhr.onreadystatechange = function()
{
alert(xhr.responseText);
}
</script>
Moderatör tarafında düzenlendi: