Puesto que ya está disponible la Release Candidate 2 de WordPress 2.1.3 y 2.0.10, paso a comentar, como lo había prometido, los detalles del fallo de seguridad que afecta a todas las versiones menores a las que liberaron hoy (me parece que se salvan los que corren PHP como CGI, los que estén usando la alternativa de solución que propuse, los que tengan activo el módulo mod_security
o PATH_INFO
deshabilitado en sus servidores Web).
Este problema se origina por el valor que puede llegar a tener $_SERVER['PHP_SELF']
debido a que ésta es fácilmente manipulable por el cliente, tal como se puede apreciar en el caso menéame o uno de los ejercicios que mi buen amigo Braulio puso cuando todavía estaba en Cusco.
Repasando un poco el comportamiento de esta variable, tomaremos como base el siguiente código:
php:
<?php
// php_self.php
header('Content-type: text/plain');
echo $_SERVER['PHP_SELF']."\n";
echo $_SERVER["PATH_INFO"]."\n";
?>
Si alguien intenta invocar a nuestro script de la siguiente manera: /php_self.php/<xss>
, entonces lo que se envía al navegador es lo siguiente:
code:
/php_self.php/<xss>
/<xss>
En WordPress, existe un sólo lugar* en el que se envía directamente el contenido de esta variable al navegador, ésta se encuentra en la función get_pagenum_link
de wp-admin/link-template.php
.
php:
$index =
$_SERVER['PHP_SELF'];
$index =
preg_replace('|^'.
$home_root .
'|',
'',
$index);
$index =
preg_replace('|^/+|',
'',
$index);
Una vez identificado el punto débil, para conseguir ejecutar javascript usando este problema, depende de la estructura que hayan definido para las URL, por ejemplo una instalación normal (versión 2.1.3 RC1) es muy probable que sea afectada.
En la siguiente entrega viene la parte más interesante de este bug, es muy probable que lo ponga como ejercicio para la siguiente semana 😉 , mientras tanto, los que tienen blogs basados en WordPress, vayan actualizando sus versiones.
*: si alguien encuentra más, puede ayudar reportándolo a través de la página de incidencias de WordPress.