Bug en WordPress 3.5 que permite Inyección SQL

En Desarrollo, Webmasters por

Después de la actualización a WordPress 3.5, salen a la luz los primeros “fallos” de seguridad. En concreto la función $wpdb->prepare() es la que nos presenta el problema.

Bug en WordPress 3.5 que permite Inyección SQL

Y pongo fallos entre comillas porque en realidad esta es una mejora de seguridad y sólo afecta de forma negativa a los plugins o códigos mal escritos por desarrolladores, por lo que este nuevo error tiene una parte negativa (los plugins que usen esta función de forma incorrecta pueden ser atacados) y una parte positiva (obliga a los desarrolladores a actualizar sus plugins para que no muestre el error y así queden escritos de forma correcta y segura).

Los desarrolladores de WordPress han implementado en esta función $wpdb->prepare() el reporte de errores y con ella facilitan el poder ejecutar una inyección SQL en nuestro WordPress y obtener datos como usuarios, correos, contraseñas encriptadas o incluso podrán obtener acceso a nuestro servidor si el servidor MySQL no está correctamente asegurado.

El problema radica en que esta función muestra el siguiente error:

“PHP Warning: Missing argument 2 for wpdb::prepare().”

Empleando este error se pueden realizar Inyecciones SQL ciegas y poner en peligro nuestro blog.

¿Cómo solucionar el problema de inyección SQL en WordPress 3.5?

Si ves este error en tu blog no dudes en desactivar el plugin o código que lo genera, para así mantener tu blog a salvo de ataques mientras no solucionas el problema.

Un ejemplo de código mal escrito es:
$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->comments SET comment_parent=$par_ID WHERE comment_ID=$com_ID;" ) );

El código anterior incluye las variables $par_ID y $com_ID directamente en la query SQL, lo cual es muy peligroso ya que un usuario podría modificar esas variables según sus necesidades para realizar un ataque.

El código escrito de forma correcta sería:
$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->comments SET comment_parent=%d WHERE comment_ID=%d;", $par_ID, $com_ID ) );

Como se puede ver en el código, en nuestro caso ambas variables son valores enteros y se sustituyen por %d y las variables se ponen al final de la función separadas por comas. Esta sería la forma correcta de utilizar la función $wpdb->prepare().En caso de que nuestras variables fuesen cadenas de texto en lugar de usar %d emplearíamos %s.

Espero que os haya servido de ayuda y recordad, si veis el error “PHP Warning: Missing argument 2 for wpdb::prepare().” desactivad inmediatamente los plugins uno por uno, para ver cuál es el que genera el error, si tras desactivar todos los plugins el error sigue apareciendo el problema está en vuestro theme y deberéis solucionarlo cuanto antes.