XSS-labs靶場(1-20)
開始通關!
0x01(直接漏洞注入)
反射型xss注入
1、遇到?name=text,嘗試參數注入
注入語句:
<script>alert(‘xss')</script>
0x02(閉合符號)
從url入手開始看,依然是get方式傳遞參數,應該還是反射型xss
閉合" "> 使用"> ….//
符號閉合位置
概念(知識點)補充:
<script>alert(‘xss')</script>
其中<和>都被編碼成了html字符實體
1、猜測在服務器端用htmlspecialchars()函數對keyword參數的值進行了處理
2、但是問題是這里的js代碼在標簽屬性值中,瀏覽器是無法執行的
htmlspecialchars()編碼 “<” “>”
<代表小於號(<)
>代表大於符號(>)
≤表示小於或等於符號(<=)
≥表示大於或等於符號(>=)
思路:
- 既然上面的惡意代碼被編碼了,那么只能從屬性值中的惡意代碼處進行突破.
- 要想瀏覽器執行這里的彈窗代碼,只需要將屬性的引號和標簽先閉合就可以
漏洞代碼:
"><script>alert('xss')</script>//
1、左邊的">去閉合原先的"
2、右邊的//去注釋原先的">
查看源碼驗證:
0x03(使用不帶有<>的事件代碼,例如:onfocus、onmouseover)
首先使用<script>alert("xss")</script> 進行測試
這里可以通過<input>
標簽的一些特殊事件來執行js代碼
特殊事件:onfocus
onfocus 事件在對象獲得焦點時發生。
onfocus 通常用於 <input>、<select> 以及<a>最簡單的實例就是網頁上的一個輸入框。
當使用鼠標點擊該輸入框時輸入框被選中可以輸入內容的時候就是該輸入框獲得焦點的時候,此時輸入框就會觸發onfocus事件.
因此點擊當前頁面的輸入框就可以完成彈框了。
思路:
- 通過onfocus去繞過< >尖括號被編碼的情況
- 'onfocus=javascript:alert('xss') >
構造代碼:
level3.php?keyword='onfocus=javascript:alert('xss') > //&submit=搜索
0x04(onfocus事件繞過)
首先使用<script>alert("xss")</script> 進行測試
箭頭1處直接將<和>編碼轉換了
箭頭2處卻是把<和>刪除了
但是,事件觸發卻不需要使用這兩個符號。
用上一關的代碼:level4.php?keyword="onmouseover="alert(/xss/)
0x05(<a>
標簽繞過)
1、首先使用<script>alert("xss")</script> 進行測試
2、使用”onfocus=javascript:alert(“xss”)”>
觀察:
1、<script>標簽會被替換成<scr_ipt>
2、onfocus事件會被替換成on_focus
0x06(<a>
標簽的大小寫繞過)
首先使用<script>alert("xss")</script> 進行測試
觀察:< a href=>中的href會被替換成href
繞過成功
0x07(雙寫關鍵字繞過)
1、首先使用<script>alert("xss")</script> =>中的<script>被過濾掉
2、使用onfocus=javascript:alert("xss”) =>中的onfocus被過濾成focus
3、使用"><a href=javascript:alert("xss")>xss</a>// =>中的href被過濾掉
嘗試雙寫關鍵字繞過
0x08(將scipt中的ri編碼十六進制繞過)
首先嘗試<script>alert("xss")</script> =>script中的ri被替換過濾成r_i,所以嘗試編碼繞過
- 並且發現我們輸入的payload漏洞代碼,是被傳輸到友情鏈接的
<a>
標簽中 - 所以下一步測試
<a>
標簽
*經過測試,html實體編碼和hex編碼都可以繞過
漏洞代碼:
javascript:alert(/xss/)
0x09(strpos()函數繞過)
首先使用之前關卡的漏洞代碼:
<script>alert("xss")</script>
javascript:alert(/xss/)
查看源碼發現:
漏洞代碼:
javascript:alert('http://')
0x0A(更改<from>
標簽中<input>
的type屬性)
首先使用之前關卡的漏洞代碼:
<script>alert("xss")</script>
javascript:alert(/xss/)
解題技巧是:
- 將input標簽的type類型的hidden改為text
- 將漏洞代碼填寫到value中
0x0B(前端代碼更改,加入onmouseover())
延續上一題解法:
另一種解法:
看參數t_ref是用於接收Referer參數的
0x0C(使用brup更改User_Agent)
延續上一題的解法
另一種解法:
1、查看參數t_ua傳的值,就可以判斷該參數就是傳遞User_Agent
2、使用brupsuite抓包傳遞漏洞代碼
0x0D(使用brup更改Cookie)
延續上一關技巧,直接更改前端代碼
第二種解法:
通過brupsuite抓包重構數據包
0x0E(Exif隱寫)
延續上一關技巧,直接更改前端代碼
0x0D(ng_lnclude調用外部URL)
查看前端代碼
ng_lnclude的用法:
- ng-include 指令用於包含外部的 HTML文件。
- 包含的內容將作為指定元素的子節點。
- ng-include 屬性的值可以是一個表達式,返回一個文件名。
- 默認情況下,包含的文件需要包含在同一個域名下。
值得注意的是:
- ng-include,如果單純指定地址,必須要加引號.
- ng-include,加載外部html,script標簽中的內容不執行.
- ng-include,加載外部html中含有style標簽樣式可以識別.
ng_lnclude的作用就是加入一個外部的url鏈接地址
隨后去查看源碼
漏洞代碼:
?src='level1.php?name=<a href="javascript:alert(/xss/)">xss<a/>'
0x0E(空格解析繞過)
前端源碼查看
嘗試空格解析
<img src="" onerror=alert("xss")>
onerror事件:當img圖片加載失敗會觸發的事件.
0x0F(兩個參數自動拼接)
嘗試通過參數破解
發現會url會自動拼接參數
注:因為谷歌和火狐瀏覽器插件的原因,彈窗沒辦法正常彈出,推薦使用獵豹瀏覽器
0x0G
使用上一關payload
?arg01="onmouse&arg02="alert(/xss/)
仍持續更新...end#