[Bahasa Malaysia] Pengenalan kepada Cross Site Request Forgery (CSRF)

EDB-ID:

15734

CVE:

N/A

Author:

Ahlspiess

Type:

papers

Platform:

PHP

Published:

2010-12-15

#Tajuk: Pengenalan kepada Cross Site Request Forgery (CSRF/XSRF)
#Penulis: Ahlspiess
#Email: ahlspiess[at]tbdsecurity.com
#Shout: www.tbd.my, www.my0d.my

# Apa itu Cross Site Request Forgery?
Cross Site Request Forgery atau singkatannya CSRF mahupun XSRF, adalah serangan yang memaksa 'user' yang mempunyai authoriti/kuasa untuk melakukan sebarang tindakan pada sesuatu web aplikasi tanpa disedari.

# Apa kesan Cross Site Request Forgery?
Sebuah CSRF berjaya mengeksploitasi boleh kompromi data 'user' dan operasi dalam kes 'user' biasa.
Jika 'user' yang disasarkan adalah akaun pentadbir, hal ini dapat membahayakan semua aplikasi web.

# Mencari CSRF/XSRF pada sesebuah web aplikasi.
## Contoh Form A yang mempunyai kelemahan/bug CSRF/XSRF.
File: Form-a.html
<form action="/submit.php" method="post">
<input type="text" name="id" value="1" />
<input type="hidden" name="act" value="delete" />
<input type="submit" value="Delete!" />
</form>

File: submit.php
<?php
if($_POST['act'] == 'delete')
	{
		my_delete_function($_POST['id']);
	}
?>

## Cara untuk mengeksploit Form A yang mempunyai kelemahan/bug CSRF/XSRF.
## Target: Form A
File: csrf-myform.html
<form action="/submit.php" method="post" name="csrfmyform">
<input type="hidden" name="id" value="1" />
<input type="hidden" name="act" value="delete" />
<input type="submit" value="Delete!" />
</form>
<script>document.csrfmyform.submit();</script>

File: index.html
<iframe src="csrf-myform.html" style="display:none;"></iframe>

Dengan sedikit social engineering skill(seperti menghantar pautan melalui email/im/chat kepada sasaran).
Sekiranya sasaran membuka web yang telah dilengkapkan dengan csrf attack, Form A akan automatik dijalakan/submit.

Nota: untuk sebuah CSRF berjaya dieksploitasi sasarang perlu mempunyai kuasa untuk Form A.
Contoh, User A login pada Website X, didalam Website X mempunyai Form A, sesama login User A tick 'remember me', maka web aplikasi akan menyimpan 'cookies' pada browser/pelayar User A untuk menyesahkan bahawa beliau sudah login.
Oleh kerana itu, jika 'user is currently authenticated' ke laman web, web aplikasi tidak memiliki cara untuk membezakan ini dari permintaan pengguna yang sah atau tidak.

## Cara untuk menghalang/memperbaiki kelemahan/bug CSRF/XSRF
Tambah 'token' atau 'secret key' pada setiap form.
Nota: token atau secret key haruslah diset secara rawak dan mustahil untuk dijangka.
Contoh: mengunakan md5, md5(time().$username.'random string');

## Contoh Form A yang telah diperbaiki.
Semasa login, setkan $_SESSION['token'] = md5(time().$username.'random string');
Raw code untuk Form-a.php
<?php
session_start();
echo '<form action="/submit.php" method="post">
<input type="text" name="id" value="1" />
<input type="hidden" name="act" value="delete" />
<input type="hidden" name="token" value="'.$_SESSION[token].'" />
<input type="submit" value="Delete!" />
</form>';
?>
sekiranya penguna membuka Form-a.php
ianya akan kelihatan seperti ini.
<form action="/submit.php" method="post">
<input type="text" name="id" value="1" />
<input type="hidden" name="act" value="delete" />
<input type="hidden" name="token" value="494729b6cbc2dd98c3ee78dbecf28053" />
<input type="submit" value="Delete!" />
</form>

File: submit.php
<?php
session_start()
if($_POST['act'] == 'delete')
	{
		if((!isset($_POST['token'])) OR (empty($_POST['token'])) OR ($_POST['token'] != $_SESSION['token']))
			{
				die('Serangan CSRF dikesan!');
			}
			else
			{
				my_delete_function($_POST['id']);
			}
	}
?>

\\ Bahasa melayu aku agak sux, so maap la ye.