Breves nostas de la vulnerabilidad:
La vulnerabilidad reside en la API Rest de WordPress. En nuestro caso se encuentra en http://albertomagallon.es/wp-json/
Se puede encontrar buscando en el código fuente de la página la URL: https://api.w.org/
Cuando se actualiza una entrada se envía a la API Rest el identificador de la entrada a actualizar. Este identificador debe de ser númerico.
Si se añaden carácteres alfanuméricos detrás del identificador, la función que valida los permisos (update_item_permissions_check) no encuentra la entrada y no valida nada.
Aquí viene el primer error, aún no habiendo validado ningún permiso porque no ha encontrado la entrada que hay que actualizar, el flujo de ejecución continúa hacia la función que actualiza la entrada (update_item).
En este punto lo lógico sería que de nuevo tampoco encontrara la entrada pero en cambio hace la búsqueda de otra manera. Antes de llamar a la función get_post para búscar la entrada con el valor alfanumérico que le hemos pasado, hace un cast de la variable con (int)$request[‘id’];.
Esto en PHP resulta en una omisión de los carácteres alfabéticos quedando únicamente los númericos. Es decir, ésta vez la función si que encuentra la entrada y la actualiza sin tener permisos. El segundo error.
La salida del siguiente código:
#!/usr/bin/php <?php $id = ((int)"1234ABCDE"); echo $id ?>
es 1234
Detalles de la vulnerabilidad en el blog de Sucuri: https://blog.sucuri.net/2017/02/content-injection-vulnerability-wordpress-rest-api.html
Exploit en github: https://gist.github.com/leonjza/2244eb15510a0687ed93160c623762ab
Exploit-db: https://www.exploit-db.com/exploits/41223/