Professional Documents
Culture Documents
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
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)
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
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
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
Do_nuevotema.php
<?php session_start();
//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
?> <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
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
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
//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
Pgina 20
4. Anterior:
Pgina 22
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
Pgina 26
6.1 XSS
Lanzamos un escaneo con Acunetix para comprobar si encuentra vulnerabilidades automticamente sobre nuestro foro:
Pgina 28
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
Ahora que ya tenemos un par de pistas, vamos a usar el cdigo que nos ha proporcionado Acunetix para comprobar la vulnerabilidad a mano:
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:
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
Pgina 32
C) Tablas:
--tables D foro
D) Columnas
--columns T usuarios D foro
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
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.