YAML
安装库
pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ pyyaml


读取yaml文件

基本概念
是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- ‘#’表示注释
基本语法
ISO 8601
1 | YYYY表示四位数的年份 |
数据类型
YAML 支持以下几种数据类型:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值,如:
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间 使用 ISO 8601 格式,时间和日期之间使用T链接+代表时区
例: 2023-09-12T20:22:20+08:00
- 日期 使用 ISO 8601 格式,即 YYYY-MM-DD 对应位数的年月日
1 | key: #冒号后面要加一个空格,缩进表示层级 |

强制类型转换汇总图
引用
& 用来建立锚点(defaults),**<<** 表示合并到当前数据,***** 用来引用锚点
1 | defaults: &defaults #建立锚点 |
序列化和反序列化
yaml.dump():将一个Python对象序列化生成为yaml文档。
yaml.load():将一个yaml文档反序列化为一个Python对象。
1 | import yaml |
常用函数
- yaml.load(stream, Loader=yaml.Loader, **kwds):用于从 YAML 文件或字符串中读取数据,并将其转换为 Python 对象。
- yaml.dump(data, stream=None, Dumper=yaml.Dumper, **kwds):用于将 Python 对象转换为 YAML 文件或字符串,并将其写入到文件或流中。
- yaml.add_constructor(tag, constructor, Loader=yaml.Loader):用于添加自定义的构造函数,以将特定的 YAML 标记转换为 Python 对象。
- yaml.add_representer(data_type, representer, Dumper=yaml.Dumper):用于添加自定义的表示函数,以将 Python 对象转换为 YAML 标量。
PyYAML小于5.1
漏洞成因
主要在PyYaml<=5.1的版本下,默认Constructor为加载器,但是经过审计yaml模块中的Constructor.py的源码中存在对于python的标签解析时的漏洞。
python/object/apply原理
python/object/applytag对应python函数中construct_python_object_apply
再往下进入到make_python_instance函数中
1 |
|
python/object/new
python/object
对应为construct_python_object
这个函数没有参数,只能通过无参方法命令执行
!!python/object:builtins.copyright {"键":"值"}
python/module:package.class
对应函数为construct_python_module,该函数调用了find_python_module这个函数中调用了__import__
首先构造一个恶意的py脚本
1 | import os |
强制类型转换触发即可
1 | import yaml |
python/name
和python/module标签的逻辑类似,不过!!python/name标签可以返回模块下面的属性/方法
1 | import yaml |
这里的payload?key=!!python/name:__main__.KEY可以直接绕过验证
版本大于5.1
常用的利用方法和小于5.1的版本是一样的,需要额外加上构造器
- yaml.unsafe_load(exp)
- yaml.unsafe_load_all(exp)
- yaml.load(exp,Loader=UnsafeLoader)
- yaml.load_all(exp,Loader=UnsafeLoader)
- yaml.load(exp,Loader=Loader)
- yaml.load_all(exp,Loader=Loader)
来源: https://www.yuque.com/guansuanbangzhuangganjun/oxmbxg/mwlmhu7lrsdghguf
语雀文档ID: 139684579