Anuncia aquí

Quiz sobre validación de datos en PHP

El código mostrado a continuación, es una versión reducida de una falla de seguridad presente en una aplicación algo conocida.

Indiquen la falla, lo que se puede hacer con ésta, una forma de explotarlo y la solución que plantean al mismo:

php:
// demo.php
<?php

include './db.php';

error_reporting(0);

$tb_url    = $_POST['url'];
$title     = $_POST['title'];
$excerpt   = $_POST['excerpt'];

if (empty($title) || empty($tb_url) || empty($excerpt)) {
        die ('Invalid values');
}

$titlehtmlspecialchars( strip_tags( $title ) );
$title = (strlen($title) > 150) ? substr($title, 0, 150) . '...' : $title;
$excerpt = strip_tags($excerpt);
$excerpt = (strlen($excerpt) > 200) ? substr($excerpt, 0, 200) . '...' : $excerpt;

$contents=@file_get_contents($tb_url);
if(!$contents) {       
        die('The provided URL does not seem to work.');
}

$query = "INSERT INTO tabla (url, title, excerpt) VALUES ('%s', '%s', '%s')";

$db->query
        (
                sprintf (
                        $query,
                        $db->escape($tb_url),
                        $db->escape($title),
                        $db->escape($excerpt)
                        )
        );

?>
php:
// show.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
        <head>
                <title>Bug</title>
        </head>
        <body>

                <ul>
                <?php

                include './db.php';
                $items = $db->get_results('SELECT url, title, excerpt FROM tabla');

                foreach ($items as $tb) :
                        echo '<li><a href="'.$tb->url.'" title="'.$tb->excerpt.'">'.$tb->title.'</a></li>';               
                endforeach;

                ?>
                </ul>

        </body>
</html>

Para el acceso a datos se usa la clase ez_sql, el método escape en mi versión, contiene lo siguiente:

php:
function escape($string) {
        if (get_magic_quotes_gpc())
                $string = stripslashes($string);
        return mysql_real_escape_string( $string, $this->dbh );
}

Esta entrada fue publicada en PHP, Quiz, Seguridad

6 Comentarios

  1. 1 anabel (24 de octubre de 2006, 09:59:18 am)

    hola alguien me podria decir como le hago para que exporte variables de una pagina php a html mi situacion esta asi:
    en una pag. php despliego un reporte de una base de datos oracle pero en el query no puedo hacer los ajustes que necesito asi que me piden que construya una pagina html y ahi haga manualmente los ajustes que necesito y no se como hacer
    ojala me puedan ayudar

  2. 2 diegocaro (26 de junio de 2007, 11:10:11 pm) http://diego.bloog.cl

    Buenas, aún no capto el problema de seguridad. ¿Podrías dar alguna indicación para encontrar el error?

    Saludos, y desde ya gracias!

  3. 3 alex (26 de junio de 2007, 11:30:24 pm) http://www.buayacorp.com

    Ese código es vulnerable a dos problemas de XSS: la explicación para el primero puedes verlo en [1], el segundo problema es específico para Internet Explorer, tiene que ver con un bug en el manejo de codificaciones multibyte [2]

    Saludos

    [1] http://www.buayacorp.com/archivos/importancia-de-la-validacion-de-datos/
    [2] http://forums.devnetwork.net/viewtopic.php?p=372842#372842

  4. 4 diegocaro (26 de junio de 2007, 11:43:59 pm) http://diego.bloog.cl

    Pero cuando haces $db->escape($tb_url), se deberían escapar los " , ', etc... que se introduzcan en la url, digamos, no podrías ver la url con el XSS incluido "correctamente".

  5. 5 alex (26 de junio de 2007, 11:53:28 pm) http://www.buayacorp.com

    Ten en cuenta que $db->escape($tb_url) no sirve para evitar ataques XSS, sólo se usa para hacer consultas más seguras a la base de datos.

  6. 6 diegocaro (27 de junio de 2007, 11:20:54 pm) http://diego.bloog.cl

    Vale, vale... que ayer tenía un poco de sueño xD.

    Gracias por el tiempo ;) .

    Saludos desde Chile.

Publicar un Comentario

Tu email nunca será publicado o compartido. Los campos requeridos están marcados con un *

*
*

Puedes usar estas etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>