Flask SSTI | Python3

引言

  • 昨天原本是打算继续python的每日一练的,这次按日程一样是要练习用一个web框架写一个留言板的,于是打算用flask搞一下,但是正打算写的时候,突然想起来之前做的一些SSTI的例子,遂打算先把练习,放一放,来复现一下FlaskSSTI

复现历程

漏洞代码和测试

  • 这次复现参考了不少文章,因为我的环境用的是Python3的,但是现在大多网上有的一些教程都是Python2的,这就导致好多内置函数由于版本的原因用不了,或者被修改了,查阅了不少资料后,终于发现了一个可以用的方式(由于我没有任何限制和过滤,所以仅能测试学习使用),这次参考的一些原理的文章,在最后也会分享给大家┗|`O′|┛ 嗷~~
  • 首先是一个比较简单的存在漏洞的代码
# -*- coding:utf-8 -*-
# Author : Konmu from flask import Flask,url_for,redirect,render_template,render_template_string,request
app = Flask(__name__) @app.route('/index/',methods=['GET'])
def index():
code = request.args.get('id')
html = '''
<h3>%s</h3>
'''%(code)
return(render_template_string(html))
@app.route('/')
def hello():
return('Hello world!')
  • 这段代码存在漏洞的原因是数据和代码的混淆,代码中的code是用户可控的,会和html拼接后直接带入渲染。
  • 测试效果:

注入尝试

  • 到这里发现已经可以传入并执行一些相关的表达式了,接下来我们就可以尝试去进行更进一步的语句执行
  • 首先还是和往常SSTI一样去尝试找父类<type 'object'>–>寻找子类–>找关于命令执行或者文件操作的模块(相关文章有很多,这里就不列举了)。
  • 主要来说一下python3这次的一些改变

    1、Python2中的func_globals被重命名到__globals__

    2、__globals__中的linecache已经没有了(可能也被重命名到别处,但是这次找了半天都没能找到)
  • 此外对于子类的索引还是要以注入查询返回的那个索引为准,例如我在本地IDLE中查找的warning.catch_warnings索引是123,但是使用语句是却发现报错,看来一下报错信息才发现真正用的那个索引是169
  • 获取索引方式,我是用的比较笨拙,就是将那些复制下来,然后再在IDLE中查出他的索引

复现测试

  • 寻找子类

    ?id={{[].__class__.__base__.__subclasses__()}}

  • 由于看到好多文章都说到了,python在导入os模块时会和warning.catch_warnings相关,所以一般尝试找可以执行文件操作的模块时都可以尝试找这个(这次虽然没能找到'os',但是还是在这个模块中找到了另一个可以执行文件读取的函数),但是好像都没人讲一下文章出处和原理(ノへ ̄、)
  • 寻找warning.catch_warnings,寻找方式我上面提到了,这里就不再赘述了,我的找到的索引是169

  • 寻找可以进行文件读写的函数
  • 我这里最终是找的__builtins__,发现在他的属性中居然就直接有open函数,所以就尝试看能不能进行文件操作,最终发现成功
  • [].__class__.__base__.__subclasses__()[169].__init__.__globals__[%27__builtins__%27][%27open%27](%27/root/1.txt%27).read()

  • 这里顺带说一下,我在复现中自己发现的几个自己的知识盲区
  • object.keys()这个返回的是属性,而dir()这个返回的是内置函数
  • python导入模块时,import实际上是python虚拟机把当前的globals()locals()传进__builtins__.__import__内置函数了,所以实际上干活的是那个__import__函数!
  • 大致像这样:



  • jinja2的模板语句学习:https://jinja.palletsprojects.com/en/2.11.x/
  • 对于linecache一直没找到被改去哪了,后面看到相关文章会来补充
  • 关于os模块和warning.catch_warnings关系也还没找到调用的原理,后面打算再看一下官方文档看能不能找到

参考文章链接(官方文档相关大家就自行查找,这里就不贴出来了)

  • https://www.freebuf.com/articles/system/203208.html
  • https://www.freebuf.com/column/187845.html
  • https://www.cnblogs.com/tsingke/p/7291736.html
  • https://blog.csdn.net/zhtysw/article/details/83022789
  • https://www.cnblogs.com/cioi/p/12308518.html

总结

  • 经过这次自己的复现,对于Flask SSTI算是有了更深的了解,果然学习东西还是要自己去动手操作才能理解更多,这次复现还有一些问题没能解决,后面看到相关的文章,

    还会和大家继续分享的(๑•̀ㅂ•́)و✧

Flask SSTI | Python3 学习记录的更多相关文章

  1. [ZHUAN]Flask学习记录之Flask-SQLAlchemy

    From: http://www.cnblogs.com/agmcs/p/4445583.html 各种查询方式:http://www.360doc.com/content/12/0608/11/93 ...

  2. flask ssti python2和python3 注入总结和区别

    总结一下flask ssti的注入语句 代码 import uuid from flask import Flask, request, make_response, session,render_t ...

  3. [转]Python3之max key参数学习记录

    Python3之max key参数学习记录 转自https://www.cnblogs.com/zhangwei22/p/9892422.html 今天用Python写脚本,想要实现这样的功能:对于给 ...

  4. Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html

    Python3学习笔记(urllib模块的使用)   1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,  ...

  5. 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)

    目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...

  6. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...

  7. 实验楼Python学习记录_挑战字符串操作

    自我学习记录 Python3 挑战实验 -- 字符串操作 目标 在/home/shiyanlou/Code创建一个 名为 FindDigits.py 的Python 脚本,请读取一串字符串并且把其中所 ...

  8. buu学习记录(上)

    前言:菜鸡误入buu,差点被打吐.不过学到了好多东西. 题目名称: (1)随便注 (2)高明的黑客 (3)CheckIn (4)Hack World (5)SSRF Me (6)piapiapia ( ...

  9. Flask SSTI利用方式的探索

    Flask SSTI利用方式的探索 一.SSTI简介&环境搭建 ​ 一个统一风格的站点,其大多数页面样式都是一致的,只是每个页面显示的内容各不相同.要是所有的逻辑都放在前端进行,无疑会影响响应 ...

随机推荐

  1. SVN 部署(基于 Linux)

    1.通过 yum 命令安装 svnserve,命令如下: # 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行 yum -y install subversion # 若需查看 ...

  2. Java——Java连接Jira,创建、修改、删除工单信息

    还不了解Jira是什么的同学可以看一下这篇文章:https://www.cnblogs.com/wgblog-code/p/11750767.html 本篇文章主要介绍如何使用Java操作Jira,包 ...

  3. F. Multicolored Markers 暴力+二分

    F. Multicolored Markers 题目大意: 给你 a个红块 b个蓝块 拼成一个实心矩形,并且要求红块或者蓝块自成一个矩形,问形成的这个矩形最小的周长是多少. #include < ...

  4. Java种sleep和wait的区别

    1,sleep方法是Thread类的静态方法,wait()是Object超类的成员方法 2,sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时 ...

  5. 深入理解CSS定位—浮动模型

    前面我们讲到了绝对定位,在这篇文章中,我们将讲到3种定位模型中的浮动模型.主要参考 张鑫旭在慕课网的 深入理解float 那些年我们一起清过的浮动---by 一丝丝凉 精通CSS 注意:第二小节基本参 ...

  6. [csu1392]YY一下

    题意:给定x,求有多少个10^8以内的数满足这个数乘以x以后,最高位到了最低位.设最高位的数字和剩余长度,列等式推理即可. #pragma comment(linker, "/STACK:1 ...

  7. 11JAVA基础-集合

    一.集合 ` 二.Collection类 Collection 是单列的顶层类. Collection是接口. 创建对象需要借助多态. //e为集合中数据类型 //ArrayList是List的实现类 ...

  8. mysql批量导入删除

    批量导入 <insert id="extractOrderBaseHis">INSERT INTO `odr_order_base_his`(`order_base_i ...

  9. poi excel自动转换成javabean 支持引用类型属性二级转换

    最近项目需要使用excel导入功能,导入学生的时候需要指定所在班级,使用excel一次性导入! 将以前的代码改改支持属性内引用类的转换. 测试对象为User对象,javabean结构: private ...

  10. 我,不是说了PID要平均值吗?

    前几日写了一篇PID算法学习笔记,并幻想了一个场景进行算法仿真.经过不断探索后,博主发现,PID算法的精髓不在算法逻辑,而在于PID三个参数的值.本篇随笔将延续上次的仿真实验进行调试,总结PID调参的 ...