<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/7961

            原文鏈接 https://www.blackhat.com/docs/us-15/materials/us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf

            0x00 科普


            要討論模板引擎的攻擊,先來了解下什么是模板引擎

            模板引擎(這里特指用于Web開發的模板引擎)是為了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用于網站的模板引擎就會生成一個標準的HTML文檔。(百度百科) 說白了,就是使得后端數據轉換成前端html以及樣式的中間應用件。

            0x01 摘要


            模板引擎(Template engines)在現代web應用被廣泛使用,它們被用來動態地顯示數據。然而,不安全地將用戶輸入嵌入到模板中,會導致一系列針對服務器的注入攻擊。然而,這種漏洞很容易被誤當做Xss對待。然而,針對模板的注入其實可以攻擊服務器,往往還能夠RCE(遠程命令執行),觸發任意對象構造,任意文件讀寫,遠程文件包含,信息泄露,和提權。

            模板注入的成因有兩種:

            一:開發人員的錯誤,
            二:現有框架為了提供豐富功能而導致暴露過多函數交由用戶操縱。
            

            本文為上述攻擊提供了一套方法論,從漏洞探測到利用漏洞,并且我將實例講解兩個被企業廣泛使用的模板是如何被挖掘出模板注入漏洞。

            0x02 介紹


            當今web應用頻繁地使用模板系統,諸如Twig,FreeMarket等。當用戶輸入嵌入在一個很沒有安全性的模板時,模板注射就可能發生。

            現在我們假設調用了Twig框架用來顯示歡迎頁面,如果直接把名字傳遞給模板,不會出現錯誤 就像這樣

            #!php
            $output = $twig->render("Dear {first_name},", array("first_name" => $user.first_name) );
            

            然而,如果內嵌的名字是由用戶輸入得來的,問題就會出現

            #!php
            $output = $twig->render($_GET['custom_email'], array("first_name" => $user.first_name) );
            

            在這個例子中,用戶能夠控制$_GET['custom_email'],這時,很多安全審計人員可能就會把它劃歸為一個反射型的Xss,然而,Xss只是表象,只需要改變下利用方式,漏洞其實能夠威脅到服務器,然而往往這點會被忽略

            ?輸入:custom_email={{7*7}} 
            ?輸出:49
            


            ?輸入:custom_email={{self}}
            ?輸出:Object of class __TwigTemplate_7ae62e582f8a35e5ea6cc639800ecf15b96c0d6f78db3538221c1145580ca4a5 could not be converted to string
            

            可以看到這里實際上存在一個遠程代碼執行(沙箱模式),針對不同的框架,利用不同的語法,繞過沙箱執行任意代碼是我們的目標。

            可能說到這里,有些人還是不能了理解模板注入以及注入發生的場景。我打了一個這樣不恰當的比方來解釋這個攻擊背景: markdown相信很多人都用過,它支持各種標識符,讓我們能夠編輯格式,插入圖片,模板注射就是利用我們的markdown的語法,在我們能夠提交markdown文章的網站(drops.wooyun)實施攻擊。

            只是說,現在的一些web模板框架更加成熟,其后端語言(php/java)能造成比markdown語言更大的危害,比如說攻擊服務端。

            0x03 模板注射之方法論


            這里給出了尋找模板注射的流程圖。

            enter image description here

            漏洞檢測:

            漏洞可能出現在兩種環境

            一、可控內容為文本

            smarty框架下

            輸入:Hello {user.name} 
            輸出:Hello user1
            

            freemarker框架下

            輸入:Hello ${username}
            輸出:Hello newuser
            

            在這種情況下,模糊測試框架的XSS探測結果可以作為發現漏洞的線索,由于黑盒審計攻擊的payload往往是純html或js的,這些地方很容易被誤判成XSS(事實上也是一個xss)?,要想判別是否是一個模板注入,我們需要利用特定的框架語法來完成漏洞檢測

            smarty=Hello ${7*7} 
            Hello 49
            


            freemarker=Hello ${7*7}
            Hello 49
            

            二、可控內容為代碼主體

            用戶輸入有時候用來構成模板主體,比如說是一個變量名

            ?輸入:personal_greeting=username
            輸出:Hello user01
            

            那么這種情況更容易遺漏,因為此時的自動掃描工具檢測到這里時,payload根本不會讓模板框架返回一個有效的回顯,你必須遵循特定模板的語法,才能看到頁面的變化,比如這里我們必須先用}}提前閉合模板代碼段,才能插入任意一個html的標簽 ?

            輸入:personal_greeting=username<tag> 
            輸出:Hello
            


            輸入:personal_greeting=username}}<tag> 
            輸出:Hello user01 <tag>
            

            模板識別

            在偵測到注射漏洞之后,我們自然要分析對應的是哪一類模板,方便對癥下藥

            enter image description here

            上圖描述了測試流程的樹形結構,分支從左到右對應檢測順序,綠色箭頭表示能夠返回預期的結果,也就說明此時存在漏洞所使用的模板框架就是箭頭指向的框架。

            0x04 利用漏洞


            閱讀

            利用漏洞之前,我們首先應該研究清楚四項內容,我們需要做的是

            一:仔細閱讀你要攻擊的框架的用戶手冊,因為所有的攻擊都是基于框架提供的語法而來的。

            二:閱讀框架內建的方法,函數,過濾器和變量清單,以及插件的清單。正是利用它們,才能發起模板注入。

            三:重點關注‘安全考慮’,這些框架開發者提醒用戶的安全風險,很可能就是我們漏洞利用的突破口。

            四:研究插件/擴展清單,其中的有一些可能是默認開啟的。

            探索

            當官方手冊研究完畢之后,下一件要做的事情就是落實到某個特定的環境(某個目標站)中你所能控制的。你可以通過fuzz去發現模板引擎提供的對象,有些是模板默認提供的,有些是開發者為了特定的需求而開放的。特別要提到的是,很多引擎應用了self對象,而這個對象里面包含了域內的所有。

            如果沒有內建的self對象,你就只能通過爆破來得到變量了。我用爬蟲爬到了整個Github里面所有有關php項目的POST/GET方法的變量名,這個工具發布在了fuzzDB和Burp Intruder wordlist collection。

            攻擊

            這時候,你應該對攻擊面有一個明確的目標了,現在你也可以用你傳統的安全審計技術結合你對這個框架的探測,來審計每個函數。

            0x05漏洞范例


            往往,你只需要細讀開發文檔三十秒就足以找到一個RCE,舉個例子。攻擊沒有沙箱隔離的“smarty”框架只需要這樣

            {php}echo `id`;{/php}
            

            Mako框架也能很簡單地RCE

            <%
            import os x=os.popen('id').read() %>
            ${x}
            

            然而,許多模板引擎總會阻礙應用將自己的代碼注入到模板里面去,引擎們往往會限制執行任意代碼,有一些甚至采用沙箱技術來處理不受信任的輸入。

            0x06寫在后面


            本文摘自2015BH大會paper,轉述,翻譯部分內容,目的是幫助大家理解原理,有了原理的了解,大家就能很快地上手,去看原文作者提供的真實案例了。這也是花這么多時間翻譯,總結這篇文章的目的。

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线