2010-05-25 22 views
6

He estado leyendo acerca de XSS e hice un formulario simple con una entrada de texto y envío, pero cuando ejecuto <script>alert();</script>, no ocurre nada, el servidor obtiene esa cadena y eso es todo.¿Qué hace que una entrada sea vulnerable a XSS?

¿Qué tengo que hacer para hacerlo vulnerable? (entonces aprenderé lo que no debería hacer jeje)

Saludos.

+0

¿Está utilizando algún idioma del lado del servidor? – StingyJack

+0

.NET (pero no ASP.NET) – vtortola

Respuesta

20

De hecho, solo deje que el servidor lo emita para que la cadena de entrada se incruste efectivamente en el código fuente HTML que se devuelve al cliente.

ejemplo PHP:

<!doctype html> 
<html lang="en"> 
    <head><title>XSS test</title></head> 
    <body> 
     <form><input type="text" name="xss"><input type="submit"></form> 
     <p>Result: <?= $_GET['xss'] ?></p> 
    </body> 
</html> 

ejemplo JSP:

<!doctype html> 
<html lang="en"> 
    <head><title>XSS test</title></head> 
    <body> 
     <form><input type="text" name="xss"><input type="submit"></form> 
     <p>Result: ${param.xss}</p> 
    </body> 
</html> 

alternativa, se puede volver a mostrar el valor de los elementos de entrada, que también es a menudo visto:

<input type="text" name="xss" value="<?= $_GET['xss'] ?>"> 

resp.

<input type="text" name="xss" value="${param.xss}"> 

esta manera las cadenas de ataque "extraños" como "/><script>alert('xss')</script><br class=" funcionarán porque el servidor hará que después de todo lo

<input type="text" name="xss" value=""/><script>alert('xss')</script><br class=""> 

soluciones XSS de prevención son entre otros htmlspecialchars() y fn:escapeXml() para PHP y JSP, respectivamente. Esos reemplazarán entre otros <, > y " por &lt;, &gt; y &quot; de modo que la entrada del usuario final no quede literalmente incrustada en el código HTML, sino que se visualice tal como fue ingresada.

19

Haga que el servidor devuelva la entrada al cliente.

+2

Leí "Hacer que el servidor devuelva la entrada al cliente", y pensó wow, esa es la respuesta más simple y definitiva a esta pregunta. –

4

Debería "inyectar" la secuencia de comandos. Así que si usted tiene una entrada de texto, que debe poner en la forma:

" /> <script>alert();</script> 

De esta manera se cierra primero el atributo del HTML existente y luego inyectar su propio código. La idea es escapar de las citas.

+0

Eso no es lo que está preguntando. Él sabe cómo realizar el ataque, está preguntando qué hace que una entrada sea vulnerable. – 0112

2

Google hizo un tutorial realmente impresionante que cubre XSS y otras vulnerabilidades de seguridad here. Puede ayudarlo a comprender cómo se explotan estos problemas en aplicaciones reales.

+2

Ese enlace ahora está muerto ... – mix3d

1

Tres cosas simples:

  1. Si usted no está la salida de datos que no se confía a la página en algún momento no hay oportunidad para XSS
  2. Todos sus untusted de datos (formularios, cadenas de consulta, cabeceras, etc) debe validarse contra una lista blanca para asegurar que esté dentro de un rango aceptable
  3. Toda su salida a la pantalla debe estar codificada con una biblioteca apropiada (es decir, Anti-XSS para .NET) en el idioma apropiado (HTML, CSS, JS, etc.)

Más información con ejemplos en OWASP Top 10 for .NET developers part 2: Cross-Site Scripting (XSS).

Cuestiones relacionadas