非持久型xss攻擊:非持久型xss攻擊是一次性的,僅對當次的頁面訪問產生影響。非持久型xss攻擊要求用戶訪問一個被攻擊者篡改後的連接,用戶訪問該連接時,被植入的攻擊腳本被用戶遊覽器執行,從而達到攻擊目的。javascript
持久型xss攻擊:持久型xss,會把攻擊者的數據存儲在服務器端,攻擊行爲將伴隨着攻擊數據一直存在。html
反射型、存儲型、DOM型java
經常使用測試代碼:跨域
onmouseover="alert(xss);" <script>alert(xss);</script> <a href="javascript:alert(xss);">xss</a> <img onerror="alert(xss);" src=>
主要原理:閉合標籤,構造惡意代碼瀏覽器
輸入用戶可構造,好比搜索框,評論留言區,註冊名字,聯繫方式等,同時頁面裏常常會有hidden屬性的input,這時直接burp抓包改就能夠了,隱藏屬性很差點擊,可用如下代碼 不一樣瀏覽器實現的快捷鍵方式不一樣,而且可能和其它快捷方式衝突服務器
accesskey="X" onclick="alert(xss)"
dom
DOM XSS是在瀏覽器的解析中改變頁面DOM樹,且惡意代碼並不在返回頁面源碼中回顯xss
頁面跳轉經過JS跳轉,使用location.href、location.replace()、location.assign(),能夠經過javascript僞協議執行JS腳本函數
Location |
當前網頁的URL地址 |
window.name |
當前網頁 tab 的名字,它被不一樣的網站賦值,也就是說這個網頁爲window.name 賦值後再跳轉到其它網站,window.name 的值依然不變 |
document.title |
是當前網頁的標題,能夠在搜索框輸入控制它的內容 |
document.referer |
表示來路,表示從哪一個網頁URL訪問過來的 |
postMessage |
是HTML5 的一種跨域機制,但不少時候開發者沒有正確的作來源檢測,會致使 DOM XSS 的發生 |
location |
它觸發 JS 一般是以跳轉到 JS URI 的方式執行 |
eval |
是JS 內置的動態JS執行器 |
innerHTML |
能爲一個網頁元素賦值 |
document.write |
能夠輸出一個頁面流 |
Function |
能經過函數生成一個函數,能夠傳入動態JS代碼 |
setTimeout |
會延時執行JS代碼 |
setInterval |
表示循環執行 JS 代碼 |
有時網站對輸入字符進行了過濾,此時能夠經過編碼來進行繞過
原理:URL 請求時會對百分號等 URL 的編碼方式進行轉碼;瀏覽器接收到頁面數據後,會對 HTML 實體編碼進行轉碼;執行 JS 時會對 JSUnicode 等 JS 支持的方式進行轉碼。post
url編碼 %+16進制數字 https://www.w3school.com.cn/tags/html_ref_urlencode.html url base64編碼 data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk7PC9zY3JpcHQ+ html編碼 '&' + '約定名稱' + ';' 的形式,其實還有 '&#' + '十進制數字' + ';' 和 '&#x' + '十六進制數字' + ';' 十進制和十六進制後面的;能夠省略 JS Unicode 編碼 規則是 '\u' + '四位十六進制數字' jsfuck https://www.bugku.com/tools/jsfuck/
在script標籤鍾插入一個空格或者是tab <script >alert(1)</script> <script >alert(1)</script> 也能夠對tab,換行,回車進行編碼來繞過 <script	>alert(1)</script> <script
>alert(1)</script> <script
>alert(1)</script> 對標籤進行大小寫 <ScRipT>alert(1)</sCriPt> 插入null字節,在xss payload的任何地方插入null字節,有時候能夠繞過filter <%00script>alert(1)</script> <script>al%00ert(1)</script>
對於ie版本小於10的 html屬性支持反引號` 可用其來閉合雙引號,從而繞過htmlspecialchars()