martes, 14 de abril de 2009

Bug and Exploit


Uhmmm supongamos que cuando intentamos abrir una aplicación nos pide un típico cuadro de LOGIN, PASSWORD para loguearnos.

Supongamos que el código de la validación es algo como:

// Logging user out
if (isset($_GET['logout'])) {
$auth->doLogout();
}
else if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$msg = $auth->doLogin($_POST['email'], $_POST['password'], (isset($_POST['setCookie']) ? 'y' : null), false, $resume, $_POST['language']);
}
else if (isset($_COOKIE['ID'])) {
$msg = $auth->doLogin('', '', 'y', $_COOKIE['ID'], $resume); // Check if user has cookies set up. If so, log them in automatically
}
Esto nos indicaria que si no es posible validarse de la forma normal, podemos usar una cookie, que generalmente recuerda nuestra sesión y evita que nos logueemos cada vez que abrimos una página del mismo software. En dicho caso la COOKIE se llamaria ID.

Supongamos que tenemos un código que valida la cookie:

if ($isCookie !== false) { // Cookie is set
$cookieValue = $isCookie;

if ( ($id = $this->verifyCookie($cookieValue)) !== false) {
$ok_user = $ok_pass = true;
}
En el caso hipotetico (patetico?), se validaria la cookie si existe con una función llamada verifyCookie.

Supongamos que esa función es algo como:

function verifyCookie($cookieValue)
{
$parts = explode('|', $cookieValue);
if (count($parts) != 2) {
return false;
}

$memberid = $parts[0];
if ( $cookieValue == $this->generateCookie($memberid) ) {
return $memberid;
}
else
{
return false;
}
}
Eso me diria algo como que lo que viene en la cookie (ID), debe tener dos partes y la cookie completa deberia ser igual al resultado de la función generateCookie.

Supongamos que la función generateCookie() tiene el siguiente código:

function generateCookie($memberid)
{
$passwordhash = $this->db->getPassword($memberid);
$cookiehash = md5($memberid . substr($passwordhash, 1, strlen($passwordhash) -5) );

return $memberid.'|'.$cookiehash;
}
Esto me diria que basado en el primer campo de la cookie voy a generar un MD5 de no se que y no se que, de un hash que obtuve con el usuario.

¿ PERO SE VALIDA EL USUARIO?

Supongamos que el usuario no se valida, entonces la deducción me lleva a concluir que puedo generar una cookie a mi antojo que cumpla con lo que la función quiere ver.
Que tal si la COOKIE[ID] tiene un valor como:

astrideliana|a1c6dbe433e08708f7f0e3e2c5a26fed

Supongamos que usamos una herramienta para configurar esta cookie en nuestro navegador y luego entramos al sitio inicial donde nos piden el usuario y la clave.

Supongamos que nos logueamos sin necesidad de ingresar un usuario/clave validos.

Supongamos que ese software se llama: phpScheduleIt.

Supongamos que hay un dicho en la seguridad que dice:

"Cuando un usuario tenga la posibilidad de manipular los datos que ingresan a un sistema de validación y este no haga bien su trabajo, el usuario podrá hacer lo que quiera, puesto que la seguridad depende exclusivamente del conocimiento de ese usuario."

Este dicho, obviamente no existe, pero me gusta inventar.

Recomendación: Nunca, por ningun motivo permita que un usuario manipule mas de lo debido sus datos de entrada, y sobre todo nunca, pero nunca, dejen de soñar.

Post dedicado a [SU]KARITAS ;)

3 comentarios:

Julio dijo...

Umm... en una palabra, Ataque Cross-Site Scripting???

nonroot (c) 2008/2009 dijo...

nop, este tipo de ataques se llaman ataques de injection de cookies.
Lo que injectas es una cookie.

(injection a proposito)

chesstrian dijo...

Por qué está Astrid por ahí?, jajaja

Entradas populares