¿Cómo puedo ejecutar un XSS con estas condiciones?

6

Estoy tratando de aprender las pruebas de penetración y he descargado una aplicación vulnerable llamada "Bodgeit Store". He terminado casi todos los desafíos, excepto uno que consiste en ejecutar un ataque de secuencias de comandos entre sitios. Revisé el código fuente de la aplicación y encontré el siguiente código Java:

if (request.getMethod().equals("POST") && comments != null)
{
    anticsrf = request.getParameter("anticsrf");
        if (anticsrf != null && anticsrf.equals(request.getSession().getAttribute("anticsrf")))
            {
                // Strip script tags, because that will make everything alright...
                comments = comments.replace("<script>", "");
                comments = comments.replace("</script>", "");
                // And double quotes, just to make sure
                comments = comments.replace("\"", "");
            .................
            }
}

El desafío dice:

  

"Mostrar una ventana emergente usando: <script>alert("XSS")</script> "

pero mirando la fuente, encontramos que las etiquetas <script> y </script> son reemplazadas por caracteres nulos. Tampoco puedo realizar una solicitud GET porque el código también verifica si la solicitud es POST o no.

He intentado y he tenido éxito en la ejecución de un cuadro de alerta utilizando otros métodos como el uso de un archivo .js externo y así, pero realmente quiero descubrir cómo se podría completar este desafío. Por favor, dame algunas sugerencias sobre cómo resolver este problema.

    
pregunta curiousguy 07.05.2012 - 12:36
fuente

5 respuestas

12

Además de la buena y sencilla respuesta de Gumbo , otra posibilidad sería utilizar la última llamada replace() para evitar las anteriores. por ejemplo como este:

<scr"ipt>alert('XSS')</scr"ipt>

De hecho, sospecho que esta podría ser la solución que esperaba el autor del desafío: no tiene mucho sentido eliminar las comillas excepto para permitir deliberadamente este ataque en particular, y el "solo para asegúrate de que "el comentario incluso llame la atención".

Por supuesto, incluso si el código no elimina las comillas dobles, todavía podría hacer esto:

<scr</script>ipt>alert('XSS')</scr</script>ipt>
    
respondido por el Ilmari Karonen 07.05.2012 - 20:11
fuente
3

Al revisar tu pregunta otra vez, finalmente veo lo que el desafío está tratando de lograr que logres. Observe cómo el código anti-XSS está envuelto por una declaración if que verifica la presencia de un parámetro anticsrf y si es igual al objeto anticsrf presente en el objeto de sesión del usuario. Al romper cualquiera de estas dos condiciones, puede hacer que el código anterior ( <script>alert("XSS")</script> ) funcione de manera efectiva. En otras palabras, si excluye el parámetro anticsrf de la solicitud o cambia el parámetro anticsrf en la solicitud a algo arbitrario, el parámetro comment se reflejará literalmente porque se omitirá el bloque de código que elimina el código XSS.

Otras cosas a considerar:

El contenedor de etiquetas <script> no es el único lugar donde puedes XSS. Echa un vistazo a las otras etiquetas HTML y lo que pueden hacer. Por ejemplo, lo siguiente funciona con las etiquetas <img> :

<img src=javascript:alert('hi'); />

También existen los controladores de eventos onload , onmouseover , etc. asociados con un montón de etiquetas en HTML que podrían aprovecharse para este propósito. Mi mejor sugerencia sería echar un vistazo a la especificación de HTML para obtener más ideas. Si vas a convertirte en un probador de bolígrafos web, entonces ciertamente querrás armarte con ese conocimiento.

    
respondido por el Nadeem Douba 07.05.2012 - 15:35
fuente
1

Formulario de envío automático:

<html>
    <body onload="document.forms[0].submit()">
        <form method="POST" action="...">
        ...
        </form>
    </body>
</html>

XSS sin etiqueta de secuencia de comandos:

<img src="missing" onerror="..." />
    
respondido por el Pierre Ernst 07.05.2012 - 15:17
fuente
1

Me gustan algunas de las otras publicaciones inventivas aquí para obtener respuestas.

Aquí hay algunos simples & estupidos que aparecieron en mi cabeza de inmediato:

<script >alert('XSS')</script >
<SCRIPT>alert('XSS')</SCRIPT>
    
respondido por el Jeff Ferland 16.05.2012 - 22:33
fuente
-1

Podría insertar otros tipos de espacio & tabuladores entre las etiquetas para omitir el filtro.

Por ejemplo:

<scr&#x9ipt>alert('XSS')</scr&#x9ipt>

El código anterior colocará una pestaña entre r & Estoy en ambas etiquetas, haciendo que el código sea inefectivo.

Para superar la secuencia de comandos PHP, puede intentar usar acentos graves (') que se usan en HTML pero que no están filtrados por la mayoría de los filtros escritos a mano.

    
respondido por el krisk 09.02.2013 - 21:38
fuente

Lea otras preguntas en las etiquetas