­

xss-labs全關教程

  • 2021 年 4 月 24 日
  • 筆記

0x01 Level 1

查看源碼,可以看到接收了name參數,並直接嵌入到HTML頁面中了

沒有任何過濾,而且直接會當作代碼執行。

0x02 Level 2

先傳入<script>alert(1)</script>觀察一下,發現輸入的內容被放在了value的值中,被當作值時是不會執行代碼的,所以我們要閉合前面的標籤。

用”>閉合<input>標籤,然後開始一條新的標籤語句。

0x03 Level 3

首先查看HTML代碼閉合前面的標籤再寫入<script>標籤,發現不成功,看起來閉合無效,還是被當作值來解析的。

這是由於源代碼中使用了htmlspecialchars()函數對特殊字符進行了HTML實體轉義,所以無法發揮字符原來的作用。

既然不能使用<、>這類字符,那麼就使用標籤的on事件,構造

1' onfocus='alert(1)     //通過輸入的HTML代碼變化,得知這裡要使用單引號閉合,執行後點擊輸入框就會產生彈窗

0x04 Level 4

使用上題的payload,不過這題是使用雙引號”閉合

0x05 Level 5

使用第四關的payload進行測試,發現on被轉義了

使用”>閉合前面的標籤,再構造<script>標籤,發現script也被轉義了,不過好消息是”>閉合成功了,可以使用其他標籤進行嘗試。

傳入:"><a href="javascript:alert(1)">click</a>

點擊click出現彈窗

0x06 Level 6

使用上一關的payload進行測試,發現對href進行了轉義,經過測試發現對on和script都進行了轉義。

查看源代碼發現它匹配前沒有進行大小寫統一,只能匹配小寫的進行轉義

因此,大小寫混淆繞過

"><body Onload=alert(1)>

0x07 Level 7

使用”><script>alert(1)</script>進行測試,發現script都變成空

嘗試雙寫繞過

"><scscriptript>alert(1)</scscriptript>

0x08 Level 8

先測試一下,發現輸入的內容被傳到了兩個地方,並且script被轉義了

 

查看源碼發現基本上都被過濾了

 
嘗試HTML編碼繞過

因為參數的值直接被傳入到了href之中,所以可以使用javascript偽協議,構造payload:

&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1)  //即javascript:alert(1)

點擊友情鏈接,出現彈窗

0x09 Level 9

 通過源碼發現比上題多了一個條件,就是對輸入的內容進行校驗,必須含有//,否則判定「您的鏈接不合法?有沒有!」

在alert()中加入//

&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1http://)

 

0x10 Level 10

查看HTML代碼,看到三個<input>標籤的類型是隱藏類型

測試一下哪些標籤是可以傳值的

?keyword=well%20done!&t_link="type="text&t_hidden="type="text&t_sort="type="text

 可以看到名為t_sort的輸入標籤的類型變成了text型,證明是可以傳值的

 

可以看源碼驗證一下

構造payload:

?keyword=1&t_sort=" autofocus onfocus="alert(1)

0x11 Level 11

查看HTML代碼,發現有四個隱藏標籤

 

使用之前的方法測試,發現t_sort參數還是能傳入值的

&t_link="type="text&t_hidden="type="text&t_sort="type="text&t_ref="type="text

查看源代碼,看到$_SERVER[‘HTTP_REFERER’]字段,HTTP_REFERER是用來獲取請求中的Referer字段。

傳入Referer值進行測試

" onfocus="alert(1)" type="text

可以看到Referer的值被傳入了t_ref的標籤中,彈窗成功

0x12 Level 12

 查看HTML代碼,第四個標籤中的value值一看就是User Agent的內容

直接構造payload:

user-agent" onfocus="alert(1)" type="text

 

彈出窗口

0x13 Level 13

查看HTML代碼,看到t_cook結合前幾關會不會想到cookie

 

 傳入Cookie值進行測試,發現Cookie並沒有被傳入HTML標籤中

使用burpsuite抓個初始包看看,發現Cookie有一個鍵名user,忘記了必須給鍵名賦值才行

更改數據包的Cookie值後,Forward放包

 

Cookie值被傳到了HTML標籤中,並且彈出了窗口

0x14 Level 14

 這題是關於Exif的,Exif叫做可交換圖像格式,是專門為數碼相機的照片設定的,可以記錄數碼照片的屬性信息和拍攝數據。

這題比較冷門,暫時不想做,有興趣的自行了解。

 

0x15 Level 15

 查看HTML源碼發現有一個ngInclude。

通過查詢發現ng-include 指令用於包含外部的 HTML 文件;

包含的內容將作為指定元素的子節點;

ng-include屬性的值可以是一個表達式,返回一個文件名;

默認情況下,包含的文件需要包含在同一個域名下。

 構造payload:

?src='level1.php?name=<a href="javascript:alert(1)">'

0x16 Level 16

使用<script>標籤進行測試,發現script被替換成了空位元組

 

查看源碼,可以看到代碼對空格進行了實體轉義

使用%0a代替空格,構造payload:

<body%0aonload=alert(1)>
// 繞過空格的方法還有很多,比如%0b,%0c,%0d,%09等等

 

0x17 Level 17

查看HTML源碼

 

看起來像參數拼接,構造payload:

arg01=%20onfocus&arg02=alert(1)

0x18 Level 18

 和上題一樣的方法

arg01=%20onfocus&arg02=alert(1)

0x19 Level 19

 我的谷歌和火狐都不支持,不做了

放個答案

version&arg02=<a href='javascript:alert(/xss/)'>xss</a>

0x20 Level 20

看到AngularJS想到了它存在模板注入

測試了一下沒成功

貼上別人的payload:

arg01=id&arg02=\"))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height

暫時不懂,等會了再補吧,如果想知道的話自行去了解吧!