XSS Bypass Yarışması – 1 [ Çözüm ]

Merhaba

XSS zafiyetlerine karşı alınan güvenlik önlemlerini aşmak html, javascript bilgisine ve en çokta uygulamanın davranışını analiz edebilmeye dayanmaktadır. Bu nedenle egzersiz yapabileceğiniz bir basit uygulama yazarak http://lab.mehmetince.net/h4ckm3/xss-1/ adresinde yarışma başlattım. Eğer yarışmaya katılmamış arkadaşlar bu yazıyı okuyorlarsa, linkte yıklayarak yarışmaya erişebilirler. Bu adımdan sonra anlatılanlar çözüme yönelik olacaktır.

XSS Bypass Yarışması – 1 için geliştirilen kodlar, gerçek hayatta bire bir tecrübe ettiğim bir durumu simule etmektedir. Gelen çözümlere ve benim gerçek hayatta karşılaştığım anda çözüm ürettiğim yönteme geçmeden önce  uygulamanın kaynak kodlarını analiz edelim.

<?php
/**
 * Created by PhpStorm.
 * User: mince
 * Date: 3/8/14
 * Time: 8:38 PM
 */
?>
<html xmlns="http://www.w3.org/1999/html" lang="UTF-8">
    <head>
        <META http-equiv=content-type content=text/html;charset=iso-8859-9>
        <!-- At kafası -->
        <script>
            window.onload = function() {
                <?php
                setcookie('internet', 'ozgurlugu!!!');
                if(@$_REQUEST['ali']){
                    $foo = htmlspecialchars($_REQUEST['ali']);
                    $zararli = array('alert', 'confirm', 'write', 'img', 'svg', 'prompt');
                    $foo = str_replace($zararli, '', strtolower($foo));
                    echo "document.getElementById('icerik').innerHTML = '".$foo."';";
                }
                ?>
            }
        </script>
    </head>
    <div style="text-align: center;">
        <h3>XSS Yarismasi - 1</h3>
        <h4>Hedef : ekrana mesaj kutusu çıkartarak içerikte cookie değerini göstermek.</h4>
        <h4>XSS Payloadlarınızı @mmetince hesabına iletebilirsiniz. </h4>
        <div id="icerik">w8 input</div>
        <body>
        <form action="index.php" method="GET">
            <input type="text" name="ali" placeholder="XSS saldirisi yaziniz.">
            <input type="submit" value="Gonder"></input>
        </form>
        </body>
    </div>
</html>

Görüldüğü üzere kullanıcı inputundan alınan değer htmlspecialchars fonksiyonundan geçirilmektedir. Bu fonksiyon <,> gibi karaketerleri encode etmektedir. Bu nedenle herhangi bir html tag başlangıcı yapmak mümkün değildir. Kullanıcı girdisi dönen sayfada javascript tag’leri arasında olduğu için herhangi bir tag başlangıcına gerek kalmadan direk javascript kodları yazılabilir. Bu sayede htmlspecialchars metodu atlatılmaktadır.

Ayrıca eğer kullanıcı girdisi olan string içerisinde $zararli dizisinde tanımlanan değerler varsa bu değerler kaldırılmaktadır. Rekürsif bir kontrol gerçekleştirilmediği için alALERTert girdisi yapıldığında, uygulama alert gördüğü kısmı sileceği için geriye bir alert daha kalmış olacaktır. Bu sayede black list kontrol’ün atlatılması mümkün olmaktadır.

Yarışmaya bu yazının hazırlandığı tarihte 559 adet XSS payloadı içeren talep gönderilmiştir. Bunlardan sadece Yasir Taşdemir’in XSS saldırısı bypass işlemini gerçekleştirmeyi başarmıştır.

xss yarışması 1

 

Yöntem olarak XSS Bypass başarılı olan bu payload yerine çok daha basit olan aşağıdaki payload kullanılabilir.

lab.mehmetince.net/h4ckm3/xss-1/index.php?ali=’; alALERTert(/mehmet_ince/);f=’

Yarışmaya katılan tüm arkadaşlara teşekkür ederim. Her ay böyle bir yarışma ile düzenleyerek payload oluşturma yöntemlerindeki inceliklere değinmeye çalışacağım.