Flask SSTI | Python3 学习记录
Flask SSTI | Python3
引言
- 昨天原本是打算继续
python
的每日一练的,这次按日程一样是要练习用一个web
框架写一个留言板的,于是打算用flask
搞一下,但是正打算写的时候,突然想起来之前做的一些SSTI
的例子,遂打算先把练习,放一放,来复现一下Flask
的SSTI
复现历程
漏洞代码和测试
- 这次复现参考了不少文章,因为我的环境用的是
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 学习记录的更多相关文章
- [ZHUAN]Flask学习记录之Flask-SQLAlchemy
From: http://www.cnblogs.com/agmcs/p/4445583.html 各种查询方式:http://www.360doc.com/content/12/0608/11/93 ...
- flask ssti python2和python3 注入总结和区别
总结一下flask ssti的注入语句 代码 import uuid from flask import Flask, request, make_response, session,render_t ...
- [转]Python3之max key参数学习记录
Python3之max key参数学习记录 转自https://www.cnblogs.com/zhangwei22/p/9892422.html 今天用Python写脚本,想要实现这样的功能:对于给 ...
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
- 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)
目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...
- Python学习记录day7
目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...
- 实验楼Python学习记录_挑战字符串操作
自我学习记录 Python3 挑战实验 -- 字符串操作 目标 在/home/shiyanlou/Code创建一个 名为 FindDigits.py 的Python 脚本,请读取一串字符串并且把其中所 ...
- buu学习记录(上)
前言:菜鸡误入buu,差点被打吐.不过学到了好多东西. 题目名称: (1)随便注 (2)高明的黑客 (3)CheckIn (4)Hack World (5)SSRF Me (6)piapiapia ( ...
- Flask SSTI利用方式的探索
Flask SSTI利用方式的探索 一.SSTI简介&环境搭建 一个统一风格的站点,其大多数页面样式都是一致的,只是每个页面显示的内容各不相同.要是所有的逻辑都放在前端进行,无疑会影响响应 ...
随机推荐
- ST函数(ST表)RMQ O(1)查询 离线
ST算法是基于倍增的动态规划算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&l ...
- strut2运行流程的详解
虽然现在struts2已经慢慢淡出了视野,但是作为一个老框架,在我看来,学习价值还是有的,多阅读框架源码帮助很大,大家有空的话也可以尝试看看,好了,话不多说,今天的主题就像标题写的那样,主要探究str ...
- 【FPGA篇章三】FPGA常用语句:Verilog基本语法要素
欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章 Verilog中总共有十九种数据类型,我们先介绍四个最基本的数据类型,他们是: reg型.wire型.integer型.parameter型 ...
- 软路由OpenWrt(LEDE)2020.4.4编译 UnPnP+NAS+多拨+网盘+DNS优化
近期更新:2020.04.24编译-基于OpenWrt R2020.3.19版本. 2020.04.04更新记录: 修正国内域名加速脚本部分缺陷 内置打印机共享,ZeroTier 新增多套主题 S ...
- C:单链表的简单实现
前言 今天整理资料的时候翻出来的文件,发现是以前学习数据结构的时候写的代码,当初是看郝凯老师的视频学习的C语言的数据结构,下面是对于一个单链表的简单的实现. /** ***************** ...
- spring源码解析--上
本文是作者原创,版权归作者所有.若要转载,请注明出处. 首先是配置类 package com.lusai.config; import org.springframework.context.anno ...
- [poj1741 Tree]树上点分治
题意:给一个N个节点的带权树,求长度小于等于K的路径条数 思路:选取一个点作为根root,假设f(root)是当前树的答案,那么答案来源于两部分: (1)路径不经过root,那么就是完全在子树内,这部 ...
- csu1617]强连通分量
题意:定义域属于一个集合S={0,1,...,n-1},求S的子集个数,满足以子集的元素为定义域的函数P(x)的值域等于子集本身. 思路:以元素为点,x到P(x)连一条有向边,不难发现,如果有一个有向 ...
- HDU 2000 (水)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2000 题目大意:仨字符从小到大排序 解题思路: 很水很水,需要注意的地方是如果用苦力(三个if)要注意 ...
- 弹弹弹 打造万能弹性layout
demo地址:https://github.com/cmlbeliever/BounceLayout 最近任务比较少,闲来时间就来研究了android事件传播机制.根据总结分析的结果,打造出万能弹性l ...