Un bug interesante en Wordpress
Por: alex | 10 Enero 2007 | Ver comentarios |
El presente quiz está basado en un reciente bug de Wordpress que fue corregido en la versión 2.0.6 de este CMS
<?php
header('Content-type: text/plain; charset=utf-8;');
if ( empty($_POST['title']) ) {
die('Parámetros no válidos');
}
// Conexión a la base de datos test
mysql_connect('localhost', 'root', '1234');
mysql_select_db('test');
// Escapar los valores
$title = mysql_real_escape_string($_POST['title']);
// Hacer la conversión si se envía el parámetro charset
if ( !empty($_POST['charset']) ) {
// Verificar si la extensión mb_string está habilitada
if ( function_exists('mb_convert_string') ) {
$title = @mb_convert_encoding($title, 'UTF-8', $_POST['charset']);
}
// Verificar si la extensión iconv está habilitada
elseif ( function_exists('iconv') ) {
$title = @iconv($_POST['charset'], 'UTF-8', $title);
}
}
$sql = "SELECT * FROM wp_posts WHERE post_title = '$title'";
if ( $result = mysql_query($sql) ) {
while ($row = mysql_fetch_assoc($result)) {
print_r($row);
}
mysql_free_result($result);
}
/*
Muestra el error intencionalmente
*/
if ( $error = mysql_error() ) {
echo "MySQL: $error\nConsulta: $sql";
}
mysql_close();
?>¿Dónde se encuentra el error? y ¿cómo explotarlo? (Si desean puedo colgar una página para que hagan las pruebas)


stefano
12 de Enero de 2007, 12:48:45 pm
“creo” que el error por $_POST[’title’]
cuando se realiza la consulta sql
$title = $_POST[’title’]
$sql = “SELECT * FROM wp_posts WHERE post_title = ‘$title’”;
podriamos agregar mas cosas a la consulta sql, realmente nose si se puede hacer eso voy a googlear un poco y ahi vere
alex
12 de Enero de 2007, 12:59:40 pm
Si miras el código, se aplica la funcion mysql_real_escape_string sobre el valor de
$_POST['title'], así que el error no vá por ahístefano
12 de Enero de 2007, 04:58:50 pm
ouch
alex
12 de Enero de 2007, 05:32:02 pm
je je, en realidad el error es más simple de lo que parece, sólo basta observar un pequeño detalle.
jdeveloper
13 de Enero de 2007, 08:38:32 am
¿y para que imprimes la consulta si hay error? ah no ser que lo uses solo en un server de pruebas, que supongo que no es la intencion del ejercicio.
alex
13 de Enero de 2007, 08:46:49 am
jdeveloper, se imprime la consulta para facilitar el trabajo de los que se tomen la molestia de probar ese código.
agustí
14 de Enero de 2007, 07:24:20 am
No acabo de ver como, pero esta claro que title es modificado despues de mysql_real_escape_string() en caso de existir un charset.
Así una \’ podría modificar la \ por algun conjunto de caracteres y dejar el ‘ con que la injectsql seria posible.
alex
14 de Enero de 2007, 09:01:55 am
En efecto agusti, ese es el problema que presenta el código mostrado.
La documentación de PHP dice lo siguiente sobre mysql_real_escape_string:
Como mencionabas, sólo habría que usar un charset en el que
'sea expresado en otra secuencia de caracteres, así se inutiliza completamente el uso de mysql_real_escape_string.agustí
14 de Enero de 2007, 11:33:54 am
Es (más) fácil ver un bug cuando te dicen que hay uno… de todas maneras y como norma escapar cadenas siempre es interesante hacerlo lo ultimo.
agustí
15 de Enero de 2007, 02:28:19 am
Encontrado: +ACc- UTF-7
alex
15 de Enero de 2007, 07:43:53 am
Exacto