XSS en JavaScript

2

Hace poco me di cuenta de algo en una aplicación web y encontré que la URL se refleja entre la fuente de la página, lo que la hace bastante obvia para XSS, pero la entrada de la URL que se refleja en la fuente se asigna dentro de un% etiqueta <script> .

URL:

http://www.xyz.com/back?majorID=usdfg&Action=Themesdig&pbPage=vulnerable area&QI.fd_id=random.3232

Código:

<script type="text/javascript">
var _TM = {
    cc : 'RUP'
    ,ll : 'en-US'
    ,mkt : 'IN'
    ,geo : 'IN' 

        ,pagename : 'vulnerable area'
        ,pagetype : 'Custom'
        ,channel : 'Custom'

    }
</script>

Entonces, en el primer momento, pensé que un alert('xxx') es suficiente para crear un POC, pero insertar una alerta o cualquier otra cosa hace que el código se vuelva defectuoso y no se pueda reproducir y no puedo cerrar la etiqueta de script ya que la aplicación está desinfectando < , > y ' a su representante HTML.

Y la aplicación web también acepta valores hexadecimales. Ingresé Retorno de carro% 0D (solo para confirmar que están aceptando) y funcionó.
Entonces, ¿cómo puedo ejecutar JavaScript en esta situación y crear POC?

Durante estos días, obtuve una respuesta casi completa ' };alert(13);var misc={a:b , pero el único problema es ' al principio. Debe haber alguna forma de superar el problema también.

    
pregunta user38257 21.09.2014 - 14:41
fuente

2 respuestas

3
  

Así que en el primer momento pensé que una alerta ('xxx') es suficiente para crear un POC pero insertando una alerta o cualquier otra cosa está llevando al código a fallar

Por lo general, romper el código es una buena señal. Un error de sintaxis puede mostrar que la víctima no está realizando los escapes correctos para mantener el código válido. Mire la fuente generada para ver qué produce para su entrada. Si solo hiciera alert('xxx') y el sitio de destino no pudiera codificarlo, obtendría:

    ,pagename : 'alert('xxx')'

que es de hecho un error de sintaxis. Necesitaría (1) escapar del contexto en el que se está inyectando, con un ' ; (2) ordenar el contexto circundante terminando la instrucción var , con }; ; (3) inserte su carga útil; (4) Enmascara las cosas que se arrastran para que no cause más errores. es decir: '};alert('xxx');/*

Si el sitio de destino escapa ' , mire otros caracteres que son especiales en el contexto de una cadena literal de JavaScript. En particular: la barra invertida, que introduce secuencias de escape. Si el objetivo recordara escapar de ' a \' , pero no escapó a la barra invertida, dándole \' terminaría escapando a \' , que es una barra invertida literal y luego una comilla simple, terminando el cadena literal y te da la oportunidad de explotar de nuevo.

Los otros caracteres que son especiales en los literales de cadenas de JavaScript son nuevas líneas, incluidas las nuevas líneas Unicode U + 2028 / U + 2029, pero generalmente no hay mucho que puedas hacer con estas porque simplemente no están permitidas y rompen el código. Hay ocasiones en que la terminación temprana de un fragmento de código se puede usar en un ataque, pero no es la simple inyección directa de la que estamos hablando aquí.

  

pensé en insertar un montón de codificación de borrado hexadecimal (es decir,% 127) para eliminar el tipo de página y el canal, pero la aplicación web está pensando en% 127 como% 12 y también está fallando mi segundo plan.

127 es decimal no hexadecimal. Querías %7F .

Los caracteres eliminados no tienen poderes especiales en JavaScript o HTML, no podrías escapar de un contexto literal de cadena de esa manera. El carácter de eliminación solo eliminaría realmente los caracteres anteriores cuando se escribe en un búfer de terminal. Los códigos de terminal son un ataque válido contra aplicaciones que impulsan otras aplicaciones de consola falsificando las entradas de los usuarios, pero probablemente no sea algo que alguna vez va a hacer una aplicación web.

    
respondido por el bobince 21.09.2014 - 17:39
fuente
0

Intenta insertarlo

' + alert('xxx') + '

Esto representará el código fuente anterior como

pagename : '' + alert('xxx') + ''

Esto significa en inglés simple "El valor de _TM.pagename es la cadena que obtienes cuando concatenas una cadena vacía, el valor de retorno de llamar a alert('xxx') y otra cadena vacía". Para construir esta cadena, se llamará a alert('xxx') .

Debido a que la alerta no devuelve nada, la pagename será la cadena "undefined" . Tenga en cuenta que esto podría causar un comportamiento inesperado en un punto posterior de la aplicación web.

    
respondido por el Philipp 25.09.2014 - 11:20
fuente

Lea otras preguntas en las etiquetas