谷歌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.com
,google.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);
至於怎麼實現的,自己想吧!