XSS Filter Bypass ve Cookie Peki Nasıl ?

hack-the-planet-hacker-cat.gif


XSS Filter Bypass ve Cookie Peki Nasıl ?


Codeigniter, PHP ile yeni tanışan geliştiricilerin tercih ettiği popüler framework’lerden bir tanesidir. Framework olarak güvenlik önlemlerine dikkat edilsede, yetersiz kalınmış noktalar bulunmakta. Codeigniter geliştiricilerin bu noktada en çok dikkat etmeleri gereken 2 madde bulunmaktadır. Bu iki madde ise Cookie’ler ve XSS saldırıları.

Codeigniter Cookie Sistemi

Codeigniter dökümantasyonunda güvenlik açısından çok ciddi bir fark yaratan aşağıdaki satır bulunmaktadır.

Kod:
The Session class stores session information for each user as serialized (and optionally encrypted) data in a cookie.

Codeigniter framework’ü geliştiricilerinin bu kararı neden aldıklarını bilememekle birlikte, session’a yazılan dataların tamamı aslında kullanıcıya cookie olarak gönderilmektedir. Örnek olarak aşağıdaki gibi bir yapı kurulursa, yazılımda Broken Authentication and Session Management zafiyeti bulunmaktadır.
  1. admin isminde controller bulunmaktadır.​
  2. Controllerin kurucu fonksiyonunda kullanıcı session’ında is_admin = 1 olup olmadığı kontrol edilmektedir.
Session bilgileri Cookie serialize edilerek yazıldığı için saldırgan tarafından Cookie bilgisi düzenlenerek bu kontrol atlatılabilir. Codeigniter’ın bu zafiyetinin engellenmesi için Cookie bilgilerinin encrypt edilmesi gerekmektedir.

Cookie bilgilerinin encrypt edilmesi için
config.php dosyasında encryption_key atandıktan sonra aşağıdaki ayarların yapılması gerekmektedir.


Kod:
$config['sess_cookie_name']        = 'ci_session';
$config['sess_expiration']        = 7200;
$config['sess_expire_on_close']    = FALSE;
$config['sess_encrypt_cookie']    = TRUE;
$config['sess_use_database']    = FALSE;
$config['sess_table_name']        = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent']    = TRUE;
$config['sess_time_to_update']    = 300;

CSRF Aktifleştirilmesi

Ön tanımlı kurulum ile Codeigniter kullanıldığında, HTML Form’lar için CSRF token oluşturulmamaktadır. Bu token’in oluşturulması için config.php dosyasında aşağıdaki tanımlamaların yapılması gerekmektedir.


Kod:
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;

CSRF Toke’in her html formuna yerleştirilmesi için form_open ve form_close metodlarının kullanılması gerekmektedir. Sunucu tarafında bu token’in doğru olup olmadığını kontrolü içinse form_validation sınıfı ile form’um kontrolden geçirilmesi gerekmektedir.

Codeigniter XSS Filter Bypass

Codeigniter kullanıcı girdileri üzerinde XSS filtrelemesi gerçekleştirebilmektedir. Bu kontrol config.php dosyasında global_xss_filtering ‘ın TRUE atanması ile uygulama genelinde çalıştırılabilir.

Codeigniter’ın XSS filter modülünü test etmek için bir adet controller ve bir adet view dosyası oluşturulmuştur.

Controller Sınıfı


Kod:
class Welcome extends CI_Controller {

    var $data = array();
    public function index()
    {
        $this->data['param'] = $this->input->post('param', TRUE);
        $this->load->view('welcome_message', $this->data);
    }
}

View Dosyası

Kod:
<div id="container">
    <h1>Welcome to CodeIgniter!</h1>

    <div id="body">
        <p><?php echo $param?></p>
    </div>

    <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds</p>
</div>

Eğer saldırgan param=<script>alert(1)</script> XSS payload’ı yazdığında Codeigniter XSS filter’ı aşağıdaki ekran görüntüsünde çıktı verecektir.

Screenshot-from-2014-02-27-142350.png


Görüldüğü üzere Codeigniter kullanıcı girdileri üzerinde Black List mantığı ile bir filtreleme çalışması yapmaktadır. Black list mantığı ile yapılan kontrollerin atlatılması mümkündür. Eğer param değişkenine aşağıdaki XSS payload’ı yazılırsa, bu kontrol atlatılmış olacaktır.

Kod:
<div/style=content:url(data:image/svg+xml);visibility:visible onmouseover=confirm(1)>Bring-Mouse-Over-Me</div>


XSS zafiyetlerinden korunmak için Black list ile kontrol mantığından ziyade, output encoding yapılmalıdır. Bu konuda Codeigniter html_escape() isminde metod barındırmakdır. View dosyaların değişkenler ekrana yazdırılmadan önce bu fonksiyondan geçirilmesi akıllıca olacaktır.
Kaynak:mehmetince​
Referans : CodeIgniter Bypass · Issue #2667 · bcit-ci/CodeIgniter


 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.