[BWAPP] Resumen de XSS
Las soluciones XSS-Reflected (GET y POST) son muy convencionales, los niveles bajo y medio solo filtran comillas simples, y los niveles altos usan htmlspecialchars () y htmlentities (). Resuma las diferencias entre los dos siguientes.
La diferencia entre htmlspecialchars () y htmlentities ()
-
htmlspecialchars () convierte los siguientes caracteres en entidades HTML
&volverse
&
"volverse
"
'Sin cambios (codificado como
'
OR después de que se establezca ENT_QUOTES'
)<
Se convierte<
>
Se convierte>
Tipo opcional:
ENT_COMPAT ---- De forma predeterminada, solo se codifican las comillas dobles
ENT_QUOTES ---- codifica comillas dobles y comillas simples
ENT_NOQUOTES ---- No codifique las comillas
-
htmlentities () convierte todos los caracteres usados en entidades HTML
Convierta todas las etiquetas y símbolos html, incluso chinos, en entidades html
1 、 XSS reflejado (JSON)
nivel bajo
Primero lanza una carga útil: <script>alert(/xss/)</script>
:
Mira el código fuente de la página web:
El punto de salida original está en el código json.
Intente cerrar y construir la carga útil:"}]}';alert(/xss/);//
Tenga en cuenta que debe comentar el código js detrás de //
¡Ventana emergente exitosa!
nivel medio
Parece estar codificado por materialización html, que es difícil de pasar por alto.
El alto nivel también se materializa en la codificación.
2 、 XSS reflejado (AJAX / JSON)
nivel bajo y medio
Esta página es xss_ajax_2-1.php, a través de Ajax llame a xss_ajax_2-2.php para completar la consulta
ingresar:<img src=1 onerror=alert(/xss/)>
o<svg onload=alert(/xss/)>
Pero <scritp>alert(/xss/)</script>
no puedo usarlo
Porque de acuerdo con la especificación HTML5, innerHTML
las script
etiquetas en se interpretarán como texto plano y no se ejecutarán ( ver detalles ). Entonces no se puede insertar directamente<scrit></script>
nivel alto
intentar:<img src=1 onerror=alert(/xss/)>
Como se muestra en la figura, se ha codificado físicamente y es difícil de pasar por alto.
Análisis de código fuente:
//xss_ajax_2-1.php
<?php
if($_COOKIE["security_level"] == "2")
{
?>
JSONResponse = JSON.parse(xmlHttp.responseText);
<?php
}
else
{
?>
JSONResponse = eval("(" + xmlHttp.responseText + ")");
<?php
}
?>
A partir del código fuente anterior, el json entrante de AJAX de nivel bajo y medio se analizará con eval (), y el nivel alto se analizará con JSON.parse ().
para resumir:
La diferencia entre json.parse y eval ():
// JSON.parse()
var json = '{"name":"GDT","age":,"University":"GDUT"}';
var info = JSON.parse(json); //解析为JSON对象
//eval()
var json = '{"name":"GDT","age":,"University":"GDUT"}';
var info = eval('(' + json + ')'); //解析为JSON对象
Ambos pueden analizar cadenas JSON en objetos
En comparación con el formato JSON.parse () estricto, eval () puede analizar cualquier cadena y eval no es seguro. Debido a que eval es más flexible, habrá problemas de seguridad potenciales.
3 、 XSS reflejado (AJAX / XML)
nivel bajo
Aún así, esta página es xss_ajax_1-1.php, salte a xss_ajax_1-2.php para analizar a través de ajax
payload_1 :<a xmlns:a='http://www.w3.org/1999/xhtml'><a:body onload='alert(/xss/)'></a>
xmlns es la abreviatura de espacios de nombres XML, ejecute una alerta (/ xss /) al cargar el sitio web
payload_2:<img src=0 onerror="alert(1)">
nivel medio
Use addedlashes () para escapar de los parámetros ', ", \
Cambiar una carga útil:<img src=0 onerror="alert(1)">
Tanto HTML como XML tienen algunos símbolos reservados para su uso y no pueden usarse como contenido en código XML. Por ejemplo, los símbolos <y> se utilizan al principio y al final de las etiquetas XML. Para mostrar estos caracteres especiales, es necesario utilizar entidades de caracteres. Algunos caracteres especiales o símbolos no se pueden ingresar directamente usando el teclado. Puede utilizar entidades de caracteres para mostrar estos símbolos o caracteres especiales.
En este ejemplo, la codificación de la entidad html de la carga útil omite el escape de addedlashes (), y luego la carga útil original se restaura en el xml para activar xss.
Puntos de conocimiento relacionados: el papel de la codificación de entidades html.
nivel alto
Se utiliza la codificación de entidad htmlspecialchars (), que es difícil de omitir.
4 、 XSS reflejado (botón trasero)
nivel bajo:
Haga clic en el botón para ver el código fuente de la página
Use eructo para capturar paquetes y vea:
Se encuentra que el valor de onclick proviene del campo de referencia.
Modifique el valor del campo de referencia para:'"><img src=1 onerror=alert(/xss/)>
Pon la bolsa:
nivel medio
Este nivel usa addedlashes () para escapar del '", pero la carga útil anterior aún se puede usar. Siento que el escape no funciona, lo cual es un poco extraño. Oh, por cierto, la barra invertida es válida para js, pero no para html.
Pero también son posibles otros métodos, como:javascript:alert(/xss/)
nivel alto
Se utiliza el escape de entidad htmlspecialchars (), que es difícil de omitir.
5 、 XSS reflejado (encabezado personalizado)
Nivel bajo y medio:
Según el mensaje:
Agregar encabezado bWAPP:
nivel alto:
Sigue siendo la codificación htmlspecialchars (), que es difícil de omitir.
6 、 XSS-Reflejado (Eval)
nivel bajo y medio
Reglas antiguas, ingrese una <script>alert(/xss/)</script>
prueba primero
Verifique el código fuente de la página y encuentre que el punto de salida está en la etiqueta del script:
Ajuste la carga útil:
¡La ventana emergente tiene éxito!
Función eval: Si el parámetro es una expresión, la función eval () ejecutará la expresión. Si el parámetro es una declaración de Javascript, eval () ejecutará la declaración de Javascript. eval () es una función peligrosa. Ejecuta código con los mismos permisos que la persona que llama, así que trate de no usarlo tanto como sea posible para evitar que otras personas implanten código malicioso. Funciones similares no son fáciles de atacar.
7 、 XSS-Reflectde (HREF)
nivel bajo
Simplemente ingrese un número:
Descubrí que salté a una página de votación:
Analizando el código fuente de la página web, se puede ver que hay dos puntos de salida, uno en la etiqueta p y otro en herf.
Intente lanzar una carga útil en:<script>alert(/xss/)</script>
Se encuentra que la carga útil en la etiqueta p ha sido codificada por entidad, pero el herf no ha cambiado en absoluto.
Construya una etiqueta de cierre de carga útil:></a><img src=1 onerror=alert(/xss/)>
¡La ventana emergente tiene éxito!
nivel medio
Pruébelo con una carga útil de bajo nivel:
Se encuentra que la carga útil en href está codificada por url.
Ver código fuente:
Se encuentra que tanto el nivel medio como el nivel alto están codificados en URL.
8 、 XSS-Reflected (iniciar sesión desde)
nivel bajo
Es un formulario de inicio de sesión:
Intente usar una contraseña universal: (ingrese en el cuadro de nombre o contraseña que se puede usar)
' or 1=1;"<img src=1 onerror=alert(/xss/)>"
Principio de implementación: haz eco de la carga útil informando un error en la base de datos, lo que activa xss
Nivel medio:
addedlashes () escapes ', ", es difícil pasar por alto
nivel alto:
La función mysql_real_escape_string () escapa, lo cual es difícil de pasar por alto.
Caracteres afectados: \ x00, \ n, \ r, \, ', ", \ x1a
9 、 phpMyAdmin BBCode Tage XSS
La pantalla es un BBcode XSS en phpmyadmin, que no se ha reproducido.
10 、 XSS-Reflejado (PHP_SELF)
nivel bajo y medio
Simplemente reemplace uno de los dos primeros parámetros:<img src=1 onerror=alert(/xss/)>
nivel alto
Ha sido codificado por entidad por htmlspecialchars ().
11 、 XSS-Reflejado (Referer)
nivel bajo y medio
La información del campo de referencia se muestra en la página:
Use burp para capturar paquetes, agregue el campo de referencia y el contenido es la carga útil: por <img src=1 onerror=alert(/xss/)>
supuesto, también son posibles otros.
nivel alto
código de entidad htmlspecialchars ().
12 、 XSS-Reflejado (usuario-Agente)
Es similar al nivel anterior, así que no lo repetiré.
13 、 Almacenado XSS (Blog)
nivel bajo y medio
Ingrese un punto de carga útil directamente para enviar:
Como se muestra en la imagen, la ventana se abrirá directamente. Actualice la página y vuelva a aparecer, lo que indica que el daño del tipo de almacenamiento xss es duradero.
nivel alto
codificación de entidad de función htmlspecialchars ().
Las rutinas son las mismas, muy aburridas. . . .
14 、 Almacenado XSS (Cambiar secreto)
nivel bajo
método uno:
Pruebe la carga útil en el cuadro de entrada en vano
Verifique el código fuente de la página web y busque un cuadro de entrada oculto llamado inicio de sesión.
Usé burp para capturar el paquete y descubrí que se enviaron tres parámetros: secreto, inicio de sesión y acción
Capture el paquete y modifique el valor del parámetro de inicio de sesión para cerrar la etiqueta de entrada:
Método dos:
Ingrese la carga útil directamente en el cuadro de entrada:<script>alert(/xss/)</script>
Descubrió que se ha insertado correctamente en la base de datos.
Al iniciar sesión en la página de inyección SQL (formulario de inicio de sesión / usuario), inicie sesión como usuario bee y haga clic en enviar para activar xss
nivel medio y alto
El valor del token se encuentra en la captura de paquetes:
El valor del token es aleatorio y hay una verificación en el backend, que está agrietada. .
Intente ingresar la carga útil en el cuadro de entrada y el resultado se codificará como entidad antes de ingresar a la base de datos.
Tanto el nivel medio como el nivel alto son codificación de entidad html.
Graduado. .. ..
15 、 Almacenado XSS (Cookies)
Enterrado en la manipulación de cookies
nivel bajo
Modifique el valor del parámetro de género para modificar el valor de la cookie
nivel medio
El valor del parámetro de género es la codificación de entidad html.
nivel alto
No se pueden modificar las cookies modificando el género
El filtrado de la lista blanca se realiza en el backend.
16 、 XSS almacenado (usuario-agente)
nivel bajo y medio
Inserte la carga útil directamente en el campo User-Agent
La actualización de la página sigue apareciendo y el daño es duradero.
nivel alto
Hay códigos de entidad htmlspecialchars ().
para resumir:
Funciones clave:
php:
htmlspecialchars () codificación <>, ', "y
htmlentities () convierte todas las etiquetas y símbolos html, incluso chinos, en entidades html
addedlashes () escapa ', ", \, null
mysql_real_escape_string () escape \ x00, \ n, \ r, \, ', ", \ x1a
js:
innerHTML
Lasscript
etiquetas en se interpretarán como texto sin formato y no se ejecutarán ( ver detalles ).La diferencia entre json.parse y eval ():
En comparación con el formato JSON.parse () estricto, eval () puede analizar cualquier cadena y eval no es seguro. Debido a que eval es más flexible, habrá problemas de seguridad potenciales.