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標簽里執行的情況,我們通常分為以下幾種利用方式:
- 直接導入遠程XSS平台腳本
- 直接在
<></>
中寫上自定義攻擊腳本,如生成img標簽
關於<></>
中可用:
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利用:
<iframe srcdoc="<script>alert(1)</script>"></iframe>
- IE下
<img src=javascript:alert(1)>
- 只要火狐支持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