从业者-用户提供的对象-导致信息泄露的服务器端模板注入
# 实验室:服务器端模板注入,通过用户提供的对象进行信息泄露
# 题目
由于对象传递到模板中的不当方式,此实验室容易受到服务端模板注入的攻击。可利用此漏洞访问敏感数据。
若要解决实验室问题,请窃取并提交框架的密钥。
你可以使用以下凭据登录到自己的帐户:
content-manager:C0nt3ntM4n4g3r
- name: 实验室-从业者
desc: 服务器端模板注入,通过用户提供的对象进行信息泄露 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-with-information-disclosure-via-user-supplied-objects
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个购物站点。
# 识别模板引擎
使用题目中提供的用户名和密码进行登录。
登录之后,随便进入一个商品的详情页面,在底部可看到一个 “Edit template”(更改模板)的按钮,点击它。
和前面的某些实验室一样,我们可以自己编辑和提交模板。
默认的模板中存在几个预设的表达式,它们是通过{{}}
来执行的。
尝试注入表达式49
,但产生了错误。从错误信息中识别到关键字 “django”。
这下对了,Django 框架具有自己的模板引擎。
# 利用-1
我找到了一个 Github 项目,它收集了各种漏洞的攻击载荷,其中就包括 ssti:https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md (opens new window)
还有我们想要的 Django 模板注入载荷。
根据文档所说,表达式49
会在 django 中引发错误,这在前面已经试验过了。
尝试注入以下表达式:
ih0vr{{364|add:733}}d121r
返回了预期的结果ih0vr1097d121r
。
但是文档中有关于 django 模板注入的信息很少。
根据理论学习到的内容,我尝试暴破模板的变量名称。
BurpSuite 刚好有一个内置的变量名列表,可用于暴破服务端模板变量。
最终,我只得到product
变量,而这个变量刚好是默认模板中的预设内容。
该变量中也仅包含商品信息,没有任何可用的内容。
{{ product }}
# 利用-2
我继续翻阅 Github 中关于 django 模板注入的文档,发现一个表达式{% debug %}
可用于获取环境信息。
注入表达式{% debug %}
,成功获得环境信息。
此外,你还可以注入以下表达式,然后点击 “Save”(保存)按钮。
<pre>{% debug %}</pre>
这将会生成一个经过格式化的列表,看起来比较顺眼。
在这些环境信息中,我发现了 Jinja2 模板引擎。Django 框架虽然有自己的一套模板引擎,但经过些许配置后,它也能支持 Jinja2。而且网上有人说,Django 自带的模板引擎不好用,全部改装 Jinja2 了。
难道......
我识别到了一个变量settings
,它是环境信息里 为数不多的对象。我尝试直接注入,但并没有得到什么有效信息。
然后我翻阅了 Jinja2 模板注入的文档,发现一个值得注意的攻击载荷:
{{ settings.SECRET_KEY }}
这个变量名瞅起来咋那么眼熟?
说干就干,注入这个表达式。
{{ settings.SECRET_KEY }}
得到一串奇奇怪怪的字符,难道是密钥?复制它。
点击上方的 “Submit solution” 打开提交输入框,粘贴这串可疑字符,并点击 “确定”。
密钥提交正确,实验完成。