YAML插件的参数
该文档会简单介绍所有的数据类型以及支持的函数
请求参数(Request Patch)
规则中的request部分的参数说明
参数名 | 参数类型 | 说明 | 适用版本 |
---|---|---|---|
cache | bool | 当前请求是否使用缓存 | 全版本 |
method | string | 定义请求的方法 | 全版本 |
path | string | 定义请求的路径 | 全版本 |
header | map[string]string | 定义请求的header | 全版本 |
body | string | 定义请求体 | 全版本 |
follow_redirects | bool | 定义请求是否跟随跳转 | 全版本 |
read_timeout | string | 定义当前请求的超时时间 | 全版本 |
no_cookie | bool | 定义当前请求是否继承之前请求的cookie | xpoc ≥ 0.1.0;xapp ≥ 0.0.2 |
类型(Type)
xray 支持所有CEL文档中的类型,同时还注入了几种特殊的类型,包含:
addrType
连接地址信息connInfoType
连接信息,包含源地址和目的地址, 可以通过response.conn
urlType
url 类型,可以request.url
、response.url
和reverse.url
调用reverseType
反连平台类型request
扫描请求response
请求的响应,通用属性包含:raw
其中注入的 request 和 response 类型是随着 transport
对应的值进行改变的。
TCP请求响应
其中 request 包含的字段如下:
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
request.raw | []byte | 原始请求 | xray ≥ 1.8.4 |
response 包含的字段如下:
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
response.conn | connInfoType | 连接相关信息 | xray ≥ 1.8.4 |
response.raw | []byte | 原始响应 | xray ≥ 1.8.4 |
UDP请求响应
其中 request 包含的字段如下:
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
request.raw | []byte | 原始请求 | xray ≥ 1.8.4 |
response 包含的字段如下:
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
response.conn | connInfoType | 连接相关信息 | xray ≥ 1.8.4 |
response.raw | []byte | 原始响应 | xray ≥ 1.8.4 |
HTTP请求响应
其中 request 包含的字段如下:
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
request.raw | []byte | 原始请求 | xray ≥ 1.8.4 |
request.url | urlType | 自定义类型 urlType, 请查看下方 urlType 的说明 | xray ≥ 1.8.4 |
request.method | string | 原始请求的方法 | xray ≥ 1.8.4 |
request.headers | map[string]string | 原始请求的HTTP头,是一个键值对(均为小写),我们可以通过headers['server'] 来获取值。如果键不存在,则获取到的值是空字符串。注意,该空字符串不能用于 == 以外的操作,否则不存在的时候将报错,需要先 in 判断下。详情参考下文常用函数章节。 | xray ≥ 1.8.4 |
request.content_type | string | 原始请求的 content-type 头的值, 等于request.headers["Content-Type"] | xray ≥ 1.8.4 |
request.raw_header | []byte | 原始的 header 部分,需要使用字节流相关方法来判断。 | xray ≥ 1.8.4 |
request.body | []byte | 原始请求的 body,需要使用字节流相关方法来判断。如果是 GET, body 为空。 | xray ≥ 1.8.4 |
response 包含的字段如下:
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
response.raw | []byte | 原始响应 | xray ≥ 1.8.4 |
response.url | urlType | 自定义类型 urlType, 请查看下方 urlType 的说明 | xray ≥ 1.8.4 |
response.status | int | 返回包的status code | xray ≥ 1.8.4 |
response.raw_header | []byte | 原始的 header 部分,需要使用字节流相关方法来判断。 | xray ≥ 1.8.4 |
response.body | []byte | 返回包的Body,因为是一个字节流(bytes)而非字符串,后面判断的时候需要使用字节流相关的方法 | xray ≥ 1.8.4 |
response.body_string | string | 返回包的Body,是一个字符串 | xray ≥ 1.9.1 |
response.headers | map[string]string | 返回包的HTTP头,类似 request.headers 。 | xray ≥ 1.8.4 |
response.content_type | string | 返回包的content-type头的值 | xray ≥ 1.8.4 |
response.latency | int | 响应的延迟时间,可以用于 sql 时间盲注的判断,单位毫秒 (ms) | xray ≥ 1.8.4 |
response.title | []byte | 返回包的Title,因为是一个字节流(bytes)而非字符串,后面判断的时候需要使用字节流相关的方法 | xray ≥ 1.8.5 |
response.title_string | string | 返回包的Title,是一个字符串 | xray ≥ 1.8.5 |
response.cert | CERTType | 自定义类型CERTType, 请查看下方 CERTType 的说明 | xpoc ≥ 0.0.8 |
response.raw_cert | []byte | 返回包的证书的原始部分,是一个字节流(bytes) | xpoc ≥ 0.0.8 |
response.icon_url | string | 返回包中尝试提取的icon的地址,是一个字符串,为DER(Distinguished Encoding Rules)格式 | xpoc ≥ 0.0.8 |
基本类型(Basic types)
addrType
addrType 类型包含字段如下, 设变量名为 addr
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
addr.transport | string | tranport | xray ≥ 1.8.4 |
addr.addr | string | 目的地址, 获取失败时返回空字符串,形如: 192.0.2.1:25 , [2001:2001::1]:80 | xray ≥ 1.8.4 |
addr.port | string | 端口号, 获取失败时返回 "" | xray ≥ 1.8.4 |
connInfoType
connInfoType 类型包含字段如下, 设变量名为 conn
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
conn.source | addrType | 源地址信息 | xray ≥ 1.8.4 |
conn.destination | addrType | 目的地址信息 | xray ≥ 1.8.4 |
urlType
urlType 类型包含的字段如下, 设变量名为 url
, 以 http://example.com:8080/a?c=d#x=y
为例:
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
url.scheme | string | url 的 scheme, 示例为 "http" | xray ≥ 1.8.4 |
url.domain | string | url 的域名,示例例为 "example.com" | xray ≥ 1.8.4 |
url.host | string | url 的主机名,示例为 "example.com:8080" | xray ≥ 1.8.4 |
url.port | string | url 的 port,注意这里也是字符串。 示例为 "8080" | xray ≥ 1.8.4 |
url.path | string | url 的 path, 示例为 "/a" | xray ≥ 1.8.4 |
url.query | string | url 的 query, 示例为 "c=d" | xray ≥ 1.8.4 |
url.fragment | string | url 的锚点,示例为 "x=y" | xray ≥ 1.8.4 |
reverseType
reverseType 类型包含字段如下, 设变量名为 reverse
(需要先使用 newReverse()
生成实例)
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
reverse.url | urlType | 反连平台的 url | xray ≥ 1.8.4 |
reverse.domain | string | 反连平台的域名 | xray ≥ 1.8.4 |
reverse.rmi | urlType | 反连平台的rmi协议url | xray ≥ 1.9.4 |
reverse.ip | string | 反连平台的 ip 地址 | xray ≥ 1.8.4 |
reverse.is_domain_name_server | bool | 反连平台的 domain 是否同时是 nameserver | xray ≥ 1.8.4 |
reverse.wait(timeout) | func (timeout int) bool | 等待 timeout 秒,并返回是否在改时间内获得了信息 | xray ≥ 1.8.4 |
参数详情介绍:🔎详情
Timestamp
Timestamp 类型实际是google.protobuf.Timestamp类型,为cel表达式本身自带的类型,其本身包含了非常多的方法,详情可查看:Timestamp
CERTType
CERTType 类型包含的字段如下, 设变量名为 cert
,以https://docs.xray.cool
的证书举例:
变量名 | 类型 | 说明 | 适用版本 |
---|---|---|---|
cert.issuer | string | 证书的颁发机构。用来标识颁发证书的实体或组织。示例:CN=R3,O=Let's Encrypt,C=US | xpoc ≥ 0.0.8 |
cert.subject | string | 证书的主题,也就是证书持有者的身份信息。示例:CN=xray.cool | xpoc ≥ 0.0.8 |
cert.dnsnames | string | 证书相关联的 DNS 名称,用于识别证书可以用于验证的服务器或域名。示例:docs.xray.cool,download.xray.cool,poc.xray.cool,xray.cool | xpoc ≥ 0.0.8 |
cert.not_after | Timestamp | 证书的过期时间,用于指定证书有效期的结束日期和时间。示例:2024-03-25 03:05:36 +0000 UTC ,此处的示例显示的是时间戳在被当成字符串输出时展示的内容 | xpoc ≥ 0.0.8 |
cert.not_before | Timestamp | 证书的生效时间,用于指定证书有效期的开始日期和时间。示例:2023-12-26 03:05:37 +0000 UTC ,同上 | xpoc ≥ 0.0.8 |
cert.serial_number | string | 证书的序列号,用于唯一标识一个证书。示例:342932071325336127920295100216553911823483 | xpoc ≥ 0.0.8 |
变量名约定(Variable)
在定义变量名称时,需要考虑到一些特定的名称可能会被系统进行特殊处理。因此,为了避免潜在的冲突或误解,以下表格列出了一些常见的变量名及其用途的描述和示例。当您在如Set、Payloads、Output、Detail等部分定义变量时,建议避免误用这些名称。
变量名 | 说明 | 示例值 |
---|---|---|
version | 用于指定版本的变量名 | 1.0.0 |
os_name | 操作系统名称的变量名 | ubuntu |
os_type | 操作系统类型的变量名 | linux , windows |
device_type | 设备类型的变量名 | |
hostname | 主机名称的变量名 | server01 |
函数(Function)
xray 支持所有 CEL 文档中的函数,同时还新增了一些函数支持,下面列举一下常用的函数:
注:gocel 原生的正则支持使用的 golang 自带的 regex 库, 在脚本中我们使用 regex2 替换了自带的 regex 库
rule 函数
注:只有脚本层级的 expression 才能使用这些函数
函数名 | 函数原型 | 说明 | 适用版本 |
---|---|---|---|
rule name | func <rule name>() bool | 返回这条 rule expression 执行的结果 | xray ≥ 1.8.4 |
字符串处理(String)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
contains | func (s1 string) contains(s2 string) bool | 判断 s1 是否包含 s2,返回 bool 类型结果 | xray ≥ 1.8.4 | 🔎 |
icontains | func (s1 string) icontains(s2 string) bool | 判断 s1 是否包含 s2,返回 bool 类型结果, 与 contains 不同的是,icontains 忽略大小写 | xray ≥ 1.8.4 | 🔎 |
substr | func substr(string, start int, length int) string | 截取字符串 | xray ≥ 1.8.4 | 🔎 |
replaceAll | func replaceAll(string, old string, new string) string | 将 string 中的 old 替换为 new,返回替换后的 string | xray ≥ 1.8.4 | 🔎 |
printable | func printable(string) string | 将 string 中的非 unicode 编码字符去掉 | xray ≥ 1.8.4 | 🔎 |
toUintString | func toUintString(s1 string, direction string) string | direction 取值为 > ,< 表示读取方向, 将 s1 按 direction 读取为一个整数,返回该整数的字符串形式 | xray ≥ 1.8.4 | 🔎 |
startsWith | func (s1 string) startsWith(s2 string) bool | 判断 s1 是否由 s2 开头 | 全版本 | 🔎 |
endsWith | func (s1 string) endsWith(s2 string) bool | 判断 s1 是否由 s2 结尾 | 全版本 | 🔎 |
basename | func basename(s1 string) string | 返回 URL 的最后一个路径的名称 | xray ≥ 1.9.1 | 🔎 |
dir | func dir(s1 string) string | 返回 URL 的路径 | xray ≥ 1.9.1 | 🔎 |
upper | func upper(s1 string) string | 将 string 中的小写字母转换成大写 | xray ≥ 1.9.3 | 🔎 |
rev | func rev(s1 string) string | 将 string 反向输出,主要用于验证命令执行 | xray ≥ 1.9.3 | 🔎 |
size | func size(s1 string) int | 返回 string 的长度 | 全版本 | 🔎 |
format | func (data string) format(align int, align_data string, prefix string, step int) string | format 函数主要用于格式化字符串,可以通过指定的对齐字符、前缀以及步进参数来调整字符串的显示样式 | xpoc ≥ 0.1.0; xapp ≥ 0.0.2 | 🔎 |
[]byte 处理
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
bcontains | func (b1 bytes) bcontains(b2 bytes) bool | 判断一个 b1 是否包含 b2,返回 bool 类型结果。与 contains 不同的是,bcontains 是字节流(bytes)的查找 | xray ≥ 1.8.4 | 🔎 |
ibcontains | func (b1 bytes) ibcontains(b2 bytes) bool | 判断 b1 是否包含 b2,返回 bool 类型结果, 与 contains 不同的是,ibcontains 是字节流(bytes)的查找, 且忽略大小写 | xray ≥ 1.8.4 | 🔎 |
bstartsWith | func (b1 bytes) bstartsWith(b2 bytes) bool | 判断一个 b1 是否由 b2 开头,返回 bool 类型结果。与 startsWith 不同的是,bcontains 是字节流(bytes)的查找 | xray ≥ 1.8.4 | 🔎 |
bformat | func (b1 bytes) bformat(int, int, string, int) string | 将 bytes 进行进制转换编码,可以根据输入的参数转换成对应的进制编码,并可以自定义转换格式 | xray ≥ 1.8.5 | 🔎 |
bload | func bload(data string, base int, align int, prefix string, step int) []byte | bload 函数用于将字符串数据按照特定的编码规则转换为字节序列,支持自定义的编码基数、对齐、前缀以及步进参数 | xpoc ≥ 0.1.0; xapp ≥ 0.0.2 | 🔎 |
size | func size(b1 bytes) int | 返回 bytes 的长度 | 全版本 | 🔎 |
编码函数(Encoding)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
base64 | func base64(v1 string/bytes) string | 将字符串或 bytes 进行 base64 编码 | xray ≥ 1.8.4 | 🔎 |
base64Decode | func base64Decode(v1 string/bytes) string | 将字符串或 bytes 进行 base64 解码 | xray ≥ 1.8.4 | 🔎 |
urlencode | func urlencode(v1 string/bytes) string | 将字符串或 bytes 进行 urlencode 编码 | xray ≥ 1.8.4 | 🔎 |
urlencodeall | func urlencodeall(v1 string/bytes) string | 将字符串或 bytes 进行 urlencode 编码, 结果为全字符编码 | xray ≥ 1.8.5 | 🔎 |
urldecode | func urldecode(v1 string/bytes) string | 将字符串或 bytes 进行 urldecode 解码 | xray ≥ 1.8.4 | 🔎 |
faviconHash | func faviconHash(v1 string/bytes) int | 将字符串或 bytes 进行 faviconHash 编码,参考:iconhash | xray ≥ 1.8.4 | 🔎 |
htmlEscape | func htmlEscape(string/bytes, string, bool) string | 将字符串或 bytes 进行 htmlEscape 编码,支持 named/numeric/hex 模式,支持全/非全字符编码 | xray ≥ 1.9.4 | 🔎 |
htmlUnescape | func htmlUnescape(string/bytes) string | 将字符串或 bytes 进行 htmlEscape 解码,支持 named/numeric/hex 模式,支持全/非全字符编码 | xray ≥ 1.9.4 | 🔎 |
hex | func hex(string/bytes) string | 将字符串或 bytes 进行 hex 编码 | xray ≥ 1.9.4 | 🔎 |
hexDecode | func hexDecode(string/bytes) bytes | 将字符串或 bytes 进行 hex 解码 | xray ≥ 1.9.4 | 🔎 |
加密函数(Encrypt)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
md5 | func md5(v1 string/bytes) string | 字符串的 md5 | xray ≥ 1.8.4 | 🔎 |
sha | func sha(v1 string/bytes, s1 string)string | 该函数可以将指定字符串或 bytes 进行 sha 系列计算。 | xray ≥ 1.8.4 | 🔎 |
hmacSha | func hmacSha(v1 string/bytes, s1 string, s2 string)string | 该函数可以将指定字符串或 bytes 进行 hmac_sha 系列计算。 | xray ≥ 1.8.4 | 🔎 |
rsaEncryptPKCS1v15 | func rsaEncryptPKCS1v15(b1 bytes, k1 string)bytes | 该函数可以将指定数据按照PKCS1v15的填充模式进行RSA加密运算 | xpoc ≥ 0.0.8 | 🔎 |
rsaDecryptPKCS1v15 | func rsaDecryptPKCS1v15(b1 bytes, k1 string)bytes | 该函数可以将指定数据按照PKCS1v15的填充模式进行RSA解密运算 | xpoc ≥ 0.0.8 | 🔎 |
aesDecrypt | func aesDecrypt(d1 bytes/string, k1 bytes/string, m1 string)string | 该函数可以对aes加密的数据进行解密 | xpoc ≥ 0.0.8 | 🔎 |
随机值(Random)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
randomInt | func randomInt(from, to int) int | 两个范围内的随机数 | xray ≥ 1.8.4 | 🔎 |
randomLowercase | func randomLowercase(n int) string | 指定长度的小写字母组成的随机字符串 | xray ≥ 1.8.4 | 🔎 |
uuid | func uuid() string | 生成 uuid 字符串 | xpoc ≥ 0.1.0; xapp ≥ 0.0.2 | 🔎 |
正则(Regex)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
matches | func (s1 string) matches(s2 string) bool | 使用正则表达式 s1 来匹配 s2,返回 bool 类型匹配结果 | xray ≥ 1.8.4 | 🔎 |
submatch | func (s1 string) submatch(s2 string) map[string]string | 使用正则表达式 s1 来匹配 s2,返回 map[string]string 类型结果,注:只返回具名的正则匹配结果 (?P<name>…) 格式 | xray ≥ 1.8.4 | 🔎 |
bmatches | func (s1 string) bmatches(b1 bytes) bool | 使用正则表达式 s1 来匹配 b1,返回 bool 类型匹配结果。与 matches 不同的是,bmatches 匹配的是字节流(bytes) | xray ≥ 1.8.4 | 🔎 |
bsubmatch | func (s1 string) bsubmatch(b1 bytes) map[string]string | 使用正则表达式 s1 来匹配 b1,返回 map[string]string 类型结果 注:只返回具名的正则匹配结果 (?P<name>…) 格式。与 submatch 不同的是,bsubmatch 匹配的是字节流(bytes) | xray ≥ 1.8.4 | 🔎 |
反连平台(Reverse)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
newReverse | func newReverse() reverseType | 返回一个 reverse 实例 | xray ≥ 1.8.4 | 🔎 |
wait | func (reverse reverseType) wait(timeout int) bool | 等待 timeout 秒,并返回是否在该时间内获得了信息 | xray ≥ 1.8.4 | 🔎 |
时间(Time)
函数名 | 函数原型 | 说明 | 适用版本 | |
---|---|---|---|---|
now | func now() Timestamp | 使用该函数将返回当前时间,使用 int(now()),将会获取当前时间的时间戳 | xray ≥ 1.8.5 | 🔎 |
sleep | func sleep(i1 int) bool | 暂停执行等待指定的秒数 | xray ≥ 1.8.4 | 🔎 |
timeConvert | func timeConvert(int, string) string | 该函数可以将指定时间戳转换成自定义格式的字符串 | xray ≥ 1.8.5 | 🔎 |
版本(Version)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
versionIn | func versionIn(s1 string,s2 string) bool | 判断所给出的版本是否在所限定的版本范围之内,版本格式参考: semver | xray ≥ 1.9.4 | 🔎 |
versionLess | func (s1 string) versionLess(s2 string) bool | 判断所给出的版本是否小于所给出的版本,版本格式参考: semver | xray ≥ 1.9.4 | 🔎 |
versionGreater | func (s1 string) versionGreater(s2 string) bool | 判断所给出的版本是否大于所给出的版本,版本格式参考: semver | xray ≥ 1.9.4 | 🔎 |
versionEqual | func (s1 string) versionEqual(s2 string) bool | 判断所给出的版本是否等于所给出的版本,版本格式参考: semver | xray ≥ 1.9.4 | 🔎 |
java 反序列化
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
javaGadget | func javaGadget(gadget string, payload string, type string) bytes | 依据所给出的生成链条以及 payload 内容生成对应的 gadget 内容,第一个参数接收 gadget 类型;第二个参数为 payload 内容,为 cmd/反连 URL;第三个参数为 payload 类型 | xray ≥ 1.9.4 | 🔎 |
压缩(Compress)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
zipSlip | func zipSlip(s1 string, b1 bytes) bytes | 该函数可以自定义生成一个zip文件 | xpoc >= 0.0.8 | 🔎 |
gzip | func gzip(data string/[]byte) string | 该函数可以对字符串或字节序列数据进行GZIP压缩。 | xpoc ≥ 0.1.0; xapp ≥ 0.0.2 | 🔎 |
进制转换(Base conversion)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
decToHex | func decToHex(n int) string | 该函数可以将十进制转换为十六进制 | xpoc ≥ 0.1.0;xapp ≥ 0.0.2 | 🔎 |
其它(Other)
函数名 | 函数原型 | 说明 | 适用版本 | 详情 |
---|---|---|---|---|
in | string in map | map 中是否包含某个 key | xray ≥ 1.8.4 | |
icon /getIconContent | func (r1 response) getIconContent() bytes | 获取response中的icon的字节流数据,如果只存储了icon的地址,则会自动访问该icon,并返回字节流 | getIconContent[xray ≥ 1.9.3], icon[xpoc ≥ 0.1.0;xapp ≥ 0.0.2] | 🔎 |
get404Path | func get404Path() string | 获取一个长度为8的随机字符串,当作404页面的路径,并保证在一次扫描中,同一个目标将只有一个404path | xpoc >= 0.0.1 | 🔎 |
print | func print(...any) bool | 在调试场景下,使用—debug时,可以将此函数添加到expression中,打印想要的变量的值 | xpoc >= 0.1.0; xapp >= 0.0.2 | 🔎 |
Was this page helpful?