通過SSTI漏洞獲取伺服器遠端Shell
PS:本文僅作為技術分享,禁止用於任何非法用途
本文我將為大家演示,如何利用伺服器端模板注入(SSTI)漏洞,來獲取應用託管伺服器上的shell。
模板引擎(這裡特指用於Web開發的模板引擎)是為了使使用者介面與業務資料(內容)分離而產生的,它可以生成特定格式的文件,用於網站的模板引擎就會生成一個標準的HTML文件。靜態模板檔案會在執行時將變數/佔位符替換為HTML頁面中的實際值。當前流行且使用廣泛的模板引擎有Smarty,Twig,Jinja2,FreeMarker,Velocity。
伺服器端模板注入(SSTI)漏洞將允許攻擊者將注入模板指令作為使用者輸入,從而導致任意程式碼的執行。如果你查看了網頁的原始碼,並看到了類似於以下的程式碼片段,則基本可以斷定該應用程式可能正在使用某種模板引擎來呈現資料。
var greet = ‘Hello $name’; <ul> <% for(var i=0; i<data.length; i++) {%> <li><%= data[i] %></li> <% } %> </ul> <div> <p> Welcome, {{ username }} </p> </div>
在這裡我推薦大家一個專為安全人員而開發的滲透演練靶場Xtreme Vulnerable Web Application(XVWA),這其中就包含了我們本文中所探討的SSTI漏洞。下載地址: ofollow,noindex" target="_blank">https://github.com/s4n7h0/xvwa 。
我注入了我最喜歡的探測語句${{1300+37}},併成功收到了1337美元的伺服器響應結果。這說明該應用程式使用的模板引擎語法為{{ }}。
其實在頁面上也已明確的告知我們,其使用的模板引擎為TWIG。除了簡單的數學運算之外,我們還可以通過注入以下指令來實現任意命令執行操作。如下所示,我們利用模板指令來執行一個簡單的“id”命令。
可以看到,命令被成功執行並獲取到了我們想要的結果。
但更令我感到高興的是,我獲取到了伺服器上的shell。我快速生成了一個php meterpreter payload,並讓它在伺服器上執行,最終我成功獲取到了一個遠端shell!如下:
防禦
對於不同的模板引擎,防禦方案也不相同。但做好對使用者輸入的清理/過濾,將能大大的降低此類問題帶來的安全威脅。另一個選擇是建立一個安全加固/沙箱環境,禁用或刪除潛在的危險指令。