Sicherheit: CSRF-Demo
0
Ja
|
0%
|
0
|
|
Nein
|
0%
|
0
|
Hallo.
Ich hab gerade ein kleines Skript zusammengeschrieben, um die
Funktionsweise von CSRF-Attacken ein wenig zu veranschaulichen.
Das Skript stellt ein Gästebuch dar mit einer Login-Funktion für einen
Administrator. Das Gästebuch zeigt die Eingaben ungefiltert an und so ist
es möglich, HTML-Code in das Gästebuch zu schreiben, der Requests an
das Gästebuch stellt. Schaut sich ein angemeldeter Admin das Gästebuch
an und hat dieser den Session-Cookie akzeptiert, dann wird bei diesem
Request natürlich auch der Session-Cookie übemittelt und die Aktion mit
seinen Rechten ausgeführt.
Zum Testen, einfach das Skript auf einem Testserver (PHP5) kopieren.
PHP braucht in dem entsprechenden Verzeichnis Schreibrechte, um ein
Daten- und ein Log-File anzulegen.
Skript aufrufen, dabei Cookies akzeptieren und erstmal mit den normalen
Gästebuch-Funktionen, dem An- und Abmelden und dem Link "Befehl
ausführen" rumspielen, um zu sehen, wie das normal funktioniert.
Dann:
Als Gast z.B. [img]?action=cmd[/img] eingeben,
sich als Admin einloggen,
Logfile aktualisieren und siehe da:
"Admin hat den Befehl ausgeführt"
Es reicht auch ein <img src=?action=cmd>
Die Browser nehmen es ja nicht so genau.
Viel Spaß,
Basti
Ich hab gerade ein kleines Skript zusammengeschrieben, um die
Funktionsweise von CSRF-Attacken ein wenig zu veranschaulichen.
Das Skript stellt ein Gästebuch dar mit einer Login-Funktion für einen
Administrator. Das Gästebuch zeigt die Eingaben ungefiltert an und so ist
es möglich, HTML-Code in das Gästebuch zu schreiben, der Requests an
das Gästebuch stellt. Schaut sich ein angemeldeter Admin das Gästebuch
an und hat dieser den Session-Cookie akzeptiert, dann wird bei diesem
Request natürlich auch der Session-Cookie übemittelt und die Aktion mit
seinen Rechten ausgeführt.
Zum Testen, einfach das Skript auf einem Testserver (PHP5) kopieren.
PHP braucht in dem entsprechenden Verzeichnis Schreibrechte, um ein
Daten- und ein Log-File anzulegen.
Skript aufrufen, dabei Cookies akzeptieren und erstmal mit den normalen
Gästebuch-Funktionen, dem An- und Abmelden und dem Link "Befehl
ausführen" rumspielen, um zu sehen, wie das normal funktioniert.
Dann:
Als Gast z.B. [img]?action=cmd[/img] eingeben,
sich als Admin einloggen,
Logfile aktualisieren und siehe da:
"Admin hat den Befehl ausgeführt"
Es reicht auch ein <img src=?action=cmd>
Die Browser nehmen es ja nicht so genau.
Viel Spaß,
Basti
PHP-Code:
<?php
$sDataFile = 'guestbook.dat';
$sLogFile = 'adminlog.dat';
touch($sDataFile);
touch($sLogFile);
if (isset($_GET['logfile'])) show_logfile($sLogFile);
session_start();
if (!isset($_SESSION['sUser'])) $_SESSION['sUser'] = 'Gast';
$sAction = (isset($_GET['action'])) ? $_GET['action'] : '';
switch ($sAction) {
case 'login':
$_SESSION['sUser'] = 'Admin';
break;
case 'logout':
$_SESSION['sUser'] = 'Gast';
break;
case 'cmd':
$r = fopen($sLogFile, 'a');
fputs($r, $_SESSION['sUser'] . " hat den Befehl ausgeführt\n");
fclose($r);
break;
case 'addentry':
if (ini_get('magic_quotes_gpc') == '1')
$_POST['entry'] = stripslashes($_POST['entry']);
$r = fopen($sDataFile, 'a');
fputs($r, '<div>' . $_POST['entry'] . '</div>');
fclose($r);
break;
case 'reset':
file_put_contents($sDataFile, '');
file_put_contents($sLogFile, '');
}
$sLoginLogout = ($_SESSION['sUser'] == 'Admin') ? 'logout' : 'login';
function show_logfile($sLogFile)
{
echo '[url="?logfile=1"]Aktualisieren[/url]<pre>';
echo file_get_contents($sLogFile);
echo '</pre>';
die();
}
?>
Benutzer: <?php echo $_SESSION['sUser']; ?>
([url="?action=<?php echo $sLoginLogout; ?>"]<?php echo $sLoginLogout; ?>[/url])
[url="?action=cmd"]Befehl ausführen[/url]
<hr/>
Einträge:
<pre><?php echo file_get_contents($sDataFile); ?></pre>
<form action="?action=addentry" method="post">
<textarea name="entry" cols="30"></textarea>
<input type="submit" value="Eintrag abschicken"/>
</form>
<hr/>
Logfile:
<iframe src="?logfile=1"></iframe>
[url="?action=reset"]Zurücksetzen[/url]
Einen Kommentar schreiben: