Mi asignación actual es encontrar una posible inyección de SQL en una aplicación web de PHP. Mientras miraba el código fuente, noté que la forma en que el script maneja las declaraciones preparadas es extraña.
$query = db::prepare("SELECT password FROM vault where id=%s", $_POST['id']);
$res = db::commit($query);
La parte interesante de la función prepare
se ve así:
// escape
foreach ($args as &$value){
$value = static::$db->real_escape_string($value);
}
// prepare
$query = str_replace("%s", "'%s'", $query);
$query = vsprintf($query, $args);
return $query;
Ahora, buscando formas de evitar esto, noté que las comillas simples se escapan, obviamente debido a la función real_escape_string. Mirando por aquí, encontré la siguiente publicación que indica que establecer% s en comillas simples parece altamente sospechoso . Sin embargo, todavía no he encontrado ninguna forma de explotar esto, o incluso si es explotable.
¿Alguien puede decirme si hay algo incorrecto para escapar y procesar la entrada del usuario de esa manera? Sé que usar las funciones de sentencias preparadas de mysqli / PDO originales es una mejor idea, pero dado que este no es mi código, sería genial averiguar qué es exactamente lo que está mal aquí y por qué no debería hacerlo de esta manera.