Codeigniter XSS – CSRF ve Cookie Güvenliği

Merhaba

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.

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.

$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.

$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ı

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ı

<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.

codeigniter xss

 

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.

<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.

Referans : https://github.com/EllisLab/CodeIgniter/issues/2667