@@ -130,3 +130,129 @@ expression: rr0() && rr1()
130
130
这条规则相比之前的那条似乎规则更强,发出的两个随机数在两个不同的请求中,没有交集的存在,很难发生误报。但是此时难得一见的事情发生了,r1和r2的随机值竟然相等,且在请求rr1时,会将请求的文件名称打印在页面中,那么此时恰好匹配到r2,发生了误报的现象
131
131
132
132
那么,对于这种情况,这里要求在使用同一个随机函数时,不同变量的随机范围一定要完全不同,相互之间不存在交集
133
+
134
+ ### 变量间的引用
135
+
136
+ ` ` ` yaml
137
+ set :
138
+ s1 : randomLowercase(10)
139
+ base64s1 : base64(s1)
140
+ s2 : base64s1 + "AAA"
141
+ ` ` `
142
+
143
+ 在上述的例子中,我们定义了三个变量,其中 ` s2` 的值是 `base64s1` 的值加上 `AAA`。由此可知,在set中,引用一个变量的值,不需要使用`{{}}`
144
+ 将变量包裹起来,直接使用变量名称即可。从这个规则我们也可以引申出,在expression、output中,引用变量的值,也不需要使用`{{}}`将变量包裹起来,直接使用变量名称即可。
145
+
146
+ # ## 定义字符串的方式
147
+
148
+ 在定义字符串的时候,有三种方式,如下所示:
149
+ ` ` ` yaml
150
+ name: poc-yaml-test
151
+ transport: http
152
+ set:
153
+ s1: string("hello world")
154
+ s2: |
155
+ "hello world"
156
+ s3: '"hello world"'
157
+ rules:
158
+ r0:
159
+ request:
160
+ method: POST
161
+ path: /
162
+ follow_redirects: false
163
+ headers:
164
+ Content-Type: text/xml
165
+ body: |
166
+ {{s1}} + {{s2}} + {{s3}}
167
+ expression: response.status == 200
168
+ expression: r0()
169
+ detail:
170
+ author: test
171
+ ` ` `
172
+ 发出的请求如下:
173
+ ` ` ` HTTP
174
+ POST / HTTP/1.1
175
+ Host: docs.xray.cool
176
+ Content-Length: 40
177
+ Content-Type: text/xml
178
+
179
+ hello world + hello world + hello world
180
+ ` ` `
181
+ 可以发现三种形式都能够正常输出字符串,但是如果只使用单引号或者双引号作为开头,将会引起加载错误,比如:
182
+ ` ` ` yaml
183
+ set:
184
+ s1: "hello world"
185
+ s2: 'hello world'
186
+ ` ` `
187
+ 使用这样的写法就将加载失败。
188
+
189
+ # # 三目运算符的使用方式
190
+
191
+ # ## 介绍
192
+
193
+ 在许多编程语言中,三目运算符(也称为条件运算符)是一种简洁的表达条件逻辑的方式。在 CEL(Common Expression Language)中,三目运算符也是一种常用的表达式,其语法如下:
194
+ ` ` ` yaml
195
+ 条件表达式 ? 表达式1 : 表达式2
196
+ ` ` `
197
+ 三目运算符的工作原理是,当条件表达式的结果为 true 时,整个表达式的值等于表达式1的值;当条件表达式的结果为 false 时,整个表达式的值等于表达式2的值。
198
+
199
+ 例如,在 CEL 表达式中,你可以这样使用三目运算符:
200
+ ` ` ` yaml
201
+ age >= 18 ? "Adult" : "Minor"
202
+ ` ` `
203
+ 在这个例子中,如果 age 大于或等于 18,表达式的值将为 "Adult",否则将为 "Minor"。这与以下的 if-else 语句相似:
204
+ ` ` ` go
205
+ if age >= 18 {
206
+ return "Adult"
207
+ } else {
208
+ return "Minor"
209
+ }
210
+ ` ` `
211
+
212
+ # ## 案例
213
+
214
+ <!-- tabs:start -->
215
+
216
+ # ### **mysql指纹匹配(截取)**
217
+
218
+ ` ` ` yaml
219
+ name: fingerprint-yaml-tcp-mysql
220
+ manual: false
221
+ transport: tcp
222
+ set:
223
+ GenericLines: b"\r\n\r\n "
224
+ payloads:
225
+ payloads:
226
+ l:
227
+ re: '"(?s)^.\\ 0\\ 0\\ 0\\ xffj\\ x04''[\\ d.]+'' .* MySQL"'
228
+ m:
229
+ re: '"(?s)^.\\ 0\\ 0\\ 0\\ x0a(?P<version>5\\ .[-_~.+:\\ w]+MariaDB-[-_~.+:\\ w]+~bionic)\\ 0"'
230
+ n:
231
+ re: '"(?s)^.\\ 0\\ 0\\ 0\\ x0a(?P<version>[\\ w._-]+)\\ 0............\\ 0\\ x5f\\ xd3\\ x2d\\ x02\\ 0\\ 0\\ 0\\ 0\\ 0\\ 0\\ 0\\ 0\\ 0\\ 0\\ 0\\ 0\\ 0\\ 0............\\ 0$"'
232
+ r:
233
+ re: '"(?s)^.\\ 0\\ 0\\ 0\\ x0a(?P<version>3\\ .[-_~.+\\ w]+)\\ 0...\\ 0"'
234
+ s:
235
+ re: '"(?s)^.\\ 0\\ 0\\ 0\\ x0a(?P<version>4\\ .[-_~.+\\ w]+)\\ 0"'
236
+ rules:
237
+ r1:
238
+ request:
239
+ cache: true
240
+ content: '{{GenericLines}}'
241
+ expression: re.bmatches(response.raw)
242
+ output:
243
+ result: re.bsubmatch(response.raw)
244
+ osname: |
245
+ re.contains("bionic") ? "Linux" : ""
246
+ version: result["version"]
247
+ expression: r1()
248
+ detail:
249
+ fingerprint:
250
+ infos:
251
+ - type: system_bin
252
+ name: mysql
253
+ version: '{{version}}'
254
+ - type: operating_system
255
+ name: '{{osname}}'
256
+ ` ` `
257
+
258
+ <!-- tabs:end -->
0 commit comments