在本节中,将更仔细地研究一些典型的服务器端模板注入漏洞,并演示如何来利用它们。通过实践,可以潜在的发现并利用各种不同的服务器端模板注入漏洞。
一旦发现了服务器端模板注入漏洞,并确定了正在使用的模板引擎,一次成功的利用通常包含下面的过程步骤:
●阅读语法
●探索环境
●创建攻击
阅读语法
除非对模板引擎了如指掌,否则阅读它的文档通常是第一步。虽然这可能不是花费时间的最令人兴奋的方式,但重要的是不要低估文档可以成为很多有用的信息来源。
学习基本语法以及关键函数和变量处理显然很重要,即使是学习如何在模板中嵌入本地代码这样简单的事情,有时也会很快导致漏洞的出现。例如,一旦知道正在使用基于Python的Mako模板引擎,实现远程代码执行可能就很简单。
在一个没有沙盒的环境中,实现远程代码执行并利用它来读取、编辑或删除任意文件,在许多常见的模板引擎中也非常简单。
场景试验-基本的服务器端模板注入:
https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-basic
场景说明:
这个试验场景由于ERB模板的不安全构造,容易受到服务前端模板注入的影响。
试验目的:
要完成这个试验,需要查阅ERB文档,找出执行任意代码的方法,然后从carlos的主目录中删除moral.txt文件。
攻击过程:
①选择查看第一产品的更多细节时,GET请求使用message参数在主页上呈现"Unfortunately this product is out of stock"
②在ERB文档中可以发现语法<%= someExpression %>是用来计算一个表达式并在页面上呈现结果,可以使用ERB模板语法创建包含数学运算的payload,比如:
<%= 7*7 %>
把这个payload在URL编码后放入message作为参数,可以注意到页面上呈现的不是消息,而是数学运算结果,表明可能存在服务器端模板注入漏洞
https://YOUR-LAB-ID.web-security-academy.net/?message=<%25%3d+7*7+%25>
③在Ruby的文档中,也说明system()方法,可以用来执行任意的操作系统指令。可以构建恶意payload来删除carlos的文件:
<%=system("rm /home/carlos/morale.txt" ) %>
对上面这个payload进行URL编码,将其作为message的参数放入URL,访问后即可完成试验
https://YOUR-LAB-ID.web-security-academy.net/?message=<%25+system("rm+/home/carlos/morale.txt")+%25>
场景试验-基本的服务器端模板注入(代码环境):
https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-basic
场景说明:
这个试验场景由于使用Tornado模板的方式不安全,容易受到服务器端末班注入的影响。
试验目的:
要完成这个试验,需要查阅Tornado文档,了解如何执行任意代码,然后从carlos的主目录中删除moral.txt文件。
试验提供一个登录账号,wiener:peter
攻击过程:
①用所提供的账号登录后,可以看到有个设置"Preferred name"的地方,可以选择"Name"、"First Name"、"Nickname"来进行展示
②当提交选择时,一个POST请求将参数blog-post-author-display的值设置为user.name、user.first_name、或user.nickname,当加载包含这个账户的评论页面时,评论上面的名字会根据这个参数的当前值来更新,把这个请求发送给Repeater
③Tornado文档中规定,模板表达式是用双大括号包围的,比如{{someExpression}},我们修改下这个请求"blog-post-author-display"后面的参数
blog-post-author-display=user.first_name}}{{7*7}}
④随便找个帖子,在下面回帖,随后查看下留言,可以看到用户名这里前面注入算式被运算了,说明这个位置存在模板注入
⑤在Tornado中可以通过{% somePython %}来执行Python,因此可以通过导入os模块使用system()方法执行任意的系统命令,构建如下恶意payload
{% import os %}
{{os.system('rm /home/carlos/morale.txt')
⑥还是在前面那个请求中,将恶意payload在经过URL编码后替换到"blog-post-author-display"的后面
blog-post-author-display=user.name}}{%25+import+os+%25}{{os.system('rm%20/home/carlos/morale.txt')
⑦发送这个请求后,再次刷新这个账号进行评论过的帖子,即可完成此试验。
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):服务器端模板注入(SSTI)-攻击示例(一)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论