level1
看了看level1的源碼
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不錯!");
window.location.href="level2.php?keyword=test";
}
</script>
<title>歡迎來到level1</title>
</head>
<body>
<h1 align=center>歡迎來到level1</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>歡迎用戶".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php
echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";
?>
</body>
</html>
通過$_GET[“name”],獲取name的值,沒有過濾通過echo直接進行了輸出,get請求的name變量放入xss腳本,完整的返回在html中,瀏覽器響應xss腳本
構造payload:name=<script>alert("xss")</script>
在xss中擁有同樣彈窗效果的函數不止alert
,還有confirm
以及prompt
從代碼角度去看,可以發現就是直接用GET方式獲取參數然後輸出到瀏覽器上面,這是典型的沒做過濾。怎麼防禦?可以加一個轉義函數htmlspecialchars
把一些html格式的東西編碼就可以有效防止了。
level2
像上一關一樣輸入<script>alert("xss");</script>
,並沒有彈窗,回顯如下:
再看看源碼
劃紅線部分就是提交的參數了,我們發現這裏是可以閉合前面的引號和**>**,再構造xss彈窗
payload:"/><script>alert("xss");</script>
level3
輸入上一關的試試,當然沒用
看看源碼
發現提交的xss腳本中的**<和>**都沒了,應該是被htmlspecialchars函數過濾了
所以這裏可以用單引號閉合value,卻沒辦法閉合input標籤,但是可以註釋掉後面標籤然後用事件彈窗,這裏介紹幾個常用的事件函數,比如onchange, onclick, oninput
等等
payload:1' onclick=alert("xss")//
level4
輸入"/><script>alert("xss");</script>
測試一下,
**<和>**依然被轉義,再試試點擊事件彈窗
payload:1" onclick=alert("xss")//
level5
輸入"/><script>alert("xss");</script>
,發現<script>
標籤被過濾
輸入1" onclick=alert("xss")//
測試,
可以看到onclick也被過濾,但是可以看到尖括號沒有被過濾
所以可以構造a標籤,再嘗試利用a標籤的href屬性執行javascript:僞協議,"><a href="javascript:alert(1)"
,沒有對javascript進行過濾,觸發xss
level6
輸入"><script>alert("xss")</script>
測試,<script>
標籤被過濾
輸入" onclick=alert(1)//
測試,onclick被過濾
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DcmpPctj-1570539785325)(C:\Users\17295\AppData\Roaming\Typora\typora-user-images\1569811007499.png)]
輸入"><a href="javascript:alert(1)"
測試。發現href也被過濾
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FoAjgT4H-1570539785326)(C:\Users\17295\AppData\Roaming\Typora\typora-user-images\1569811096641.png)]
嘗試是用大小寫繞過
payload:"><a HREF=" javascript:alert(1)"
或者"> <Script>alert('123')</script> //
level7
按照前面的套路試了一遍,發現script、on、href都被過濾,大小寫都被過濾
使用雙寫單詞來繞過
payload1:" oonnclick=alert(1)//
payload:"><a hrhrefef=" javascscriptript:alert(1)"
level8
隨便輸了一個試試,查看源碼
發現原本就有一個href標籤,所以直接添加javascript:alert(1)即可,可是會發現script被過濾了,轉換大小寫也不行,
可以發現還有一處調用的字符串裏面沒有使用這樣的函數去進行防護,可以利用這一點下功夫,嘗試編碼繞過,進行html編碼之後可以成功饒過,
javascript:alert(1)
(其實這裏編碼的話只編碼script其中一個字符就可以)
level9
輸入javascript:alert(1)測試一下
發現這次的輸入沒有在href標籤那裏,所以,再試試"><script>alert(1)</script>
尖括號和引號都被過濾,看來害的編碼
使用上一關的poc試試,也不行,,,只能看看源碼
發現這裏對url進行了限制,必須包含http://
嘗試構造javascript:alert(1)http://
,居然不對、、、
確實不對,那該怎麼辦呢,兩
個解決辦法:註釋或者把http://放到aler()裏面
javascript:alert(1)//http://
javascript:alert("http://")
這裏吧引號編碼
level10
明面上沒有看到輸入框,但是url欄裏可以輸入
發現尖括號被過濾,但是這裏有三個隱藏的參數,不明白,看看源碼
keyword被htmlspecialchars過濾,但是還有一個參數t_sort沒有防護,只是過濾了尖括號,然後放到了一個input標籤中隱藏起來
可以閉合雙引號,使用onclick
事件,然後把隱藏的標籤用text
方式回顯出來即可,最後的payload
t_sort=" onclick=alert(1) type="text"