transport: string
形如:
cache: bool
:是否使用缓存的请求,如果该选项为 true,那么如果在一次探测中其它脚本对相同目标发送过相同请求,那么便使用之前缓存的响应,而不发新的数据包method: string
:请求方法path: string
:请求的完整 Path,包括 querystring 等 (详情见: HTTP PATH 的使用)
/
开头的, 取 dir 路径拼接^
开头的, uri 直接取该路径headers: map[string]string
:请求 HTTP 头,Rule 中指定的值会被覆盖到原始数据包的 HTTP 头中body: string
:请求的Body(转译问题见:头疼的转译)follow_redirects: bool
:是否允许跟随300跳转, method为GET或者HEAD时,该选项为true时,其他情况为false。expression
是用来对返回包(response)进行匹配的,你可以编写各种各样的限制来判断返回包中信息,从而确认返回的内容是否符合要求。
正如spring使用SpEL表达式,struts2使用OGNL表达式,xray使用了编译性语言Golang,所以为了实现动态执行一些规则,我们使用了Common Expression Language (CEL)表达式:
bcontains
用来匹配 bytes 是否包含,类似的,如果要匹配 string 的包含,可以使用 contains
, 如:
值得注意的是,类似于python,CEL中的字符串可以有转义和前缀,如:(详情见:头疼的转义)
'\r\n'
表示换行r'\r\n'
不表示换行,仅仅表示这4个字符。在编写正则时很有意义。b'test'
一个字节流(bytes),在golang中即为[]byte
response.body_string.contains('test')
response.body_string.contains(r1 + 'some value' + r2)
response.content_type.contains('application/octet-stream') && response.body.bcontains(b'\x00\x01\x02')
response.content_type.contains('zip') && r'^PK\x03\x04'.bmatches(response.body)
response.status >= 300 && response.status < 400
(response.status >= 500 && response.status != 502) || "<input value=\"(.+?)\"".matches(response.body_string)
response.headers["location"]=="https://www.example.com"
Location
等于指定值,如果 Location
不存在,该表达式返回 false'docker-distribution-api-version' in response.headers && response.headers['docker-distribution-api-version'].contains('registry/2.0')
docker-distribution-api-version
并且 value 包含指定字符串,如果不判断 in
,后续的 contains 会出错。response.body_string.contains(response.url.path)
&&
或||
的时候,与其他的expression表达式做运算,最终出一个结果,最终结果如果为true,则代表这个规则命中。r1
, r2
, r3
,r4
4 条规则, 作为脚本层级的 expression,其全局变量将会定义 r1
, r2
, r3
, r4
4 个函数,调用这个 4 个函数即可获得它对应 rule 的结果。
r1
, r2
, r3
,r4
4 条规则
最开始时, V1 版本添加了 rules: []Rule
来定义 rule 及其执行顺序。其逻辑为顺序执行 rule, 且 r1
, r2
, r3
,r4
都为 true 时, 脚本执行成功
group: map[string][]Rule
拓展了一下 ruel 的执行方式。支持了 r1,r2 同时为 true 或者 r3, r4 同时为 true 时, 脚本执行成功
短路求值
, 即 r1() || r2()
, 如果 r1()
的结果为 true 那么 r2 是不会执行的set: map[string]interface{}
变量名/函数名 | 类型 | 说明 |
---|---|---|
continue | bool | 命中一个之后是否继续 |
payloads | map[string]Set | 和 set 一样的结构和语法 |
payload
, 目前不考虑支持文件或者复杂排列组合等情况,每个 payload
中的 key
必须严格一致{{version}}
, 其中变量为 set 或者 rule output 中定义的变量