關於我學XSS躺過的那些坑
XSS字元編碼
在學習編碼繞過時由於數量多,型別相似,不太容易記得住,記得全,故做此記錄。
0x01 Html標籤屬性中執行
簡單瞭解:
Html標籤屬性中的XSS問題多屬於javascript偽協議
常見的屬性有:
- src
- lowsrc
- dynsrc
- url
- href
- action
- onload
- onunload
- onmouseover
- onerror
- 各種on開頭的事件
PS:此處可不加括號,如 onclick=javascript:alert(1)
,各類教程裡常見的 <img src=javascript:alert(1)></img>
Chrome、Firfox已失效,IE測試成功。
在Html標籤中,許多標籤具有執行javascript的權利,當伺服器存在過濾時,我們可以嘗試通過以下編碼方法繞過:
- 8/10/16進位制轉換(
[.][&#][&#x]
) - 利用
javascript:String.fromCharCode(xx,xx,xx......)
[xx為編碼的字串的ASCII碼] - JScript Encode [IE] JS fuck等
-
data:text/html;bbase64,xxxxxxx
[IE下無效,Chorme、Firefox下均屬於空白域,無法獲取資訊,不過可用作CVE攻擊]
0x02 在 <script></script>
直接在script標籤裡執行的情況,我們通常分為以下幾種利用方式:
<></>
關於 <></>
中可用:
1) 單個拆開編碼成ASCII
eval(String.fromCharCode())
2) 使用eval()執行16進位制轉換後的程式碼
eval(\u0064\u0078......) eval(\x64\x78......)
0x03 在樣式表中的編碼
樣式表中可用expression和@import來執行js程式碼,此方法可進行適當的編碼轉換。
PS:僅在IE8.0之前的版本。
1) expression
全形字元: <div style=xss:expression(alert(1))>
十六進位制 <div style=xss:\0065xpression(alert(1))>
/**/註釋 [Javascript中也行] <div sty/**/le=x/**/ss:\0065xpre/**/ssio/**/n(al/**/ert(1))>
2) @import
\和結束符\0會被瀏覽器忽略 @im\po\rt jav\ascr\ipt:al\ert(1) @im\00po\0rt jav\00asc\0000ript:a\00lert(1)
瀏覽器差異
簡單記錄常見的瀏覽器差異造成的XSS
0x01 引號的差異
只有IE支援反引號`` ## 0x02 標籤的差異 + data協議執行程式碼是在Chrome下執行 + Chrome下srcdoc利用:
+ IE下
`
- 只要火狐支援E4X
0x03 過濾器差異
Chrome能攔截大多數反射型XSS,Firefox次之,IE最次
瀏覽器異常解析BUG產生XSS漏洞
關於呼叫document
在剛開始學習XSS的時候總是想千方百計的想用javascript呼叫dom物件,比如document.cookie,卻不知這個只能在javascript域[偽協議或標籤內]範圍內。
小知識點
一、src等屬性在引入時如果漏洞網站協議名於xss平臺相同,即可省略去,如: <img src=//www.baidu.com />
二、svg標籤屬於xml而不屬於html
三、關於Cors跨域:使用Ajax跨域時預設是不允許帶上會話資料的,不過可以在XSS平臺通過設定返回的請求頭 Access-Control-Allow-Credentials: true
,並且需要設定xhr的 withCreadential
屬性值為true,注意此時返回的 Access-Control-Allow-Origin
不能設定為萬用字元true。
四、優先順序: function xxx(){}形式定義的函式 -> == -> &
五、使用img等合法標籤跨域可以帶上會話資訊
六、除javascript外還有vbscript、actionscript等
七、P3P協議僅僅是IE瀏覽器支援,通常是Hacker域名通過iframe或script等載入存在XSS漏洞的網站
與CSRF的區別
XSS的惡意請求偽造與CSRF極為相似,兩者的差別為:
- 後者發出的偽造請求可為其他站點發出的,而前者都是存在XSS漏洞的站點發出的
- CSRF是XSS無法替代的
- CSRF可以無Javascript參與,及在黑客的網站上使用img等標籤傳送帶Cookie(自帶)的跨域請求。
關於XSS防禦
0x01 輸出Html標籤屬性
如: <input class='xxx' value="{輸出}">
這裡的輸出如果過濾/轉義了 "
,便不存在XSS漏洞了,因為這裡的value屬性不能執行js程式碼。
0x02 輸出在註釋
一定要過濾換行符!!
0x03 輸出在樣式表
過濾expression和@import還有外部圖片的引用
0x04 字符集
開頭設定好字符集為 UTF-8
0x05 Cookie盜取
設定好path、開啟http_only、防止除錯資訊洩露和Apache400漏洞、使用Session