Está en la página 1de 42

2012

SANITIZANDO FORO

Javier Garca Cambronel SEGUNDO DE ASIR 18/01/2012

[SANITIZANDO FORO] 18 de enero de 2012

IMPLEMENTANDO SEGURIDAD EN NUESTRO FORO PHP


CDIGO REGISTRO PHP SANITIZADO
EXPLICACIN BLOQUE 1 COMPROBACIN DE EMAIL EXPLICACION BLOQUE 2 SANITIZANDO CONTRA ATAQUES SQLI, XSS EXPLICACIN BLOQUE TRES COMPROBANDO LA SEGURIDAD DE LA CONTRASEA EXPLICACIN BLOQUE 5 ENCRIPTANDO CONTRASEAS

CDIGO INICIO DE SESION PHP SANITIZADO


EXPLICACION BLOQUE 1 SANITIZANDO CONTRA ATAQUES SQLI, XSS EXPLICACION BLOQUE 2 LLAMANDO A LAS FUNCIONES DESENCRIPTANDO CONTRASEA

CDIGO NUEVO TEMA PHP SANITIZADO


EXPLICACION BLOQUE 1 SANITIZANDO CONTRA ATAQUES SQLI, XSS

CDIGO SANITIZADO CONTESTAR POST PHP


EXPLICACION BLOQUE 1 SANITIZANDO CONTRA ATAQUES SQLI, XSS EXPLICACION BLOQUE 2 LIMPIANDO LA URL EVITANDO ATAQUES XSS Y SQL EXPLICACION BLOQUE 4 LIMITANDO LA SUBIDA DE TIPOS DE FICHERO

CDIGO MOSTRAR TEMA PHP SANITIZADO


EXPLICACION BLOQUE 1 LIMPIANDO LA URL EVITANDO ATAQUES XSS Y SQL

HERRAMIENTAS AUTOMTICAS DESPUES DE LA SANITIZACIN

SEGUNDO DE ASIR

Pgina 1

[SANITIZANDO FORO] 18 de enero de 2012

IMPLEMENTANDO SEGURIDAD EN NUESTRO FORO PHP

La programacin segura de PHP es esencial para no comprometer la seguridad de su servidor donde este alojada nuestra aplicacin web. Una aplicacin con mal diseo de seguridad es vulnerable usualmente

XSS: Cross-site scripting es un tipo de inseguridad informtica o agujero de seguridad basado en la explotacin de vulnerabilidades del sistema de validacin de HTML incrustado. Esta falla suele producirse por varias razones : Variables no inicializadas correctamente, Ausencia de control de datos, entre otras.

SQL-injection: Es una vulnerabilidad informtica en el nivel de la validacin de las entradas a la base de datos de una aplicacin. El origen es el filtrado incorrecto de las variables utilizadas en las partes del programa con cdigo SQL. Es, de hecho, un error de una clase ms general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programacin o de script que est incrustado dentro de otro. Esta falla suele producirse por razones como: Ausencia de control de datos. Para tener un cdigo seguro hay que tener en cuenta bsicamente 2 cosas: SANITIZAR Y VALIDAR Sanitizar y Validar los datos, son los puntos de ms importancia a la hora de programar una aplicacin segura, y las que ms impacto tienen a la hora de la analizar la seguridad, debido que estos datos pueden ser manipulados por cualquier usuario, en muchos casos malintencionados. Que es Sanitizar? Es el proceso de aplicar una limpieza exhaustiva a un dato o grupos de datos para su uso. Que es Validar? Es el proceso utilizado para validar o comprobar si los datos cumplen con ciertos requisitos predefinidos. Ahora teniendo todo esto en cuenta vamos a hacer de nuestro foro una aplicacin segura, o al menos mucho ms segura de lo que era antes, para ello hemos modificado el cdigo en diferentes partes para validacin y sanitizacin de datos como veremos a continuacin.

SEGUNDO DE ASIR

Pgina 2

[SANITIZANDO FORO] 18 de enero de 2012


CDIGO REGISTRO PHP SANITIZADO <?php function comprobar_email($email){ $mail_correcto = 0; //compruebo unas cosas primeras if ((strlen($email) >= 6) && (substr_count($email,"@") == 1) && (substr($email,0,1) != "@") && (substr($email,strlen($email)-1,1) != "@")){ if ((!strstr($email,"'")) && (!strstr($email,"\"")) && (!strstr($email,"\\")) && (!strstr($email,"\$")) && (!strstr($email," "))) { //miro si tiene caracter . if (substr_count($email,".")>= 1){ //obtengo la terminacion del dominio $term_dom = substr(strrchr ($email, '.'),1); //compruebo que la terminacin del dominio sea correcta if (strlen($term_dom)>1 && strlen($term_dom)<5 && (!strstr($term_dom,"@")) ){ //compruebo que lo de antes del dominio sea correcto $antes_dom = substr($email,0,strlen($email) - strlen($term_dom) - 1); $caracter_ult = substr($antes_dom,strlen($antes_dom)-1,1); if ($caracter_ult != "@" && $caracter_ult != "."){ $mail_correcto = 1; } } } } } if ($mail_correcto) return $email; else

SEGUNDO DE ASIR

Pgina 3

[SANITIZANDO FORO] 18 de enero de 2012


return 0; } function seguridad($variable) { $variable = strip_tags(stripslashes(mysql_real_escape_string(trim($variable)))); return $variable; } function contrasea($clave){ if(strlen($clave) < 8){ return false; } if(strlen($clave) > 16){ return false; } if (!preg_match('`[a-z]`',$clave)){ return false; } if (!preg_match('`[A-Z]`',$clave)){ return false; } if (!preg_match('`[0-9]`',$clave)){ return false; } return $clave; } $_POST["email"]=comprobar_email(seguridad($_POST["email"])); $_POST["password"]=contrasea(seguridad($_POST["password"])); if ((!$_POST["email"]) || (!$_POST["password"])) {

SEGUNDO DE ASIR

Pgina 4

[SANITIZANDO FORO] 18 de enero de 2012


header("Location: nuevo_usuario.html"); exit; } if ($_POST["password"] !=($_POST["password2"]) { header("Location: nuevo_usuario.html"); exit; }

$mysqli = mysqli_connect("localhost", "root", "", "foro"); $nuevo_usuario_sql = "SELECT email FROM usuarios WHERE email='".$_POST["email"]."'"; $nuevo_usuario_res = mysqli_query($mysqli, $nuevo_usuario_sql) or die(mysqli_error($mysqli)); if (mysqli_num_rows($nuevo_usuario_res) < 1) { $nuevo_usuario_2_sql="INSERT INTO usuarios (email,password) VALUES('".$_POST["email"]."','".md5($_POST["password"])."')"; $nuevo_usuario_2_res=mysqli_query($mysqli, $nuevo_usuario_2_sql) or die(mysqli_error($mysqli)); $display_block = "<p><em>Registro completado con exito</em></p>"; } else { $display_block = "<p><em>Ese e-mail ya esta existe</em></p>"; } mysqli_close($mysqli); ?> <html> <head> <title>Nuevo usuario</title>

SEGUNDO DE ASIR

Pgina 5

[SANITIZANDO FORO] 18 de enero de 2012


</head> <body> <h1>Nuevo usuario</h1> <?php echo $display_block; ?> <p>Volver a la pagina principal. <a href="foro.html">Pulsa aqui</a> </body> </html>

SEGUNDO DE ASIR

Pgina 6

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACIN BLOQUE 1 COMPROBACIN DE EMAIL Vamos a ver una funcin muy til en PHP que sirve para comprobar la validez de un correo. En realidad comprueba si una direccin de correo electrnico est bien escrita sintcticamente, dejando de lado las comprobaciones de si ese mail existe o no realmente, que no se pueden hacer tan fcilmente. La funcin en si da por hecho inicialmente que el email es errneo y realiza una serie de comprobaciones que, si todas responden correctamente, dan por conclusin que el email s estaba bien escrito. Si alguna de esas comprobaciones no era correcta, no se llegara al final de las comprobaciones y quedara el resultado como se ha supuesto en un principio, es decir, como incorrecto. Las comprobaciones En el primer if compruebo que el email tiene por lo menos 6 caracteres (el mnimo), que tiene una arroba y slo una y que no est colocada ni al principio ni al final. En el segundo if comprueba que no tiene algunos caracteres no permitidos. Y los restantes hacen comprobaciones de las distintas partes de la direccin de correo: Que hay un punto en algn lado y que la terminacin del dominio es correcta y que el principio de la direccin tambin es correcto. Finalmente, se devuelve la variable local utilizada para guardar la validez o incorreccin del correo.

COMPROBACIN Si insertamos un email que no cumple con todas las opciones que hemos indicado en la funcin comprobar e-mail y le damos a validar.

SEGUNDO DE ASIR

Pgina 7

[SANITIZANDO FORO] 18 de enero de 2012


Vemos que nos devuelve a la misma pantalla sin realizar ninguna accin.

ANTES Sin embargo antes con el mismo ejemplo vemos que quedara registrado al no tener el email ningn tipo de validacin podramos escribir lo que quisisemos que quedara registrado.

SEGUNDO DE ASIR

Pgina 8

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACION BLOQUE 2 SANITIZANDO CONTRA ATAQUES SQLI, XSS Limpiamos de las entradas los tags HTML, Javascript, style y comentarios. Ahora podemos sanear cualquier cadena de texto, e incluso arrays. Para usar estas funciones simplemente hay que llamar a la funcin seguridad con parmetro la cadena (o array) a sanear y nos devolver la cadena (o array) saneado. COMPROBACIN Como vemos nos devuelve a la pantalla de nuevo, sin realizar ninguna accin

ANTES Sin embargo sin la proteccin que le hemos puesto quedara registrado y el cdigo malicioso estara como vemos en nuestra base de datos, listo para ser ejecutado.

SEGUNDO DE ASIR

Pgina 9

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACIN BLOQUE TRES COMPROBANDO LA SEGURIDAD DE LA CONTRASEA Es una funcin bien sencilla, ya que simplemente tenemos que comprobar paso por paso cada una de las caractersticas que tendra la clave que deseamos aceptar. En nuestro caso vamos a comprobar:

Que la clave tiene al menos 8 caracteres Que el password tiene como mximo 16 caracteres Que tiene al menos 1 letra minscula Que al menos tiene 1 letra mayscula Que tiene al menos un carcter numrico

Para hacer la funcin en realidad necesitaramos recibir solamente la clave a ser validada y se devolvera un booleano para decir si es o no vlida la contrasea. COMPROBACIN Como vemos si insertamos una contrasea para nuestro usuario que no cumpla con todos los requisitos que hemos especficado en la funcin contrasea nos devuelve a la misma pantalla.

SEGUNDO DE ASIR

Pgina 10

[SANITIZANDO FORO] 18 de enero de 2012


ANTES Sin embargo antes podramos insertar la contrasea que quisiramos al no tener ningn tipo de validacin.

Y como vemos Juanito a quedado registrado con una contrasea de tres caracteres.

SEGUNDO DE ASIR

Pgina 11

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACIN BLOQUE 5 ENCRIPTANDO CONTRASEAS Al que realmente no le podemos llamar ni bloque pues esta formado de una sola line como vemos y de hecho es una pequea modificacin de lo que ya tenamos en nuestro cdigo sin sanitizar, lo que hemos aadido ha sido lo que vemos en rojo. VALUES('".$_POST["email"]."','".md5($_POST["password"])."')"; Esta lnea la hemos aadido para que en nuestra base de datos, la contrasea se guarde encriptada en este formato md5, el cual ya da bastante seguridad y hace que los programas dedicados a explotar esta vulnerabilidad tarden mucho ms en adivinar la contrasea o que directamente no la puedan desencriptar, si fuera texto plano.realmente seria muy fcil de ver una contrasea explotando alguna vulnerabilidad, sobretodo SQL. COMPROBACIN Al introducir un usuario que cumpla todas las validaciones tanto de email como de contrasea queda registrado.

Pero lo mas importante, vemos como queda registrado y que la contrasea se ha guardado cifrada en md5 como le hemos indicado.

ANTES Como vemos antes, las contraseas se guardaban sin ningn encriptado de ninguna forma

SEGUNDO DE ASIR

Pgina 12

[SANITIZANDO FORO] 18 de enero de 2012


CDIGO INICIO DE SESION PHP SANITIZADO <?php function seguridad($variable) { $variable = strip_tags(stripslashes(mysql_real_escape_string(trim($variable)))); return $variable; } if ((!$_POST["email"]) || (!$_POST["password"])) { header("Location: foro.html"); exit; } $mysqli = mysqli_connect("localhost", "root", "", "foro"); $_POST["email"]=seguridad($_POST["email"]); $_POST["password"]=seguridad(md5($_POST["password"])); $obtener_usuario_sql = "SELECT email, password FROM usuarios WHERE email='".$_POST["email"]."' AND password='".$_POST["password"]."'"; $obtener_usuario_res = mysqli_query($mysqli, $obtener_usuario_sql) or die(mysqli_error($mysqli)); if (mysqli_num_rows($obtener_usuario_res) < 1) { $display_block = "<p><em>Datos erroneos Vuelve a probar</em></p>"; } else { $display_block = "<p>Bienvenido</p>"; session_start(); $id_sesion=seguridad(session_id());

SEGUNDO DE ASIR

Pgina 13

[SANITIZANDO FORO] 18 de enero de 2012


$nueva_sesion_sql = "INSERT INTO sesiones VALUES ('".$id_sesion."','".$_POST["email"]."')"; $nueva_sesion_res = mysqli_query($mysqli, $nueva_sesion_sql)or die(mysqli_error($mysqli)); } mysqli_close($mysqli); ?> <html> <head> <title>Inicio de sesion</title> </head> <body> <h1>Inicio de sesion</h1> <?php echo $display_block; ?> <a href="listatemas.php?<?php echo session_id(); ?>">Entrar al foro</a></h1> </body> </html>

SEGUNDO DE ASIR

Pgina 14

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACION BLOQUE 1 SANITIZANDO CONTRA ATAQUES SQLI, XSS Limpiamos de las entradas los tags HTML, Javascript, style y comentarios. Ahora podemos sanear cualquier cadena de texto, e incluso arrays. Para usar estas funciones simplemente hay que llamar a la funcin seguridad con parmetro la cadena (o array) a sanear y nos devolver la cadena (o array) saneado. COMPROBACIN No se ejecuta el cdigo malicioso, y nos informa de que los datos son erneos.

ANTES Nos deja entrar, pues ya estbamos registrados con el script, con lo que cada vez que se lean los datos de nuestro usuario tendremos un bonito HOLA.

SEGUNDO DE ASIR

Pgina 15

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACION BLOQUE 2 LLAMANDO A LAS FUNCIONES DESENCRIPTANDO CONTRASEA En este bloque declaramos las funciones para que tengan efecto sobre los elementos que le indicamos en este caso email y password y no nos olvidemos de que para que el inicio de sesin tenga efecto con nuestra contrasea tenemos que hacer que se desencripte y para ello tambin lo indicamos aqu, de nuevo con md5. $_POST["email"]=seguridad($_POST["email"]); $_POST["password"]=seguridad(md5($_POST["password"])); COMPROBACIN Como vemos la desencriptacin se lleva a cabo de forma correcta y escribiendo nuestra contrasea de forma normal, accedemos sin ningn problema al foro.

ANTES No era necesario desencriptar la contrasea pues viajaba sin codificar, con el peligro que eso conlleva.

SEGUNDO DE ASIR

Pgina 16

[SANITIZANDO FORO] 18 de enero de 2012


CDIGO NUEVO TEMA PHP SANITIZADO <?php function seguridad($variable) { $variable = strip_tags(stripslashes(mysql_real_escape_string(trim($variable)))); return $variable; } $_POST["titulo_tema"]=seguridad($_POST["titulo_tema"]); $_POST["texto_post"]=seguridad($_POST["texto_post"]); session_start(); //Comprobar campos obligatorios if ((!$_POST["titulo_tema"]) || (!$_POST["texto_post"])) { header("Location: nuevo_tema.html"); exit; } //conexion a la base de datos $mysqli = mysqli_connect("localhost", "root", "", "foro"); //obtener email $obtener_email_sql="SELECT email FROM sesiones WHERE id_sesion='".session_id()."'"; $obtener_email_res = mysqli_query($mysqli, $obtener_email_sql) or die(mysqli_error($mysqli)); $ret=mysqli_fetch_array($obtener_email_res); $email=$ret['email']; if ($email=="") { //intentar crear un tema un usuario no registrado: header("Location: listatemas.php"); exit;

SEGUNDO DE ASIR

Pgina 17

[SANITIZANDO FORO] 18 de enero de 2012


} else{ //insertamos tema en la tabla temas_foro: $add_topic_sql = "INSERT INTO temas_foro (titulo_tema, fecha_creacion, email) VALUES ('".$_POST["titulo_tema"]."',now(), '".$email."')"; $add_topic_res = mysqli_query($mysqli, $add_topic_sql) or die(mysqli_error($mysqli)); //obtener id de la ultima consulta $id_tema = mysqli_insert_id($mysqli); //creamos el post de creacion $add_post_sql = "INSERT INTO posts_foro (id_tema,texto_post,fecha_creacion, email,creacion) VALUES ('".$id_tema."','".$_POST["texto_post"]."', now(),'".$email."','SI')"; $add_post_res = mysqli_query($mysqli, $add_post_sql) or die(mysqli_error($mysqli)); } //cerramos conexion mysqli_close($mysqli); //mensaje para el usuario $display_block = "<P>The <strong>".$_POST["titulo_tema"]."</strong> ha sido creado.</p>"; ?> <html> <head> <title>Tema aadido</title> </head> <body> <h1>Tema aadido</h1> <?php echo $display_block; ?> SEGUNDO DE ASIR Pgina 18

[SANITIZANDO FORO] 18 de enero de 2012


<p>volver a la lista de temas<a href="listatemas.php">Pulsa aqui</a></p> </body> </html>

SEGUNDO DE ASIR

Pgina 19

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACION BLOQUE 1 SANITIZANDO CONTRA ATAQUES SQLI, XSS COMPROBACIN Como vemos, al intentar el ataque las cadenas se limpian de forma correcta, no ejecutando el script que habamos insertado.

SEGUNDO DE ASIR

Pgina 20

[SANITIZANDO FORO] 18 de enero de 2012


ANTES Como era de imaginar, anteriormente el script se ejecutaba en nuestro navegador cuando creamos el tema.

Y de nuevo cuando accedemos a la lista de temas

Tema en el cual no podramos entrar, pues el hipervnculo del ttulo donde tendramos que pulsar para entrar no se nos muestra, pese a que el cdigo malicioso como hemos comprobado si que se encuentra bien metido en nuestra base de datos MYSQL.

SEGUNDO DE ASIR

Pgina 21

[SANITIZANDO FORO] 18 de enero de 2012


CDIGO SANITIZADO CONTESTAR POST PHP <?php function seguridad($variable) { $variable = strip_tags(stripslashes(mysql_real_escape_string(trim($variable)))); return $variable; } function url ($entrada) { $var1=mysql_real_escape_string($entrada); $var2=htmlspecialchars($var1); return $var2; } session_start(); //conexin al servidor $mysqli = mysqli_connect("localhost", "root", "", "foro"); //comprobar si estamos mostrando el formulario o aadiendo el post if (!$_POST) { // mostrar el formulario; comprobar requisitos if (!isset($_GET["id_post"])) { header("Location: listatemas.php"); exit; } $_GET["id_post"]=url($_GET["id_post"]); //comprobamos tema y post $verify_sql = "SELECT ft.id_tema, ft.titulo_tema FROM posts_foro AS fp LEFT JOIN temas_foro AS ft ON fp.id_tema = ft.id_tema WHERE fp.id_post = '".$_GET["id_post"]."'";

SEGUNDO DE ASIR

Pgina 22

[SANITIZANDO FORO] 18 de enero de 2012


$verify_res = mysqli_query($mysqli, $verify_sql) or die(mysqli_error($mysqli)); if (mysqli_num_rows($verify_res) < 1) { //no existe el tema o el post header("Location: listatemas.php"); exit; } else { //obtener id_topic y titulo while($topic_info = mysqli_fetch_array($verify_res)) { $id_tema = $topic_info['id_tema']; $titulo_tema = stripslashes($topic_info['titulo_tema']); }

echo " <html> <head> <title>Escribe una respuesta en ".$titulo_tema."</title> </head> <body> <h1>Escribe una respuesta en $titulo_tema</h1> <form method=\"post\" enctype=\"multipart/form-data\" action=\"".$_SERVER["PHP_SELF"]."\"> <p><strong>Mensaje:</strong><br/> <textarea name=\"texto_post\" rows=\"8\" cols=\"40\" wrap=\"virtual\"></textarea> <input type=\"hidden\" name=\"id_tema\" value=\"$id_tema\"> <p><input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"512000\" /> <p><b>Fichero a subir:</b> <input type=\"file\" name=\"file\" /></p>

SEGUNDO DE ASIR

Pgina 23

[SANITIZANDO FORO] 18 de enero de 2012


<p><input type=\"submit\" name=\"submit\" value=\"Subir y responder\"></p> </form> </body> </html>"; } //liberamos result mysqli_free_result($verify_res); } else if ($_POST) { //comprobamos requisitos if ((!$_POST["id_tema"]) || (!$_POST["texto_post"])) { header("Location: listatemas.php"); exit; } //obtener email $obtener_email_sql="SELECT email FROM sesiones WHERE id_sesion='".session_id()."'"; $obtener_email_res = mysqli_query($mysqli, $obtener_email_sql) or die(mysqli_error($mysqli)); $ret=mysqli_fetch_array($obtener_email_res); $email=$ret['email']; //subir archivos foreach($_FILES as $file_name => $file_array){ $file_dir = "C:\\xampp\\htdocs\\ejer\\foro\\".$file_array["name"]; $filename=trim($_FILES['file']['name']); $filename=substr($filename, -20); $filename=preg_replace("/ /", "", $filename); if((preg_match("/.zip/", $filename)) || (preg_match("/.ZIP/", $filename))) if (is_uploaded_file($file_array["tmp_name"]))

SEGUNDO DE ASIR

Pgina 24

[SANITIZANDO FORO] 18 de enero de 2012


{ move_uploaded_file($file_array["tmp_name"], $file_dir) or die ("No se ha podido copiar"); $_POST["texto_post"]=seguridad($_POST["texto_post"]); $add_post_sql = "INSERT INTO posts_foro (id_tema,texto_post, fecha_creacion,email,creacion, file) VALUES ('".$_POST["id_tema"]."', '".$_POST["texto_post"]."', now(),'".$email."','NO', '".$file_array["name"]."')"; $add_post_res = mysqli_query($mysqli, $add_post_sql) or die(mysqli_error($mysqli)); //redireccionamos header("Location: mostrartema.php?id_tema=".$_POST["id_tema"]); exit; } } //Incluimos el post if(!$_FILES["file"]["name"]){ if ($email=="") { //intenta crear un tema un usuario no registrado: le redireccionamos a la lista de temas header("Location: listatemas.php"); exit; } //aadir post sin info del archivo adjunto $_POST["texto_post"]=seguridad($_POST["texto_post"]); $add_post_sql = "INSERT INTO posts_foro (id_tema,texto_post, fecha_creacion,email,creacion) VALUES ('".$_POST["id_tema"]."', '".$_POST["texto_post"]."', now(),'".$email."','NO')"; $add_post_res = mysqli_query($mysqli, $add_post_sql) or die(mysqli_error($mysqli));

SEGUNDO DE ASIR

Pgina 25

[SANITIZANDO FORO] 18 de enero de 2012


//cerrar conexin mysqli_close($mysqli); //redireccionar usuario al tema header("Location: mostrartema.php?id_tema=".$_POST["id_tema"]); exit; } } ?>

SEGUNDO DE ASIR

Pgina 26

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACION BLOQUE 1 SANITIZANDO CONTRA ATAQUES SQLI, XSS Limpiamos de las entradas los tags HTML, Javascript, style y comentarios. Ahora podemos sanear cualquier cadena de texto, e incluso arrays. Para usar estas funciones simplemente hay que llamar a la funcin seguridad con parmetro la cadena (o array) a sanear y nos devolver la cadena (o array) saneado. COMPROBACIN Como podemos observar la cadena se devuelve limpia cono o que evitamos la ejecucin del script

ANTES Antes sin embargo..Claramente el script se ejecutara sin ningn inconveniente.

SEGUNDO DE ASIR

Pgina 27

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACION BLOQUE 2 LIMPIANDO LA URL EVITANDO ATAQUES XSS Y SQL Limpiamos de las entradas en nuestra URL de tags HTML, Javascript, style y comentarios. COMPROBACIN Como podemos ver al intentar un ataque SQL con una comilla simple delante del nmero de identificacin nos devuelve a la lista de temas.

ANTES Antes como podemos ver nos saldra un error SQL y seria un parmetro inyectable donde sacaramos los datos con BLINDSQL sin ningn problema.

SEGUNDO DE ASIR

Pgina 28

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACION BLOQUE 4 LIMITANDO LA SUBIDA DE TIPOS DE FICHERO Se ha limitado la subida de ficheros a solo archivos comprimidos en formato .zip pues la mayora de los antivirus los analizan siempre automticamente y no al ser ejecutados como otro tipo de archivos, los cuales infectaran nuestro PC inmediatamente. COMPROBACIN SUBIENDO UN .TXT Si intentamos subir un tipo de archivo no permitido, el servidor no nos dejara y nos mostrara una ventana en blanco.

ANTES Antes sin embargo, al no tener ningn tipo de restriccin podamos subir el archivo sin ningn problema.

SEGUNDO DE ASIR

Pgina 29

[SANITIZANDO FORO] 18 de enero de 2012


COMPROBACIN SUBIENDO ARCHIVO PERMITIDO .ZIP Al subir un archivo que sea ZIP y que adems no supere los 0,5 MB permitidos se subir sin problemas a nuestro servidor.

Y lo encontraramos en la carpeta que habamos indicado en nuestro PHP.

ANTES Tambin se producira la subida de este fichero perfectamente

SEGUNDO DE ASIR

Pgina 30

[SANITIZANDO FORO] 18 de enero de 2012


COMPROBACIN EXCESO DE TAMAO EN ARCHIVO PERMITIDO Sin embargo, si el archivo es un ZIP pero el tamao excede de los 0.5 MB permitidos al subir el archivo, mejor dicho, al intentarlo, nos devuelve a la lista de temas.

Y si nos metemos en el tema correspondiente, vemos como no se ha llevado a cabo la subida de archivos.

ANTES Nos mosraba la pantalla en blanco y tampoco nos dejaba subir el archivo, pues esta caracterstica ya estaba implementada.

SEGUNDO DE ASIR

Pgina 31

[SANITIZANDO FORO] 18 de enero de 2012


CDIGO MOSTRAR TEMA PHP SANITIZADO <?php function url ($entrada) { $var1=mysql_real_escape_string($entrada); $var2=htmlspecialchars($var1); return $var2; } //comprobamos requisitos if (!isset($_GET["id_tema"])) { header("Location: listatemas.php"); exit; } //conexin al servidor $mysqli = mysqli_connect("localhost", "root", "", "foro"); $_GET["id_post"]=url($_GET["id_post"]); //comprobamos que existe e tema $verify_topic_sql = "SELECT titulo_tema FROM temas_foro WHERE id_tema = '".$_GET["id_tema"]."'"; $verify_topic_res = mysqli_query($mysqli, $verify_topic_sql) or die(mysqli_error($mysqli)); if (mysqli_num_rows($verify_topic_res) < 1) { //este tema no existe $display_block = "<p><em>Has seleccionado un tema incorrecto.<br/> Por favor, <a href=\"listatemas.php\">intntalo otra vez</a>.</em></p>";

SEGUNDO DE ASIR

Pgina 32

[SANITIZANDO FORO] 18 de enero de 2012


} else { //obtener ttulo del tema while ($topic_info = mysqli_fetch_array($verify_topic_res)) { $titulo_tema = stripslashes($topic_info['titulo_tema']); } //obtener los posts $get_posts_sql = "SELECT id_post, texto_post, file, DATE_FORMAT(fecha_creacion, '%b %e %Y at %r') AS fmt_post_create_time, email FROM posts_foro WHERE id_tema = '".$_GET["id_tema"]."' ORDER BY fecha_creacion ASC"; $get_posts_res = mysqli_query($mysqli, $get_posts_sql) or die(mysqli_error($mysqli)); //creamos cadena para mostrar $display_block = " <p>Mostrar posts del tema <strong>".$titulo_tema."</strong>:</p> <table width=\"100%\" cellpadding=\"3\" cellspacing=\"1\" border=\"1\"> <tr> <th>AUTOR</th> <th>POST</th> <th>FILE</th> </tr>"; while ($posts_info = mysqli_fetch_array($get_posts_res)) { $id_post = $posts_info['id_post']; $texto_post = nl2br(stripslashes($posts_info['texto_post'])); $fecha_creacion = $posts_info['fmt_post_create_time']; $email = stripslashes($posts_info['email']);

SEGUNDO DE ASIR

Pgina 33

[SANITIZANDO FORO] 18 de enero de 2012


$file= $posts_info['file']; //aadimos para mostrar... $display_block .= " <tr> <td width=\"35%\" valign=\"top\">".$email."<br/> [".$fecha_creacion."]</td> <td width=\"65%\" valign=\"top\">".$texto_post."<br/><br/> <a href=\"contestarpost.php?id_post=".$id_post."\"> <strong>RESPONDER AL POST</strong></a> <a href=\"borrarpost.php?id_post=".$id_post."\"> <strong>BORRAR POST</strong></a> </td> <td> <a href= ".$file.">$file</a> </td>

</tr>"; } //liberamos result mysqli_free_result($get_posts_res); mysqli_free_result($verify_topic_res); //cerramos conexin mysqli_close($mysqli); //cerramos la tabla $display_block .= "</table>"; } ?>

SEGUNDO DE ASIR

Pgina 34

[SANITIZANDO FORO] 18 de enero de 2012


<html> <head> <title>Posts del tema</title> </head> <body> <h1>Posts del tema</h1> <?php echo $display_block; ?> <p>volver a la lista de temas<a href="listatemas.php?<?php echo session_id(); ?>">Pulsa aqui</a></p> </body> </html>

SEGUNDO DE ASIR

Pgina 35

[SANITIZANDO FORO] 18 de enero de 2012


EXPLICACION BLOQUE 1 LIMPIANDO LA URL EVITANDO ATAQUES XSS Y SQL Limpiamos de las entradas en nuestra URL de tags HTML, Javascript, style y comentarios. COMPROBACIN Si introducimos una comilla simple, para ver si es vulnerable, nos dice que el tema es incorrecto porque claramente ese tema no existe, pero no recibimos ningn error SQL con lo que estaramos protegidos.

ANTES Sin embargo antes al no tener sanitizada la entada de datos, se nos mostrara el error SQL

SEGUNDO DE ASIR

Pgina 36

[SANITIZANDO FORO] 18 de enero de 2012

HERRAMIENTAS AUTOMTICAS DESPUES DE LA SANITIZACIN


Despus de probar con todas las herramientas a mi mano y no encontrar nada realmente importante en lo referente a la aplicacin DIRPBUSTER Con este programa despus de configurarlo como vemos en la imagen.

Sacamos estos resultados, todos los archivos que forman parte de la aplicacin foro todas las pginas que la componen y tambin todos los archivos y pginas de anteriores proyectos es decir FUZZED PAGES pginas alojadas en el servidor que hemos dado con ella a travs de Foro.html

SEGUNDO DE ASIR

Pgina 37

[SANITIZANDO FORO] 18 de enero de 2012


NESSUS Con nessus, despus de configurarlo como vemos en la imagen, para que haga un anlisis de una aplicacin WEB Pulsamos en Scann para que el anlisis de comienzo.

Una vez terminado vemos un resumen y hemos encontrado 4 de gran importancia 16 de nivel medio y 44 de nivel bajo MUCHAS VERDAD?

Una vez entramos en ms detalle nos damos cuenta de que estas alertas, mas que estar relacionadas con la aplicacin FORO estn relacionadas con el propio sistema, con nuestra versin de PHP que no esta actualizada, con los puertos abiertos que como vemos tenemos bastantes, con los cifrados de seguridad no actualizados..

SEGUNDO DE ASIR

Pgina 38

[SANITIZANDO FORO] 18 de enero de 2012


ACCUNETIX Para mi una de las herramientas ms potentes a mi disposicin como ha demostrado en varias ocasiones. Vemos que al analizar la aplicacin encontramos estas alertas. Procedemos a mirar con mas detalle cada una de ellas.

Vemos algo que ya sabamos con las otras herramientas previamente utilizadas, puertos que estn abiertos y que servicio corre, que terminal services esta corriendo. que SSL est completamente desactualizado corriendo la 2.0 estando actualmente SSL3.0 y TSL Y varias cosas ms que podemos apreciar en la imagen y que no hace falta que las describa.

SEGUNDO DE ASIR

Pgina 39

[SANITIZANDO FORO] 18 de enero de 2012


Y vemos lo que realmente nos interesa en lo referente a la aplicacin vemos que nos da un parmetro inyectable despus de todo el trabajo, recordemos que en el anterior trabajo nos daba seis SQL y unos pocos XSS, al menos XSS no tenemos, pero vamos a comprobar que este parmetro realmente es inyectable y podemos sacar los datos, o es un falso positivo, algo que por otra parte las herramientas automticas dan bastante y es su mximo taln de Aquiles.

Como vemos intentamos explotar la vulnerabilidad cambiando diferentes opciones de inyeccin SQL, Metodos Extraccin por unin por condicin y lo nico que logramos es distintos tipos de mensajes de error como vemos a continuacin.

SEGUNDO DE ASIR

Pgina 40

[SANITIZANDO FORO] 18 de enero de 2012


SQLIHELPER Hacemos lo suyo con este programa y solo obtenemos la versin de Apache.

HAVIJ 1.15 Hacemos los suyo con Havij y vemos, que no obtenemos datos de relevancia mas all de la versin de apache, la versin SSL, la versin dePHP.

SEGUNDO DE ASIR

Pgina 41