从业者-基本的服务端模板注入-代码上下文
# 实验室:基本的服务端模板注入(代码上下文)
# 题目
由于此实验室不安全地使用 Tornado 模板,因此容易受到服务端模板注入的攻击。若要解决实验室问题,请查看 Tornado 文档以了解如何执行任意代码,然后从 Carlos 的家目录中删除morale.txt
文件。
你可以使用以下凭据登录到自己的帐户:wiener:peter
提示
仔细查看 “preferred name”(首选名称)功能。
- 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-basic-code-context
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
# 找文档
通过搜索引擎,可以很容易地找到 Tornado 的官方文档:https://www.tornadoweb.org/en/stable/ (opens new window)
我在其中搜索关键字 “shell”,试图找到一些有效信息。
然后我发现了 5 个可以用于执行系统命令的函数:
# 1
retcode = call(["ls", "-l"])
# 2
check_call(["ls", "-l"])
# 3
check_output(["ls", "-l", "/dev/null"])
# 4
import subprocess
subprocess.getoutput('ls /bin/ls')
# 5
import subprocess;subprocess.getstatusoutput('ls /bin/ls')
2
3
4
5
6
7
8
9
10
11
12
13
14
15
先记着,说不定待会有用呢。
# 开始实验-检测服务端模板注入
点击 “ACCESS THE LAB” 进入实验室。
一个博客站点。
使用题目中提供的用户名和密码进行登录,访问账户页面,你可以看到一个名为 “Preferred name” 的功能。
原来这才是题目中提到的功能,我还傻傻的跑去 Tornado 文档里面搜。
点击 “Submit” 并捕获一个请求数据包。
在数据包中可以看到一个名为blog-post-author-display
的 POST 参数,这个参数翻译成中文貌似是 “博客提交作者展示”。
参数值是user.first_name
,是不是很像一个模板?
注入以下表达式:
{{7*7}}
注入点有了,输出点在哪里呢?
根据参数名称的指引,随便进入一篇博客,然后发表一个评论。
在评论作者名称处,可以看到注入的结果49
。而且两边的括号被当作字符串了,说明该注入点原本就位于括号之中。
{{注入点}}
# 脱离原有上下文
尝试注入<img>
,此时的目标上下文变为:
{{<img>}}
网页返回错误信息,无效的语法。
注入以下表达式,尝试闭合并脱离原有的上下文:
}}<img>
# 形成
{{}}<img>}}
2
3
4
返回错误信息,空白的表达式。难道是指左边被闭合的那个?
改为注入以下表达式,提供一个数字1
:
1}}<img>
# 形成
{{1}}<img>}}
2
3
4
这次网页正常解析,原上下文中的右括号}}
被当作了普通字符串。
# 执行任意代码
在这篇文章 (opens new window)中,我找到了在 Tornado 中执行系统命令的方法。
按照文章所说,注入以下表达式:
1}}{% import os %}{{ os.popen("id").read()
然后刷新网页,成功执行id
命令并返回了执行结果。
另外,os.system()
函数也可用于执行系统命令:
1}}{% import os %}{{ os.system('rm -rf /home/carlos/morale.txt') }}
注入以上命令,删除目标文件。
刷新网页,触发并解析表达式。
学过编程的应该都知道,数字0
表示程序正常完成运行并退出。而这里刚好显示了一个0
,说明注入的命令成功执行了。
回到页面顶部,横幅已经出现。
实验完成。