PHP SELF y XSS


He encontrado un artículo que afirma que $_SERVER['PHP_SELF'] es vulnerable a XSS.

No estoy seguro de si lo he entendido correctamente, pero estoy casi seguro de que está mal.

¡Cómo puede esto ser vulnerable a los ataques XSS!?

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>
 27
Author: Danny Beckett, 2011-05-21

4 answers

Para que sea seguro de usar, debe usar htmlspecialchars().

<?php echo htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, "utf-8"); ?>

Ver Una Vulnerabilidad XSS en Casi Todas Las Formas PHP que He Escrito para ver cómo $_SERVER["PHP_SELF"] puede ser atacado.

 32
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 17:28:14

Es de hecho una vulnerabilidad XSS. Entiendo que creas que no puede dañar tu sitio web, pero esto no significa que no sea real.

Si no lo cree, intente lo siguiente:

Asumimos que tiene una página como "registro.php". Asumimos que tiene un formulario donde la acción es:

<?php echo $_SERVER['PHP_SELF']; ?>

Como usted lo puso en verdad:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>

Ahora simplemente añade la cadena de abajo

%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E

No es realmente difícil de entender, porque PHP_SELF es un reflejo de la URL, su aplicación leerá lo que ponga en la URL y se hará eco de ella. Es tan simple como eso.

Htmlspecialchars debe hacerse cargo del asunto, sin razón para disputar la evidencia.

<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
   <!-- form contents -->
</form>

Sin embargo, incluso este es un primer paso para steeling una cookie, no es que se lleve a cabo automáticamente. Incluso si es bastante fácil crear el ataque (ya que el atacante se registrará en su sitio y verá cómo se ve la cookie...sucesivamente.), una serie de otros factores deben ser ciertos para llegar a la punto de tener una situación de acero de galletas. Por ejemplo, la cookie no debe estar caducada. De lo que depende de lo compleja que sea la cookie. Que tal vez usted tiene otras precauciones en colocado en el servidor, no tiene que ser toda la autenticación basada en la presencia de cookie!

Si bien creo que es bastante difícil y realmente mala programación para todas las condiciones a cumplir (incluso si yahoo.correo, por ejemplo, tenía una vulnerabilidad y si se mira en Internet se encuentra incluso el exploit y el decodificador de cookies), el XSS es real y quién sabe lo que un atacante astuto puede hacer si su sitio sufre de ella. La cura es simple...

 24
Author: Florin Sima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-22 13:55:51

El mismo artículo que enlazaste te da:

http://www.example.com/form.php/%22%3E%3Cscript%3Ealert(‘xss attack’)%3C/script%3E%3Cbr%20class=%22irrelevant

¿Qué no está claro?

Editar: este es un ataque XSS porque puedo ocultar un enlace de mi sitio al tuyo con algunos JS agregados a la URL que me envía sus cookies para que en el momento en que haga clic en ese enlace, esté pwnd.

 15
Author: chx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-21 10:13:52

Deberías usar filter_input() para acceder a superglobales en PHP. Si establece el filtro en FILTER_SANITIZE_FULL_SPECIAL_CHARS eliminará los caracteres inseguros que normalmente se usan en XSS. Dado su ejemplo:

<form method="post" 
    action="<?php filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_FULL_SPECIAL_CHARS); ?>">
<!-- form contents -->
</form>
 2
Author: Adam Bowen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-25 15:36:55