現在使用HTML5開發移動APP越來越受歡迎。HTML5不僅開發效率高,而且可以跨平臺,代碼重用性也很高。Zoho(全球第一大在線軟件提供商,總部位于美國)是一個有著1300萬用戶的HTML5郵件系統,我打算挖挖他們的漏洞。
尋找Html和Javascript代碼
首先我從Google Play上下載了APK,用解壓軟件打開。
assets文件夾中有很多html文件,html文件和javascript文件要比java文件讀起來易懂很多。
翻了幾下之后我發現mailDetail.html是用來顯示郵件內容的,這里有一個漏洞非常有趣。
讀了代碼,懂了代碼結構之后,發現它調用了setContent方法:
function setContent(contentToSet,margin){
document.body.style.marginTop = margin + “px”;
document.body.style.marginBottom = “10px”;
setBaseURL();
document.getElementById(‘mailcontentid’).innerHTML = “”;
handleContentForMailThread($(‘mailcontentid’), contentToSet);
androidResponse();
}
function handleContentForMailThread(contentEl,value) {
var ind = value.indexOf(“<blockquote”);// NO I18N
if(ind < 0) {
addContentToElement(contentEl,value);
return;
}
else
{
// removed 54 lines here for readability
}
}
function addContentToElement(contentEl,value){
contentEl.innerHTML = value;
addListener();
}
如果你跟蹤contentToSet變量(應該是郵件內容),你會發現javascript代碼中沒有對數據做任何轉義操作,所以,如果有任何轉義或者安全操作,都只能是在服務端做的,或者在java代碼中做的。
最簡單的辦法就是在setContent函數的開始未知加入payload代碼,比如alert(contentToSet),然后打包重簽名。
我在apk 包中加入了如下幾個payload:
test<jukk
http://test<jukk
http://test%3Cjukk
結果如下:
前兩個payload被正確處理了,但是第三個payload(我事先對數據做了url編碼)中顯示了一個<尖括號。
貌似后臺有一個黑名單,如果時間足夠,這些黑名單肯定可以被繞過,但是我對手工fuzzing已經無感了,所以我走了另外一條路。
逆向APK
我沒有寫過apk,所以我決定尋找webview相關的代碼來讀,當我找到從java傳遞數據到html的代碼的時候,我被webView.loadUrl絆倒了,這明顯可以執行javascript代碼呀:
webView.loadUrl(“javascript:initialize(” + myNumber + “);”);
很明顯zoho使用了跟上面類似的代碼,才使得前面用url編碼過得數據正確地顯示出來。
通過使用dex2jar將apk逆向為.jar文件,我使用JD-GUI閱讀這些jar文件,我搜索了setContent函數(之前提到的javascript函數),
this.webView.loadUrl(“javascript:setContent(” + JSONObject.quote(this.content) + “,” + i + “)”);
正如你看到的,zoho使用了類似的代碼。
總結
zoho使用了webview.loadurl方法來調用setContent方法,這告訴我們什么?用這種方式打開uri,里面的 javascript就會被執行,任何pct-encode ugo的代碼都會被當做正常代碼來執行。
下面這些代碼很容易理解
// this line of code:location.href = ‘javascript:setContent(“%22-alert%281%29-%22″)';// is the same as this:location.href = ‘javascript:setContent(“”-alert(1)-“”)';
問題很明顯,通過在郵件中的任意地方包含如下的payload,就可以在郵件客戶端中執行任意javascript代碼:
%22-alert%281%29-%22
在我將這個漏洞報告給zoho幾天過后,他們在Google Play上發布了新版,并且我收到郵件被告知已經有其他人給zoho報告了這個漏洞。
我覺得這個漏洞非常有趣,其他很多APP可能會有很多相似的漏洞。不過在使用HTML開發的應用中尋找漏洞比在web中尋找漏洞要難一些。讓我們一起挖洞拯救世界,讓互聯網更安全吧!
文章來源:FreeBuf黑客與極客(FreeBuf.COM)