Sanear los parámetros de URL en get_query_var()

26 oct 2019, 11:45:10
Vistas: 13.9K
Votos: 5

Actualmente estoy trabajando en un sitio y probando su seguridad. Una de las páginas tiene una función de ordenamiento donde paso un parámetro en la URL para indicar cómo quiero ordenar el contenido.

Por ejemplo:

www.example.com/page/?sort=alpha

Esto funciona bien, pero también intenté enviar código malicioso:

www.example.com/page/?sort=alpha%3Cimg+src=xyz+onerror=alert(99)%3E%3Cxss/%3E

En Internet Explorer cuando ingreso esta URL mi página aparece y un alert de JavaScript se ejecuta, demostrando que pude ejecutar código en la página. En Chrome recibo el mensaje de que el auditor XSS bloqueó esta ejecución, pero prefiero que ni siquiera se intente ejecutar. Según veo, este parámetro se acepta en mi archivo header.php bajo Sort : <?= get_query_var('sort') ?>.

Quiero sanear esta entrada para que nunca ejecute tal script, ¿cómo puedo hacer esto?

1
Comentarios

El ordenamiento suena como un complemento que estás utilizando. Si es así, la mejor manera de manejarlo es informar al desarrollador que has encontrado una vulnerabilidad y que necesita ser mitigada.

butlerblog butlerblog
27 oct 2019 01:59:40
Todas las respuestas a la pregunta 1
2

Hay una ligera desconexión entre el título de tu pregunta y la pregunta en sí.

Parece que estás usando un plugin (o desarrollando un plugin) que permite cierto ordenamiento en el front-end. Si es un plugin que estás usando y el parámetro de la cadena de consulta no está sanitizado, debes notificar al desarrollador del plugin, porque eso es un problema de seguridad.

Arreglarlo tú mismo podría resolver el problema temporalmente, pero realmente no deberías editar plugins directamente (incluso los mal codificados), ya que eso te deja en la mala posición de tener que volver a aplicar los cambios cuando haya una actualización del plugin.

El nombre de la función get_query_var() puede ser confuso. Mucha gente la ve como un sustituto práctico de WordPress para $_GET[], pero eso no es lo que hace. get_query_var() SOLO funciona para variables que son parte de la consulta global de WP. Esto incluye varios valores predeterminados de WP, junto con cualquier variable personalizada (agregada con set_query_var()).

Un plugin que aplica una reescritura de URL personalizada para sus endpoints podría ser un ejemplo de esto. Pero si crees que puedes usarla para obtener cualquier variable de consulta de la URL, eso no funcionará porque get_query_var() no hace eso.

Necesitas buscar dónde se recoge este argumento de consulta. Lo más probable es que se haga usando $_GET['sort'].

Sea lo que sea, debería ser:

$some_var = sanitize_text_field( $_GET['sort'] );

O incluso mejor:

$some_var = ( isset( $_GET['sort'] ) ) ? sanitize_text_field( $_GET['sort'] ) : 'algún valor predeterminado';

Obviamente, estoy respondiendo basado en algunas suposiciones, cuyos detalles no se incluyeron en tu pregunta. Si me equivoco, actualiza tu pregunta con más información y editaré en consecuencia.

27 oct 2019 20:41:58
Comentarios

¡Muchas gracias, esto funciona!

user2924127 user2924127
28 oct 2019 00:12:40

Me alegra saber que te funcionó. Solo para enfatizar, si esto está en un plugin que estás usando, hazle saber al desarrollador para que pueda corregir la vulnerabilidad.

butlerblog butlerblog
28 oct 2019 23:46:46