You are on page 1of 36

Ivn Martn Valderas

[FORO] Ivn Martn Valderas

Contenido

1. Tablas ....................................................................................................2 2. Pginas ...................................................................................................3 3. Prctica ............................................................................................... 18 4. Anterior: ............................................................................................ 22 5. Foro: post con adjuntos y seguridad. .......................................... 23 6. Anlisis de la seguridad de la aplicacin: ................................... 28 1. XSS ..................................................................................................... 28 2. SQL ..................................................................................................... 32

1. Tablas

mysql> CREATE TABLE usuarios( -> email VARCHAR(150) NOT NULL PRIMARY KEY, -> password VARCHAR(150)); Query OK, 0 rows affected (0.10 sec) mysql> alter table usuarios add avatar VARCHAR(150); Query OK, 4 rows affected (0.25 sec) Records: 4 Duplicates: 0 Warnings: 0

mysql> CREATE TABLE temas_foro( -> id_tema INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -> titulo_tema VARCHAR(150), -> fecha_creacion DATETIME, -> email VARCHAR(150) NOT NULL, -> FOREIGN KEY (email) REFERENCES usuarios(email)); Query OK, 0 rows affected (0.12 sec)

mysql> CREATE TABLE posts_foro( -> id_post INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -> id_tema INT NOT NULL, -> texto_post TEXT, -> fecha_creacion DATETIME, -> email VARCHAR(150) NOT NULL, -> creacion VARCHAR(10), -> FOREIGN KEY (id_tema) REFERENCES temas_foro(id_tema) ON DELETE CASCADE, -> FOREIGN KEY (email) REFERENCES usuarios(email)); Query OK, 0 rows affected (0.11 sec)

mysql> CREATE TABLE sesiones( -> id_sesion VARCHAR(500) NOT NULL PRIMARY KEY, -> email VARCHAR(150) NOT NULL, -> FOREIGN KEY (email) REFERENCES usuarios(email) ON DELETE CASCADE); Query OK, 0 rows affected (0.10 sec)

Pgina 2

[FORO] Ivn Martn Valderas

2. Pginas
Administrador.html
<?php session_start(); ?> <html> <head> <title>pgina del administrador</title> </head> <body> <h1>Pgina del administrador <p><a href="borrarusuario.html">Borrar usuario</a></br> <a href="perfilusuario.php?<?php echo session_id(); ?>">Ir al perfil de usuario</a></br> <a href="listatemas.php?<?php echo session_id(); ?>">Entrar al foro</a></h1></p> </body> </html>

Borrararchivo.php
<?php system ("del C:\\xampp\\htdocs\\ejerPHP\\foro\\cambiosphpini.txt"); ?>

Borrarpost.php
<?php session_start();

//conexin al servidor $mysqli = mysqli_connect("localhost", "admin", "asir1", "foro"); //comprobamos que no es el posts de creacin del tema: $id_tema_sql="SELECT id_tema FROM posts_foro WHERE id_post='".$_GET["id_post"]."'"; $id_tema_res = mysqli_query($mysqli, $id_tema_sql) or die(mysqli_error($mysqli)); $ret=mysqli_fetch_array($id_tema_res); $id_tema=$ret['id_tema']; $primer_post_sql="SELECT id_post FROM posts_foro WHERE id_post='".$_GET["id_post"]."' AND creacion LIKE 'SI'"; $primer_post_res=mysqli_query($mysqli, $primer_post_sql) or die(mysqli_error($mysqli)); $ret=mysqli_fetch_array($primer_post_res); $id_post2=$ret['id_post'];

if($_GET["id_post"]==$id_post2){ //es el post de creacin, luego no se puede borrar: header("Location: mostrartema.php?id_tema=".$id_tema.""); exit; } else{

//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=="") { //intenta borrar un post un usuario no registrado: header("Location: listatemas.php"); exit; //el administrador puede borrar posts que no ha creado: } else if($email=='admin@asir.es'){ //borramos archivo $archivo_sql="SELECT archivo FROM posts_foro WHERE id_post='".$_GET["id_post"]."'"; $archivo_res= mysqli_query($mysqli, $archivo_sql) or die(mysqli_error($mysqli)); $ret2=mysqli_fetch_array($archivo_res); $archivo2=$ret2["archivo"]; $direccion="C:\\xampp\\htdocs\\foro\\"; unlink("$direccion$archivo2"); $del_post_sql = "DELETE FROM posts_foro WHERE id_post='".$_GET["id_post"]."'"; $del_post_res = mysqli_query($mysqli, $del_post_sql) or die(mysqli_error($mysqli));

}else{ //comprobamos que dicho usuario creo ese post: $comprobar_usuario_sql="SELECT id_post,email FROM posts_foro WHERE email='".$email."' AND id_post='".$_GET["id_post"]."'"; $comprobar_usuario_res=mysqli_query($mysqli,$comprobar_usuario_sql) or die (mysqli_error($mysqli)); $ret=mysqli_fetch_array($comprobar_usuario_res); $email2=$ret['email']; if ($email2=='') { //este usuario no creo este post header("Location: listatemas.php"); exit; } else { //borramos archivo $archivo_sql="SELECT archivo FROM posts_foro WHERE id_post='".$_GET["id_post"]."'"; $archivo_res= mysqli_query($mysqli, $archivo_sql) or die(mysqli_error($mysqli)); $ret2=mysqli_fetch_array($archivo_res); $archivo2=$ret2["archivo"]; $direccion="C:\\xampp\\htdocs\\foro\\"; unlink("$direccion$archivo2"); //borramos el post $del_post_sql = "DELETE FROM posts_foro WHERE id_post='".$_GET["id_post"]."'"; $del_post_res = mysqli_query($mysqli, $del_post_sql) or die(mysqli_error($mysqli)); } } } //cerrar conexin a MySQL mysqli_close($mysqli); //volvemos al tema header("Location: mostrartema.php?id_tema=".$id_tema.""); exit; ?>

Pgina 4

[FORO] Ivn Martn Valderas


Borrartema.php
<?php session_start(); //conexin al servidor $mysqli = mysqli_connect("localhost", "admin", "asir1", "foro"); //comprobamos que el usuario que intenta borrar el tema es el administrador $email_usuario_sql="SELECT email FROM sesiones WHERE id_sesion='".session_id()."'"; $email_usuario_res = mysqli_query($mysqli, $email_usuario_sql) or die(mysqli_error($mysqli)); $ret=mysqli_fetch_array($email_usuario_res); $email=$ret['email']; if ($email=='admin@asir.es') { //usuario administrador. Borramos el tema y los ficheros adjuntos del post. $file_name="SELECT fichero FROM posts_foro WHERE id_tema='".$_GET["id_tema"]."' AND fichero!='NULL'"; $del_fichero_res = mysqli_query($mysqli, $file_name) or die(mysqli_error($mysqli)); //borramos todos los archivos adjuntos de los posts del tema while($ret2 = mysqli_fetch_array($del_fichero_res)) { $archivo=$ret2["fichero"]; $direccion = "C:\\xampp\\htdocs\\foro\\"; unlink("$direccion$archivo"); } //Borramos el tema $del_tema_sql = "DELETE FROM temas_foro WHERE id_tema='".$_GET["id_tema"]."'"; $del_tema_res = mysqli_query($mysqli, $del_tema_sql) or die(mysqli_error($mysqli)); } else{ //si no, volvemos a la lista de temas header("Location: listatemas.php"); exit; } //cerrar conexin a MySQL mysqli_close($mysqli); //volvemos a la lista de temas header("Location: listatemas.php"); exit; ?>

Borrarusuario.html
<?php session_start(); ?> <html> <head> <title>Borrar usuarios</title> <head> <body> <form method="post" action="borrarusuario.php"> <h3><p><strong>Introduce el email del usuario usuario que deseas borrar</strong> <input type="text" name="usuario"/></p></h3> <input type="submit" name="submit" value="Borrar usuario"/> </form> </body> </html>

Borrarusuario.php
<?php session_start(); //Comprobar que se introdujo un usuario if ((!$_POST["usuario"])) { header("Location: borrarusuario.html"); exit; } //Conexin a la base de datos $mysqli = mysqli_connect("localhost", "admin", "asir1", "foro"); //buscar usuario en la base de datos: $obtener_usuario_sql = "SELECT email FROM usuarios WHERE email='".$_POST["usuario"]."'"; $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>El usuario que intentas borrar no existe!</em></p>"; } else { $display_block = " <p>!Usuario borrado con xito!</p>"; $borrar_usuario_sql = "DELETE FROM usuarios WHERE email='".$_POST["usuario"]."'"; $borrar_usuario_res = mysqli_query($mysqli, $borrar_usuario_sql) or die(mysqli_error($mysqli)); } //cerrar conexin mysqli_close($mysqli); ?> <html> <head> <title>Borrar usuario</title> </head> <body> <?php echo $display_block; ?> <a href="borrarusuario.html?<?php echo session_id(); ?>">Quieres borrar otro?</a></h1> </body> </html>

Pgina 6

[FORO] Ivn Martn Valderas


Cerrar_sesion.php
<?php //cdigo obtenido de: http://php.net/manual/es/function.session-destroy.php // Inicializar la sesin. session_start(); // Destruir todas las variables de sesin. $_SESSION = array(); // Si se desea destruir la sesin completamente, borre tambin la cookie de sesin. // Nota: Esto destruir la sesin, y no la informacin de la sesin! if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // Finalmente, destruir la sesin. session_destroy(); header("Location: foro.html"); exit; ?>

Contestarpost.php
<?php session_start(); //conexin al servidor $mysqli = mysqli_connect("localhost", "admin", "asir1", "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; } //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"]."'"; $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>Post Text:</strong><br/> <textarea name=\"texto_post\" rows=\"8\" cols=\"40\" wrap=\"virtual\"></textarea> <input type=\"hidden\" name=\"id_tema\" value=\"$id_tema\"> <p><strong>Archivo para subir:</strong> <input type=\"file\" name=\"file\" /></p> <p><input type=\"submit\" name=\"submit\" value=\"Aadir post\"></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']; if ($email=="") { //intenta crear un tema un usuario no registrado: le redireccionamos a la lista de temas header("Location: listatemas.php"); exit; } foreach($_FILES as $file_name => $file_array) { $file_dir = "C:\\xampp\\htdocs\\ejerPHP\\foro\\".$file_array["name"]; if (is_uploaded_file($file_array["tmp_name"])) { move_uploaded_file($file_array["tmp_name"],$file_dir) or die ("No se pudo copiar"); } //aadir post if(!$_FILES["file"]["name"]){ $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')";

}else{ $add_post_sql = "INSERT INTO posts_foro (id_tema,texto_post, fecha_creacion,email,creacion,archivo) 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)); //cerrar conexin mysqli_close($mysqli);

Pgina 8

[FORO] Ivn Martn Valderas


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

Do_nuevotema.php
<?php session_start();

//Comprobar los campos obligatorios if ((!$_POST["titulo_tema"]) || (!$_POST["texto_post"])) { header("Location: nuevo_tema.html"); exit; }

//conexin a la base de datos $mysqli = mysqli_connect("localhost", "admin", "asir1", "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=="") { //intenta crear un tema un usuario no registrado: header("Location: listatemas.php"); exit; } 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 ltima consulta $id_tema = mysqli_insert_id($mysqli); //creamos el post de creacin $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 conexin mysqli_close($mysqli); //mensaje para el usuario

$display_block = "<P>The <strong>".$_POST["titulo_tema"]."</strong> ha sido creado.</p>"; ?> <html> <head> <title>Nuevo tema aadido</title> </head> <body> <h1>Nuevo tema aadido</h1> <?php echo $display_block; ?> <a href="listatemas.php">Volver a la lista de temas</a> </body> </html>

Foro.html
<html> <head> <title>Foro</title> </head> <body> <h1>!Bienvenido/a al foro de prueba! <form method="post" action="inicio_sesion.php"> <p><strong>E-mail:</strong><br/> <input type="text" name="email"/></p> <p><strong>Contrasea:</strong><br/> <input type="password" name="password"/></p> <p><input type="submit" name="submit" value="Iniciar sesion"/></p> </form> <a href="nuevo_usuario.html">Crear un nuevo usuario</a></br> <a href="listatemas.php">Entrar al foro</a></h1> </body> </html>

Pgina 10

[FORO] Ivn Martn Valderas


Inicio_sesion.php
<?php //Comprobar que se rellenaron todos los campos: if ((!$_POST["email"]) || (!$_POST["password"])) { header("Location: foro.html"); exit; } //Conexin a la base de datos $mysqli = mysqli_connect("localhost", "admin", "asir1", "foro"); //si el usuario que se ha registrado es el administrador... IF((($_POST["email"])=="admin@asir.es") && (($_POST["password"]=="asir1"))){ session_start(); $id_sesion=session_id(); //aadir session_id() a la tabla de las sesiones $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)); header("location: administrador.html"); exit; } //Comprobar que el usuario est registrado en el foro $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)); //Si el usuario no existe if (mysqli_num_rows($obtener_usuario_res) < 1) { $display_block = "<p><em>El usuario no est registrado o introdujo datos errneos! Vuelve a intentarlo...</em></p>"; } else { $display_block = " <p>!Usuario autenticado con xito!</p>"; session_start(); $id_sesion=session_id(); //aadir session_id() a la tabla de las sesiones $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)); } //Cerramos conexin MySQL mysqli_close($mysqli);

?> <html> <head> <title>Inicio de sesin</title> </head> <body> <h1>Inicio de sesin <?php echo $display_block; ?> <a href="perfilusuario.php?<?php echo session_id(); ?>">Ir al perfil de usuario</a></br> <a href="listatemas.php?<?php echo session_id(); ?>">Entrar al foro</a></h1> </body> </html>

Listatemas.php
<?php session_start(); //Conexin al servidor $mysqli = mysqli_connect("localhost", "admin", "asir1", "foro"); //obtener temas $get_topics_sql = "SELECT id_tema, titulo_tema, DATE_FORMAT(fecha_creacion, '%b %e %Y at %r') AS fmt_topic_create_time, email FROM temas_foro ORDER BY fecha_creacion DESC"; $get_topics_res = mysqli_query($mysqli, $get_topics_sql) or die(mysqli_error($mysqli)); if (mysqli_num_rows($get_topics_res) < 1) { //No hay temas $display_block = "<p><em>Todava no hay temas.</em></p>"; } else { //Crear cadena para mostrar los temas $display_block = " <table cellpadding=\"3\" cellspacing=\"1\" border=\"1\"> <tr> <th>TTULO DEL TEMA</th> <th># de POSTS</th> </tr>"; while ($topic_info = mysqli_fetch_array($get_topics_res)) { $id_tema = $topic_info['id_tema']; $titulo_tema = stripslashes($topic_info['titulo_tema']); $fecha_creacion = $topic_info['fmt_topic_create_time']; $email = stripslashes($topic_info['email']); //obtener nmero de posts $get_num_posts_sql = "SELECT COUNT(id_post) AS post_count FROM posts_foro WHERE id_tema = '".$id_tema."'"; $get_num_posts_res = mysqli_query($mysqli, $get_num_posts_sql) or die(mysqli_error($mysqli)); while ($posts_info = mysqli_fetch_array($get_num_posts_res)) { $num_posts = $posts_info['post_count']; } //aadir para mostrar $display_block .= " <tr> <td><a href=\"mostrartema.php?id_tema=".$id_tema."\"><strong>". $titulo_tema."</strong></a><br/> Created on ".$fecha_creacion." by ".$email." <a href=\"borrartema.php?id_tema=".$id_tema."\"> <strong>BORRAR TEMA</strong></a></td> <td align=center>".$num_posts."</td> </tr>"; } //liberamos resultados mysqli_free_result($get_topics_res); mysqli_free_result($get_num_posts_res); //cerramos conexin con MySQL mysqli_close($mysqli); //cerramos la tabla $display_block .= "</table>";

} ?>

Pgina 12

[FORO] Ivn Martn Valderas


<html> <head> <title>Temas del foro</title> </head> <body> <h1>Temas del foro</h1> <?php echo $display_block; ?> <p>Quieres <a href="cerrar_sesion.php?<?php echo session_id(); ?>">salir de la sesin</a>?</p> <p>Quieres <a href="nuevo_tema.html?<?php echo session_id(); ?>">aadir un tema</a>?</p> </body> </html>

Mostrartema.php
<?php //comprobamos requisitos if (!isset($_GET["id_tema"])) { header("Location: listatemas.php"); exit; } //conexin al servidor $mysqli = mysqli_connect("localhost", "admin", "asir1", "foro"); //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>"; } 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, DATE_FORMAT(fecha_creacion, '%b %e %Y at %r') AS fmt_post_create_time, email, archivo 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> </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']); $archivo=$posts_info['archivo']; //aadimos para mostrar... $display_block .= " <tr> <td width=\"35%\" valign=\"top\">".$email."<br/> [".$fecha_creacion."]</td> <td width=\"65%\" valign=\"top\">".$texto_post." <strong> Adjunto: </strong><a href=\"$archivo\">".$archivo."</a><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> </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>"; } ?> <html> <head> <title>Posts del tema</title> </head> <body> <h1>Posts del tema</h1> <?php echo $display_block; ?> <a href="listatemas.php?<?php echo session_id(); ?>">Volver a la lista de temas</a> </body> </html>

Pgina 14

[FORO] Ivn Martn Valderas


Nuevo_tema.html
<?php session_start(); ?> <html> <head> <title>Nuevo tema</title> </head> <body> <h1>Nuevo tema</h1> <form method="post" action="do_nuevotema.php?<?php echo session_id(); ?>"> <p><strong>Ttulo del tema:</strong><br/> <input type="text" name="titulo_tema" size="40" maxlength="150"/></p> <p><strong>Texto:</strong><br/> <textarea name="texto_post" rows="8" cols="40" wrap="virtual"></textarea></p> <p><input type="submit" name="submit" value="Aadir tema"/></p> </form> </body> </html>

Nuevo_usuario.html
<html> <head> <title>Nuevo usuario</title> </head> <body> <form method="post" action="registro.php"> <h1>Introduzca sus datos <p><strong>E-mail:</strong><br/> <input type="text" name="email"/></p> <p><strong>Contrasea:</strong><br/> <input type="password" name="password"/></p> <p><input type="submit" name="submit" value="Comprobar disponibilidad"/></p> </form> </body> </html>

Perfilusuario.php
<?php session_start(); //conexin al servidor $mysqli = mysqli_connect("localhost", "admin", "asir1", "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 ($_POST) { //subir avatar foreach($_FILES as $file_name => $file_array) { $file_dir = "C:\\xampp\\htdocs\\foro\\".$file_array["name"]; if (is_uploaded_file($file_array["tmp_name"])) { move_uploaded_file($file_array["tmp_name"],$file_dir) or die ("No se pudo copiar"); } } //actualizar perfil usuario: $subir_avatar_sql="UPDATE usuarios SET avatar='".$file_array["name"]."' WHERE email='".$email."'"; $subir_avatar_res=mysqli_query($mysqli, $subir_avatar_sql) or die(mysqli_error($mysqli));

} //obtener los datos del usuario: $datos_usuario_sql = "SELECT email,avatar FROM usuarios WHERE email='".$email."'"; $datos_usuario_res = mysqli_query($mysqli, $datos_usuario_sql) or die(mysqli_error($mysqli)); $ret=mysqli_fetch_array($datos_usuario_res); $avatar=$ret['avatar']; //mostrar datos por pantalla: $display_block = " <form method=\"post\" enctype=\"multipart/form-data\" action=\"".$_SERVER["PHP_SELF"]."\"> <h2>".$email."</h2></br> <h3>Avatar actual:</h3></br> <IMG SRC=".$avatar." WIDTH=140 HEIGHT=140> <p><strong>Subir/cambiar avatar:</strong> <input type=\"file\" name=\"file\" /></p> <p><input type=\"submit\" name=\"submit\" value=\"Aadir avatar\"></p> </form> "; //cerramos conexin mysqli_close($mysqli);

?> <html> <head> <title>Perfil de usuario</title> </head> <body> <?php echo $display_block; ?> <a href="listatemas.php?<?php echo session_id(); ?>">Entrar al foro</a></h1> </body> </html>

Pgina 16

[FORO] Ivn Martn Valderas


Registro.php
<?php if ((!$_POST["email"]) || (!$_POST["password"])) { header("Location: nuevo_usuario.html"); exit; }

//Conexin a la base de datos $mysqli = mysqli_connect("localhost", "admin", "asir1", "foro"); //comprobar que el usuario que intenta registrarse no lo est ya $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)); //Si el usuario ya existe if (mysqli_num_rows($nuevo_usuario_res) < 1) { //El usuario no existe, luego le permitimos registrarse con ese email: $nuevo_usuario_2_sql="INSERT INTO usuarios (email,password) VALUES('".$_POST["email"]."','".$_POST["password"]."')"; $nuevo_usuario_2_res=mysqli_query($mysqli, $nuevo_usuario_2_sql) or die(mysqli_error($mysqli)); $display_block = "<p><em>Registro realizado con xito!</em></p>"; } else { $display_block = "<p><em>Ese e-mail ya est registrado...</em></p>"; } //Cerramos conexin MySQL mysqli_close($mysqli); ?> <html> <head> <title>Creacin de un nuevo usuario</title> </head> <body> <h1>Creacin de un nuevo usuario</h1> <?php echo $display_block; ?> </body> </html>

3. Prctica

Pgina 18

[FORO] Ivn Martn Valderas

Pgina 20

[FORO] Ivn Martn Valderas

4. Anterior:

Borrado de Usuarios: Creamos un nuevo usuario que ser borrado:

Pgina 22

[FORO] Ivn Martn Valderas

5. Foro: post con adjuntos y seguridad.


A-Modificacin en la Base de Datos: Alter table posts_foro add(archivo varchar(150));

B-Modificacin del fichero contestarpost.php para los adjuntos:

Contestarpost.php
<?php session_start(); $mysqli = mysqli_connect("localhost", "admin", "asir1", "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; } //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"]."'"; $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>Post Text:</strong><br/> <textarea name=\"texto_post\" rows=\"8\" cols=\"40\" wrap=\"virtual\"></textarea> <input type=\"hidden\" name=\"id_tema\" value=\"$id_tema\"> <p><strong>Archivo para subir:</strong> <input type=\"file\" name=\"file\" /></p> <p><input type=\"submit\" name=\"submit\" value=\"Aadir post\"></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']; if ($email=="") { //intenta crear un tema un usuario no registrado: le redireccionamos a la lista de temas header("Location: listatemas.php"); exit; } foreach($_FILES as $file_name => $file_array) { $file_dir = "C:\\xampp\\htdocs\\foro\\".$file_array["name"]; if (is_uploaded_file($file_array["tmp_name"])) { move_uploaded_file($file_array["tmp_name"],$file_dir) or die ("No se pudo copiar"); } //aadir post if(!$_FILES["file"]["name"]){ $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')";

}else{ $add_post_sql = "INSERT INTO posts_foro (id_tema,texto_post, fecha_creacion,email,creacion,archivo) 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)); //cerrar conexin mysqli_close($mysqli); //redireccionar usuario al tema header("Location: mostrartema.php?id_tema=".$_POST["id_tema"]); exit; } } ?>

Pgina 24

[FORO] Ivn Martn Valderas

C-Opcin se subir un avatar en el Perfil

Entramos en el perfil de princee11:

Igualmente la cambiamos en el administrador:

Pgina 26

[FORO] Ivn Martn Valderas

6. Anlisis de la seguridad de la aplicacin:

6.1 XSS
Lanzamos un escaneo con Acunetix para comprobar si encuentra vulnerabilidades automticamente sobre nuestro foro:

Como vemos se ven 3 archivos .php afectados:

Pgina 28

[FORO] Ivn Martn Valderas

Lanzamos un ataque con el editor

Escribimos la URL en nuestro explorador y nos encontramos con la vulnerabilidad:

Probamos ahora a buscar a mano a ver qu encontramos: Vamos a probar a escribir un post, pero lo vamos a hacer intentando injectar cdigo xss:

Pgina 30

[FORO] Ivn Martn Valderas


Lo que recibimos es una respuesta del servidor mysql, no es vulnerable de esta manera, pero al menos nos da algunos datos, como que utiliza mysql y 3 valores: now(), admin@asir.es y NO adems de la lnea en la que se encuentran: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SORPRESA!! Esto es XSS') ', now(),'admin@asir.es','NO')' at line 4

Ahora que ya tenemos un par de pistas, vamos a usar el cdigo que nos ha proporcionado Acunetix para comprobar la vulnerabilidad a mano:

Al hacer clic en Add Post Obtenemos el mensaje de la vulnerabilidad:

6.2 SQL

Ya sabemos de la prueba anterior que la vctima utiliza un servidor MySQL, por lo que vamos a utilizar los pasos que ya hemos realizado en otras pruebas como gua:

A) Servidor de BD y Versin:
Comenzamos con la opcin b para averiguar ms sobre el objetivo:

Obtenemos los siguientes datos:

Corre sobre un Sistema Operativo Windows y utiliza Apache, PHP y MySQL 5.0.0 que es lo que ahora nos interesa

B) Nombre de la BD:
--current-db

Obtenemos el nombre: foro

Pgina 32

[FORO] Ivn Martn Valderas

C) Tablas:
--tables D foro

Conseguimos esos 4 nombres de las tablas

D) Columnas
--columns T usuarios D foro

Conseguimos esas 2 columnas dentro de la tabla usuarios, ahora procedemos a rellenar:

E) Contenido:
--dump T usuarios D foro

Ahora obtenemos tanto los usuarios como las contraseas con lo cual podemos acceder como lo hara el propio usuario. Adems de disponer de la ms importante: admin@asir.es que tiene todos los privilegios.

F) Resto de Bases de Datos: Esta es ya informacin aparte, pero que podra venir bien si por ejemplo supiramos que el servidor soporta otras pginas. --dbs

Pgina 34

[FORO] Ivn Martn Valderas

G) Usuarios de MySQL:
--users

H) Secuestro de Sesion:
Hemos comprobado que hay una tabla llamada sesiones a la cual podemos acceder mediante sqlmap y comprobar su id_sesion --dump T sesiones

Llegados a este punto, no es necesario el uso de ello ya que disponemos tanto del usuario como de la contrasea de cualquiera de los registrados por lo que el secuestro en una u otra medida ya est hecho.

You might also like