XSS HttpOnly Bypass

Cezeri

Yönetici
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ı ?

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);
}


bf7a8b6b799d1f27aaba3fef450ffc8c20f6950b.png




Ş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);
}


63bf841bf73775f7a65a9b66bd5d0a9bdf15c273.png




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.



990f7fc115b206e2f163dc69e9801a0cd0053ba3.png



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.



21df88d69ea7d78c18e1ff355357ba1a3540a9e8.png




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.

2020-01-11%2002-23-03%20ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC


Fakat aynı dosyaya istek attığımızda Cookie HttpOnly olduğu için dosya içeriğinde cookie değerimizi göremiyoruz.

2020-01-11%2002-20-53%20ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC


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>



8c55bbdbb3621e380eedf40562698d4b64dd18e1.png
 
Moderatör tarafında düzenlendi:
40.png
Cezeri:
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.
Hocam burada belirttiğinize bir web uygulamasından örnek verebilir misiniz? Örnekte anlattığınız “api/login.php” ekran görüntüsünde cookieyi direk göstermesi durumunu tam anlayamadım.

Ben A web uygulamasında XSS buldum. sonrasında bu şartı sağlayacak yeri nasıl bulacağım. responselarda parola mı aramalıyım? Bu durumu tam netleştiremedim. Eğer mümkünse bir burp request/response ekran görüntüsü paylaşma imkanınız var mı?
 

Cezeri

Yönetici
Hocam burada belirttiğinize bir web uygulamasından örnek verebilir misiniz? Örnekte anlattığınız “api/login.php” ekran görüntüsünde cookieyi direk göstermesi durumunu tam anlayamadım.

Ben A web uygulamasında XSS buldum. sonrasında bu şartı sağlayacak yeri nasıl bulacağım. responselarda parola mı aramalıyım? Bu durumu tam netleştiremedim. Eğer mümkünse bir burp request/response ekran görüntüsü paylaşma imkanınız var mı?
Bunu genellikle her isteğe sabit bir session veya token vs. atamak amacıyla yapıyorlar ya da daha düşük bir ihtimalle “şifremi unuttum” uygulamalarında kişiye api aracılığıyla dönüş yapabilmek gibi amaçlarla yapabiliyorlar.

Bu token, session değerleri IDOR tarzı zafiyetleri kullanabilmek konusunda size yardımcı olur. Bunun dışında CSRF bypass amacıyla veya kişinin oturumuna erişmek amacıyla kullanabiliriz. Yani bu XMLHTTPRequest kullanımı size bir çok konu da yardımcı olabilecektir.

Şartı sağlayan yeri, dediğiniz gibi responseları kontrol ederek veyahut api kullanımı public olan yerlerde dökümanları okuyarak bulabilirsiniz.

Daha kolay anlamak için aşağıdaki yazıya göz atabilirsiniz ;

 
Üst