實戰|記一次實戰中SelfXSS+CSRF+越權漏洞的組合拳

0x01 前言

在滲透測試中,經常能夠遇到這樣一種XSS漏洞,它通常存在於比較隱私的個人資訊配置等等功能中,有一個非常鮮明的特點就是“只有自己可見,別人不可見”,XSS漏洞只能攻擊自己自然是毫無價值的,因此此類Self-XSS幾乎不會被SRC所接受。本文透過對一個線上遊戲平臺的測試經歷,提供一種攻擊思路,把原本無害的Self-XSS漏洞與其它漏洞結合起來打組合拳,從而實現無害漏洞從無害到高危的利用。

0X02 比較有“含金量”的Self-XSS

為什麼說這個Self-XSS有含金量,且聽我慢慢道來。資訊蒐集的時候我發現一個遊戲玩家中心,用於編輯各種個人資訊的。

秉著有框就插並且不影響正常業務的原則,我自然而然的把目光投向了“詳細地址”這個輸入框(其實是因為真實姓名和聯絡電話都嚴格過濾所有特殊符號導致無法XSS),既然是聯絡方式,想來應該是所有玩家都能看見的吧,如果被我找到XSS,那就是儲存型XSS到手了,美滋滋。至少當時我是這麼想的。

在這個框裡輸入test1111,然後在頁面原始碼中Ctrl+F搜尋test1111定位其輸出位置。算是找XSS的常規操作吧

實戰|記一次實戰中SelfXSS+CSRF+越權漏洞的組合拳

看這樣子一下就反應過來這玩意是輸出在JS程式碼裡,是被標籤所包裹的,那簡單閉合一下不就完事了,只需要用 ’; 閉合前半部分,再用//註釋掉後面的特殊符號,最後在中間填入JS程式碼,不就完成了嗎,構造test11111’;alert(‘1’);// 毫無技術含量可言!

定睛一看,我就知道

沒關係沒關係,不就是牆嗎。我們來FUZZ一下看看它攔什麼,試試eval()。

還是寄,這就只能拿出我的壓軸絕活了。輸出在標籤內時,有一種絕活。JS有一個特性是Function()(); 你沒看錯,大寫的Function和小寫的function其含義有所不同。

對於Function()來說,寫在其第一個括號內的JS語句會被直接執行。比如說我們可以試試

是不是會發現,這個特性的用法和eval();不能說是十分相似吧,至少也可以說是一模一樣。

不過360肯定是不允許alert堂而皇之的出現的,有沒有辦法把它隱藏起來呢。既然都能使用類似eval()的功能了,我們還怕這個?直接使用atob();函式,它的作用是把base64編碼後的內容還原,我們直接把alert(1) base64編碼一下。

注意,這裡有個坑點,這個base64編碼後的字串填入atob中時,必須要去掉最後面的等於號,不然會失效

可以看到還是成功了,說明這個payload是可用的

為了防止360再攔,還是要做的周全一點,還有一個小技巧就是反引號其實可以用於代替括號使用,為了讓效果更炸裂一點,我們把alert(1)換成alert(document。cookie)。所以我們最終可以構造這麼一個語句

實戰|記一次實戰中SelfXSS+CSRF+越權漏洞的組合拳

這時候可以看到已經成功繞過並且成功彈出COOKIE了

能彈COOKIE對於一個線上遊戲平臺來說肯定是極其危險的,到這裡我已經開香檳了。但是萬萬沒想到

TAG: XSSalertSelfJS漏洞