¿Cómo arreglar problemas XSS específicos en la URL a través de php?

2

Estoy usando la edición de la comunidad Netsparker para verificar si mi aplicación tiene algún agujero de seguridad general. Estoy recibiendo muchas de las siguientes áreas de problemas probables de XSS:

my_php_file.php?nsextt=" stYle=x:expre/**/ssion(alert(9)) ns="

El código en my_php_file.php no acepta ningún parámetro $_GET o $_POST .

Entonces, ¿cómo se supone que debo solucionar este tipo de problemas XSS si ni siquiera estoy usando esos parámetros $_GET o $_POST ?

También en las páginas donde uso $_GET params, obtengo esto:

my_php_file2.php?id=" stYle=x:expre/**/ssion(alert(9)) ns="

Filtré todos los parámetros entrantes (por ejemplo, la identificación del último fragmento):

trim(htmlspecialchars($_GET['id']));

Y después de todo eso, incluso ejecuto el resultado del anterior en preg para permitir solo dígitos en ese parámetro de identificación.

¿Alguien podría ser tan amable y aconsejarme de qué se tratan esas alertas XSS? ¿Cómo abordarlos?

    
pregunta arma 11.05.2012 - 08:06
fuente

3 respuestas

5

Le sugiero que lea sobre la defensa contra XSS. OWASP tiene buenos recursos. Debe aplicar la validación de entrada adecuada a todos los valores de entrada y escapar adecuadamente de todos los valores dinámicos que inserta en el documento HTML de salida. Hay muchos recursos en línea sobre cómo prevenir el XSS.

En cuanto a su aplicación específica, no nos ha proporcionado suficiente información para diagnosticar el problema. ¿Intentaste abrir my_php_file.php?nsextt="..." en tu navegador para ver qué pasa? ¿Aparece un diálogo de alerta? Si ve la fuente de la respuesta, ¿ve un atributo " style=... " en alguna parte de la respuesta? Además, aunque usted dice que no usa ningún parámetro GET en my_php_file.php, ¿es posible que el código en my_php_file.php pueda incluir otro archivo PHP o pueda llamar a alguna otra función que produzca una salida insegura? Sospecho que puede tener una vulnerabilidad XSS que permita la inyección de un nuevo atributo en medio de alguna lista de atributos en algún lugar.

Menciona el enfoque que está utilizando para sanear los parámetros en otras páginas. Me gustaría mencionar que este no es el método adecuado de desinfección de entrada. strip_tags no previene XSS ( strip_tags no garantiza la eliminación de todas las etiquetas; e incluso si lo hizo, eliminar todas las etiquetas no es suficiente, ya que aún se puede montar un ataque XSS inyectando atributos sin inyectar ninguna nueva etiqueta) Una buena regla general es que si estás usando strip_tags , probablemente estés haciendo algo mal.

Más generalmente, la validación de entrada no se trata de lanzar ciegamente cada función de extracción que pueda pensar en los datos. En su lugar, debe verificar que la entrada coincida con una lista blanca o expresión regular adecuada, según sea apropiado para el tipo de datos. Y, cuando genera los datos, debe escapar de una manera que sea adecuada para el contexto donde se insertarán los datos. Por ejemplo, si lo inserta en el contexto HTML estándar entre etiquetas, puede escapar de los datos con htmlescapechars . Si lo inserta como un enlace (como el valor de un atributo href), debe asegurarse de que sea una URL con el formato correcto con un esquema seguro (http o https son seguros; javascript no lo es). Hay mucho más que decir sobre la validación de entrada y el escape de salida: consulte los recursos de OWASP para obtener mucha información sobre este tema.

    
respondido por el D.W. 11.05.2012 - 08:40
fuente
5

Para su primera pregunta, si está seguro de que su código no usa $ _GET o $ _POST, entonces debería estar bien. ¿Pero estás usando un marco o algún otro código? ¿Ha intentado acceder a my_php_file.php?nsextt=hello%20world y buscar "hola mundo" en la fuente? Tal vez olvide que algunos incluyen el uso de $ _GET ['nsextt']?

(nota: al pasar var a través de la url en un navegador, solo se usará $ _GET).

Ahora, para la segunda parte, en lugar de todas esas funciones + preg para verificar si la entrada es un int, debe usar filter_var() funciona en php:

$secure_integer = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT);

Si lo desea, también puede validar la entrada con FILTER_VALIDATE_INT en lugar de FILTER_SANITIZE_NUMBER_INT .

    
respondido por el Cyril N. 11.05.2012 - 09:20
fuente
0

utilice esta biblioteca para protegerse contra ataques XSS Google Code PHP-antixss y también hay funciones de PHP llamadas htmlspecialchars () eso te ayudará mucho y debes saberlo, puedes usar OWASP XSS prevención cheat sheet > como guía también

    
respondido por el P3nT3ster 12.05.2012 - 14:48
fuente

Lea otras preguntas en las etiquetas