Estoy buscando en XSS juego y éste desafío llamado Jeff .
El reto toma un parámetro de consulta denominado jeff
como entrada, y lo almacena en una variable llamada jeff
. El objetivo del reto es cargar un cuadro de alerta en la página. Los usos de soluciones guiones para ejecutar Javascript dentro de una eval()
función.
Por lo tanto, tenemos esta eval:
eval(`ma = "Ma name ${jeff}"`)
Y la entrada de la solución para obtener un cuadro de alerta es (Spoiler de alerta sin juego de palabras!).:
"-alert(1337)-"
Ahora, estoy en desesperada necesidad de entender cómo Javascript trata a esos guiones! ¿¡Ayuda!?
El código que utiliza el sitio es:
let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
eval(`ma = "Ma name ${jeff}"`)
Tenga en cuenta que searchParams
le da un URLSearchParams
objeto, y su .get
método le da una secuencia correspondiente al parámetro. Por lo tanto, el objetivo es llegar a algunos personajes que, cuando se inserta en
ma = "Ma name <CHARACTERS>"
y correr, da como resultado la ejecución de código arbitrario.
El primer paso es rodear los caracteres en "
s, con el fin de acabar con el literal de cadena después de la name
y reanudar un literal de cadena después de los caracteres:
ma = "Ma name " <SOMETHING ELSE> ""
Así que ahora usted tiene que averiguar qué tipo de caracteres puede entrar en <SOMETHING ELSE>
lo que se traducirá en código Javascript válida.
Si usted acaba de poner en alert()
, eso no será válida:
ma = "Ma name " alert() ""
Eso es un error de sintaxis. Usted necesita algo para indicar lo que el alert
tiene que ver con el token de cadena literal que se produce justo antes de ella. Una -
puede hacer el truco, pero también podía hacerlo cualquier otro operador, como +
, %
y así sucesivamente. También es necesario conectar el extremo del alert
con el literal de cadena, por lo tanto la necesidad de otro operador al final reanudó:
ma = "Ma name "-alert('foo')-""
// ^^^^^^^^^^^^^^^^
ma = "Ma name "-alert('foo')-""
Por lo tanto, los caracteres que deben ser insertados son:
"-alert('foo')-"
Tenga en cuenta que debido a que la cadena se entrega dentro de un parámetro de búsqueda, un +
No se interpreta como el carácter literal +
- más bien, que va a ser interpretado como un espacio . Así que jeff="+alert(1337)+"
no va a funcionar, pero jeff="%2balert(1337)%2b"
lo hará.
Punto y coma funcionan tan bien, porque dan lugar a:
ma = "Ma name " <SOMETHING ELSE> ""
ma = "Ma name "; alert() ;""
que es una sintaxis válida.