如何用短信完成XSS?
Verizon Messages(Message+)是Verizon推出的一款開放跨平臺信息交換應(yīng)用程序,它允許用戶在更多的無線設(shè)備中交換和共享信息。目前,該軟件客戶端支持跨平臺使用,包括移動設(shè)備、桌面設(shè)備和Web端,并提升了VZW文字短信的用戶體驗(yàn)度。
Verizon的郵件信息服務(wù)是跨平臺的,此前只能夠通過采用電話撥號的方式進(jìn)行發(fā)送和接收,而新的應(yīng)用程序?qū)⒃试S用戶通過互聯(lián)網(wǎng)在更多的無線設(shè)備上接收消息,并允許用過通過計算機(jī)對郵件賬戶進(jìn)行管理。此外,跨平臺的統(tǒng)一消息的應(yīng)用程序可能有助于防止客戶移動到其他網(wǎng)絡(luò),并與其他應(yīng)用程序如iMessage、黑莓信使和Skype開展競爭,這也有助于提升Verizon的市場競爭力。
但是這款應(yīng)用除了SMS短消息之外,還提供了一些其他的額外功能,而這些功能是我非常感興趣的。
在我安裝好了Android端App并完成注冊之后,我又登錄了Web端App并開始使用這款應(yīng)用。使用了一段時間之后,我發(fā)現(xiàn)該應(yīng)用會通過Web端和移動端的接口顯示包含鏈接的消息預(yù)覽通知。這些鏈接支持圖片和視頻等資源,但我更感興趣的是應(yīng)用將會如何解析這些鏈接。
我感覺從Web端App著手會比較容易一些,所以我自己給自己發(fā)送了一些測試鏈接。
這樣一來情況就很明朗了:Web端的HTML頁面就是負(fù)責(zé)解析這些鏈接的服務(wù)器端,解析完成之后便會返回URL地址的Open Graph屬性。下面給出的是響應(yīng)數(shù)據(jù)的部分內(nèi)容:
- {
- "webPreview":{
- "valid":true,
- "url":"http://money.cnn.com/2017/05/13/technology/ransomware-attack-nsa-microsoft/index.html",
- "title":"Ransomware: World reels from massive cyberattack",
- "description":"Organizations around the world were digging out Saturday from whatexperts are calling one of the biggest cyberattacks ever. ",
- "imageUrl":"/vma/web2/attachment/WebPreview.do?id=KDvS9ip4Afj6fPMTClAzqhegDyT9mSaM0zrQQfrBu8EbtJ0Xu_DyughZu53i-vOLkSeEpbLIk756f4o6igDFp0VHU5kVYFnJoeshsfy7eR3Q8XGwTY_rsu3FHEAAI4DJEmqYl7yBEqeWKSTYUnl48LRpXAokSGi1LWdWZqP0Bovl_EVMpdWB2JfnUz8Qxb0d&mdn=3026323617",
- "imageDim":{
- "width":420,
- "height":236
- }
- }
- }
正如你所看到的,響應(yīng)信息中包含UI界面預(yù)覽信息圖片所對應(yīng)的Open Graph屬性。請注意,上面的“imageUrl”實(shí)際上是Verizon的服務(wù)器所返回的代理圖片(并非來自外部服務(wù)器),而這種代理技術(shù)可以讓服務(wù)商更好地控制顯示在用戶瀏覽器中的圖片內(nèi)容。
由于預(yù)覽屬性“attachment”是異步獲取的(內(nèi)容呈現(xiàn)在客戶端),因此我決定在這里用DOMXSS攻擊向量嘗試一下,因?yàn)殚_發(fā)人員有可能會忽略這個影響因素。接下來,我又給自己發(fā)送了一些測試鏈接,這一次的鏈接中包含一些特殊字符,我想看一看這一次WebApp將如何處理和呈現(xiàn)這些內(nèi)容。我在測試鏈接的查詢字符串中插入了一些單引號,此時我突然發(fā)現(xiàn)我貌似可以利用單引號來破壞上述錨點(diǎn)元素的href屬性。下面是一個簡單的Payload示例:
- http://i.imgur.com/0wmSPiU.jpg?'onmouseover='alert(document.cookie)'style='position:fixed;top:0;left:0;width:100%;height:100%;'class='1'target='2
下面是網(wǎng)頁解析的結(jié)果:
通過讓錨點(diǎn)以內(nèi)聯(lián)的形式強(qiáng)制覆蓋用戶的整個屏幕,我們可以利用“onmouseover”事件在打開消息的一瞬間觸發(fā)代碼執(zhí)行:
這也就意味著,攻擊者可以利用一個精心制作的文字短信來控制目標(biāo)用戶的整個頁面,這將導(dǎo)致攻擊者完全控制用戶的會話以及所有相關(guān)的功能,包括偽造用戶身份發(fā)送和接收SMS消息。
因?yàn)槲业腜oC已經(jīng)可以正常工作了,所以我開始分析應(yīng)用的javaScript源碼并嘗試找到導(dǎo)致該問題出現(xiàn)的原因。
注意其中“href”屬性的值都被單引號包裹起來了,雖然現(xiàn)在也有幾種方法能夠解決這個問題,但在這里最合適的方法應(yīng)該是使用DOMAPI。
- var a =document.createElement('a');
- a.setAttribute('href',g);
- a.innerText = b[f].original;
披露
我將PoC以及問題的測試截圖/視頻發(fā)送給了Verizon,與往常一樣,Verizon的技術(shù)人員迅速給我提供了回復(fù),并感謝我將漏洞及時上報給他們,然后迅速修復(fù)了這個問題。
更新
貌似Verizon最終還是選擇了使用DOM API來解決這個問題。