类型(Type)

xray 支持所有CEL文档中的类型,同时还注入了几种特殊的类型,包含:

  • addrType 连接地址信息
  • connInfoType 连接信息,包含源地址和目的地址, 可以通过 response.conn
  • urlType url 类型,可以 request.urlresponse.urlreverse.url 调用
  • reverseType 反连平台类型
  • request 扫描请求
  • response 请求的响应,通用属性包含:raw

其中注入的 request 和 response 类型是随着 transport 对应的值进行改变的。

TCP请求响应

其中 request 包含的字段如下:

变量名类型说明适用版本
request.raw[]byte原始请求xray ≥ 1.8.4

response 包含的字段如下:

变量名类型说明适用版本
response.connconnInfoType连接相关信息xray ≥ 1.8.4
response.raw[]byte原始响应xray ≥ 1.8.4

UDP请求响应

其中 request 包含的字段如下:

变量名类型说明适用版本
request.raw[]byte原始请求xray ≥ 1.8.4

response 包含的字段如下:

变量名类型说明适用版本
response.connconnInfoType连接相关信息xray ≥ 1.8.4
response.raw[]byte原始响应xray ≥ 1.8.4

HTTP请求响应

其中 request 包含的字段如下:

变量名类型说明适用版本
request.raw[]byte原始请求xray ≥ 1.8.4
request.urlurlType自定义类型 urlType, 请查看下方 urlType 的说明xray ≥ 1.8.4
request.methodstring原始请求的方法xray ≥ 1.8.4
request.headersmap[string]string原始请求的HTTP头,是一个键值对(均为小写),我们可以通过headers['server']来获取值。如果键不存在,则获取到的值是空字符串。注意,该空字符串不能用于 == 以外的操作,否则不存在的时候将报错,需要先 in 判断下。详情参考下文常用函数章节。xray ≥ 1.8.4
request.content_typestring原始请求的 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.urlurlType自定义类型 urlType, 请查看下方 urlType 的说明xray ≥ 1.8.4
response.statusint返回包的status codexray ≥ 1.8.4
response.raw_header[]byte原始的 header 部分,需要使用字节流相关方法来判断。xray ≥ 1.8.4
response.body[]byte返回包的Body,因为是一个字节流(bytes)而非字符串,后面判断的时候需要使用字节流相关的方法xray ≥ 1.8.4
response.body_stringstring返回包的Body,是一个字符串xray ≥ 1.9.1
response.headersmap[string]string返回包的HTTP头,类似 request.headersxray ≥ 1.8.4
response.content_typestring返回包的content-type头的值xray ≥ 1.8.4
response.latencyint响应的延迟时间,可以用于 sql 时间盲注的判断,单位毫秒 (ms)xray ≥ 1.8.4
response.title[]byte返回包的Title,因为是一个字节流(bytes)而非字符串,后面判断的时候需要使用字节流相关的方法xray ≥ 1.8.5
response.title_stringstring返回包的Title,是一个字符串xray ≥ 1.8.5
response.certCERTType自定义类型CERTType, 请查看下方 CERTType 的说明xpoc ≥ 0.0.8
response.raw_cert[]byte返回包的证书的原始部分,是一个字节流(bytes)xpoc ≥ 0.0.8
response.icon_urlstring返回包中尝试提取的icon的地址,是一个字符串,为DER(Distinguished Encoding Rules)格式xpoc ≥ 0.0.8

基本类型(Basic types)

addrType

addrType 类型包含字段如下, 设变量名为 addr

变量名类型说明适用版本
addr.transportstringtranportxray ≥ 1.8.4
addr.addrstring目的地址, 获取失败时返回空字符串,形如: 192.0.2.1:25, [2001:2001::1]:80xray ≥ 1.8.4
addr.portstring端口号, 获取失败时返回 ""xray ≥ 1.8.4

connInfoType

connInfoType 类型包含字段如下, 设变量名为 conn

变量名类型说明适用版本
conn.sourceaddrType源地址信息xray ≥ 1.8.4
conn.destinationaddrType目的地址信息xray ≥ 1.8.4

urlType

urlType 类型包含的字段如下, 设变量名为 url, 以 http://example.com:8080/a?c=d#x=y 为例:

变量名类型说明适用版本
url.schemestringurl 的 scheme, 示例为 "http"xray ≥ 1.8.4
url.domainstringurl 的域名,示例例为 "example.com"xray ≥ 1.8.4
url.hoststringurl 的主机名,示例为 "example.com:8080"xray ≥ 1.8.4
url.portstringurl 的 port,注意这里也是字符串。 示例为 "8080"xray ≥ 1.8.4
url.pathstringurl 的 path, 示例为 "/a"xray ≥ 1.8.4
url.querystringurl 的 query, 示例为 "c=d"xray ≥ 1.8.4
url.fragmentstringurl 的锚点,示例为 "x=y"xray ≥ 1.8.4

reverseType

reverseType 类型包含字段如下, 设变量名为 reverse(需要先使用 newReverse() 生成实例)

变量名类型说明适用版本
reverse.urlurlType反连平台的 urlxray ≥ 1.8.4
reverse.domainstring反连平台的域名xray ≥ 1.8.4
reverse.rmiurlType反连平台的rmi协议urlxray ≥ 1.9.4
reverse.ipstring反连平台的 ip 地址xray ≥ 1.8.4
reverse.is_domain_name_serverbool反连平台的 domain 是否同时是 nameserverxray ≥ 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.issuerstring证书的颁发机构。用来标识颁发证书的实体或组织。示例:CN=R3,O=Let's Encrypt,C=USxpoc ≥ 0.0.8
cert.subjectstring证书的主题,也就是证书持有者的身份信息。示例:CN=xray.coolxpoc ≥ 0.0.8
cert.dnsnamesstring证书相关联的 DNS 名称,用于识别证书可以用于验证的服务器或域名。示例:docs.xray.cool,download.xray.cool,poc.xray.cool,xray.coolxpoc ≥ 0.0.8
cert.not_afterTimestamp证书的过期时间,用于指定证书有效期的结束日期和时间。示例:2024-03-25 03:05:36 +0000 UTC,此处的示例显示的是时间戳在被当成字符串输出时展示的内容xpoc ≥ 0.0.8
cert.not_beforeTimestamp证书的生效时间,用于指定证书有效期的开始日期和时间。示例:2023-12-26 03:05:37 +0000 UTC,同上xpoc ≥ 0.0.8
cert.serial_numberstring证书的序列号,用于唯一标识一个证书。示例:342932071325336127920295100216553911823483xpoc ≥ 0.0.8

函数(Function)

xray 支持所有 CEL 文档中的函数,同时还新增了一些函数支持,下面列举一下常用的函数:

:gocel 原生的正则支持使用的 golang 自带的 regex 库, 在脚本中我们使用 regex2 替换了自带的 regex 库

rule 函数

:只有脚本层级的 expression 才能使用这些函数

函数名函数原型说明适用版本
rule namefunc <rule name>() bool返回这条 rule expression 执行的结果xray ≥ 1.8.4

字符串处理(String)

函数名函数原型说明适用版本详情
containsfunc (s1 string) contains(s2 string) bool判断 s1 是否包含 s2,返回 bool 类型结果xray ≥ 1.8.4🔎
icontainsfunc (s1 string) icontains(s2 string) bool判断 s1 是否包含 s2,返回 bool 类型结果, 与 contains 不同的是,icontains 忽略大小写xray ≥ 1.8.4🔎
substrfunc substr(string, start int, length int) string截取字符串xray ≥ 1.8.4🔎
replaceAllfunc replaceAll(string, old string, new string) string将 string 中的 old 替换为 new,返回替换后的 stringxray ≥ 1.8.4🔎
printablefunc printable(string) string将 string 中的非 unicode 编码字符去掉xray ≥ 1.8.4🔎
toUintStringfunc toUintString(s1 string, direction string) stringdirection 取值为 >,<表示读取方向, 将 s1 按 direction 读取为一个整数,返回该整数的字符串形式xray ≥ 1.8.4🔎
startsWithfunc (s1 string) startsWith(s2 string) bool判断 s1 是否由 s2 开头全版本🔎
endsWithfunc (s1 string) endsWith(s2 string) bool判断 s1 是否由 s2 结尾全版本🔎
basenamefunc basename(s1 string) string返回 URL 的最后一个路径的名称xray ≥ 1.9.1🔎
dirfunc dir(s1 string) string返回 URL 的路径xray ≥ 1.9.1🔎
upperfunc upper(s1 string) string将 string 中的小写字母转换成大写xray ≥ 1.9.3🔎
revfunc rev(s1 string) string将 string 反向输出,主要用于验证命令执行xray ≥ 1.9.3🔎
sizefunc size(s1 string) int返回 string 的长度全版本🔎

[]byte 处理

函数名函数原型说明适用版本详情
bcontainsfunc (b1 bytes) bcontains(b2 bytes) bool判断一个 b1 是否包含 b2,返回 bool 类型结果。与 contains 不同的是,bcontains 是字节流(bytes)的查找xray ≥ 1.8.4🔎
ibcontainsfunc (b1 bytes) ibcontains(b2 bytes) bool判断 b1 是否包含 b2,返回 bool 类型结果, 与 contains 不同的是,ibcontains 是字节流(bytes)的查找, 且忽略大小写xray ≥ 1.8.4🔎
bstartsWithfunc (b1 bytes) bstartsWith(b2 bytes) bool判断一个 b1 是否由 b2 开头,返回 bool 类型结果。与 startsWith 不同的是,bcontains 是字节流(bytes)的查找xray ≥ 1.8.4🔎
bformatfunc (b1 bytes) bformat(int, int, string, int) string将 bytes 进行进制转换编码,可以根据输入的参数转换成对应的进制编码,并可以自定义转换格式xray ≥ 1.8.5🔎
sizefunc size(b1 bytes) int返回 bytes 的长度全版本🔎

编码函数(Encoding)

函数名函数原型说明适用版本详情
base64func base64(v1 string/bytes) string将字符串或 bytes 进行 base64 编码xray ≥ 1.8.4🔎
base64Decodefunc base64Decode(v1 string/bytes) string将字符串或 bytes 进行 base64 解码xray ≥ 1.8.4🔎
urlencodefunc urlencode(v1 string/bytes) string将字符串或 bytes 进行 urlencode 编码xray ≥ 1.8.4🔎
urlencodeallfunc urlencodeall(v1 string/bytes) string将字符串或 bytes 进行 urlencode 编码, 结果为全字符编码xray ≥ 1.8.5🔎
urldecodefunc urldecode(v1 string/bytes) string将字符串或 bytes 进行 urldecode 解码xray ≥ 1.8.4🔎
faviconHashfunc faviconHash(v1 string/bytes) int将字符串或 bytes 进行 faviconHash 编码,参考:iconhashxray ≥ 1.8.4🔎
htmlEscapefunc htmlEscape(string/bytes, string, bool) string将字符串或 bytes 进行 htmlEscape 编码,支持 named/numeric/hex 模式,支持全/非全字符编码xray ≥ 1.9.4🔎
htmlUnescapefunc htmlUnescape(string/bytes) string将字符串或 bytes 进行 htmlEscape 解码,支持 named/numeric/hex 模式,支持全/非全字符编码xray ≥ 1.9.4🔎
hexfunc hex(string/bytes) string将字符串或 bytes 进行 hex 编码xray ≥ 1.9.4🔎
hexDecodefunc hexDecode(string/bytes) bytes将字符串或 bytes 进行 hex 解码xray ≥ 1.9.4🔎

加密函数(Encrypt)

函数名函数原型说明适用版本详情
md5func md5(v1 string/bytes) string字符串的 md5xray ≥ 1.8.4🔎
shafunc sha(v1 string/bytes, s1 string)string该函数可以将指定字符串或 bytes 进行 sha 系列计算。xray ≥ 1.8.4🔎
hmacShafunc hmacSha(v1 string/bytes, s1 string, s2 string)string该函数可以将指定字符串或 bytes 进行 hmac_sha 系列计算。xray ≥ 1.8.4🔎
rsaEncryptPKCS1v15func rsaEncryptPKCS1v15(b1 bytes, k1 string)bytes该函数可以将指定数据按照PKCS1v15的填充模式进行RSA加密运算xpoc ≥ 0.0.8🔎
rsaDecryptPKCS1v15func rsaDecryptPKCS1v15(b1 bytes, k1 string)bytes该函数可以将指定数据按照PKCS1v15的填充模式进行RSA解密运算xpoc ≥ 0.0.8🔎
aesDecryptfunc aesDecrypt(d1 bytes/string, k1 bytes/string, m1 string)string该函数可以对aes加密的数据进行解密xpoc ≥ 0.0.8🔎

随机值(Random)

函数名函数原型说明适用版本详情
randomIntfunc randomInt(from, to int) int两个范围内的随机数xray ≥ 1.8.4🔎
randomLowercasefunc randomLowercase(n length) string指定长度的小写字母组成的随机字符串xray ≥ 1.8.4🔎

正则(Regex)

函数名函数原型说明适用版本详情
matchesfunc (s1 string) matches(s2 string) bool使用正则表达式 s1 来匹配 s2,返回 bool 类型匹配结果xray ≥ 1.8.4🔎
submatchfunc (s1 string) submatch(s2 string) map[string]string使用正则表达式 s1 来匹配 s2,返回 map[string]string 类型结果,:只返回具名的正则匹配结果 (?P<name>…) 格式xray ≥ 1.8.4🔎
bmatchesfunc (s1 string) bmatches(b1 bytes) bool使用正则表达式 s1 来匹配 b1,返回 bool 类型匹配结果。与 matches 不同的是,bmatches 匹配的是字节流(bytes)xray ≥ 1.8.4🔎
bsubmatchfunc (s1 string) bsubmatch(b1 bytes) map[string]string使用正则表达式 s1 来匹配 b1,返回 map[string]string 类型结果 :只返回具名的正则匹配结果 (?P<name>…) 格式。与 submatch 不同的是,bsubmatch 匹配的是字节流(bytes)xray ≥ 1.8.4🔎

反连平台(Reverse)

函数名函数原型说明适用版本详情
newReversefunc newReverse() reverseType返回一个 reverse 实例xray ≥ 1.8.4🔎
waitfunc (reverse reverseType) wait(timeout int) bool等待 timeout 秒,并返回是否在该时间内获得了信息xray ≥ 1.8.4🔎

时间(Time)

函数名函数原型说明适用版本
nowfunc now() Timestamp使用该函数将返回当前时间,使用 int(now()),将会获取当前时间的时间戳xray ≥ 1.8.5🔎
sleepfunc sleep(i1 int) bool暂停执行等待指定的秒数xray ≥ 1.8.4🔎
timeConvertfunc timeConvert(int, string) string该函数可以将指定时间戳转换成自定义格式的字符串xray ≥ 1.8.5🔎

版本(Version)

函数名函数原型说明适用版本详情
versionInfunc versionIn(s1 string,s2 string) bool判断所给出的版本是否在所限定的版本范围之内,版本格式参考: semverxray ≥ 1.9.4🔎
versionLessfunc (s1 string) versionLess(s2 string) bool判断所给出的版本是否小于所给出的版本,版本格式参考: semverxray ≥ 1.9.4🔎
versionGreaterfunc (s1 string) versionGreater(s2 string) bool判断所给出的版本是否大于所给出的版本,版本格式参考: semverxray ≥ 1.9.4🔎
versionEqualfunc (s1 string) versionEqual(s2 string) bool判断所给出的版本是否等于所给出的版本,版本格式参考: semverxray ≥ 1.9.4🔎

java 反序列化

函数名函数原型说明适用版本详情
javaGadgetfunc javaGadget(gadget string, payload string, type string) bytes依据所给出的生成链条以及 payload 内容生成对应的 gadget 内容,第一个参数接收 gadget 类型;第二个参数为 payload 内容,为 cmd/反连 URL;第三个参数为 payload 类型xray ≥ 1.9.4🔎

其它(Other)

函数名函数原型说明适用版本详情
instring in mapmap 中是否包含某个 keyxray ≥ 1.8.4
getIconContentfunc (r1 response) getIconContent() bytes获取response中的icon的字节流数据,如果只存储了icon的地址,则会自动访问该icon,并返回字节流xray ≥ 1.9.3🔎
get404Pathfunc get404Path() string获取一个长度为8的随机字符串,当作404页面的路径,并保证在一次扫描中,同一个目标将只有一个404pathxpoc >= 0.0.1🔎
zipSlipfunc zipSlip(s1 string, b1 bytes) bytes该函数可以自定义生成一个zip文件xpoc >= 0.0.8🔎