0x00 Mustache簡介
Mustache是一個logic-less(輕邏輯)模闆解析引擎。起初是一個js模闆,用于展示和js分離,現已經擴充到PHP、Python、Per、C++、javal等多種程式設計語言中。
各環境下使用Mustcache的庫和demo:http://mustache.github.com/
Mustcache可以被用于html檔案,配置檔案,源代碼等等很多場景,它的運作得益于擴充一些标簽在模闆檔案中,然後使用一個hash字典或者對象對其進行替換渲染。我們之是以稱之為“logic-less”是因為他摒棄了if else 以及for loop 這樣的語句,取而代之的是隻有标簽,有些标簽被替換成一個值,或者不作為,或者是一系列的值,比如數組或者一個清單。
頁面上的内容是從背景擷取資料并渲染到頁面上時,我們就可以使用mustache模闆。
0x01 Mustache模闆使用
安全漏洞産生于各種技術使用過程中,可通過Mustache各種使用方法發掘其中存在的安全問題,首先學習該技術的使用方法。
參考文獻:https://github.com/no1msd/mstch http://web.jobbole.com/84906/
其使用步驟如下所述:
1、下載下傳mustache.js檔案
mustache的渲染需要依賴一個js檔案的實作,下載下傳位址為:https://github.com/janl/mustache.js.git
2、web頁面中引入mustache.js檔案
<script type="text/javascript" src="mustache.js"></script>
3、擷取或者建立mustache模闆及其資料源
資料源:
var data = {
"msg": {
"sex": " female ",
"age": " 22 ",
"hobit": " reading "
}
}
模闆:
<script id="tpl1" type="text/html">
{{#msg}}sex:{{sex}}{{/msg}}
</script>
4、渲染模闆并顯示
var tpl1 = document.getElementById('tpl1').innerHTML.trim();
document.write(Mustache.render(tpl1,data));
Mustache技術說簡單點就是标簽的值替換。所有的用法在下述幫助手冊中給出:http://mustache.github.io/mustache.5.html
0x02 安全漏洞及防護
經過簡單分析,在使用該技術過程中需要注意如下幾點:
一、模闆表達式XSS
漏洞示範
當使用者輸入資料作為模闆資料源的value值時,會存在注入攻擊的現象。例如以下情況:
模闆:
-{{{msg }}}- 或者 -{{&msg }}-
渲染資料:
var data = {"msg": " xiaohua”}
假設msg對應的值為使用者輸入資料,然後送出并被存儲到伺服器中。在其他頁面使用render()渲染方法後HTML界面将顯示:
-xiaohua-
然而當使用者輸入以下惡意資料給msg時,并且用戶端和伺服器均沒有任何操作,使得在此擷取資料源時data的形式如下所示:
var data = {"msg": " <script language=\"javascript\"> alert(\"hello\")<\/script> ”}
頁面渲染後會執行惡意代碼:
輸入不當執行惡意代碼
其實資料源中的value值隻要是HTML的元素都可用來渲染,例如:
綜上所述,mustache模闆表達式沒有定義何種資料樣式是合法的,而是完全交由開發人員對資料的定義。使得很容易引起XSS。
使用注意事項
除非不使用該模闆技術,否則為了杜絕mustache的這種注入攻擊,需要做到如下:
1、盡可能使用{{templateName}}而不使用{{{templateName}}}和{{& msg }},{{templateName}}會将值作為字元串進行輸出,而{{{templateName}}}和{{& msg }}會解析HTML元素。若必須使用{{{templateName}}}則遵從3、4訓示。
2、避免使用使用者輸入資料用來渲染mustache模闆,否則遵從下條訓示。
3、不信任任何使用者輸入的資料,使用黑白名單進行過濾或驗證。