-
Notifications
You must be signed in to change notification settings - Fork 5
Language documentation
This section of the documentation explains how the mig-t language used to define the tests works. It is based on JSON, and feautres different components.
A test suite contains a list of tests, it is defined by:
name
description
-
tests
The list of all the tests -
message filtering
(optional) default true, set it to false if you don't want the messages to be filtered while recording them for passive tests. The filter discards images, fonts, and other unwanted messages.
A test is defined by:
name
description
-
type
can be eitheractive
orpassive
-
sessions
which is a list of session names. Both for active and passive tests is required to give at least one session as input -
operations
contains a list of operations to be done on this test -
result
only for active tests, it specify when a test should be considered successfully accomplished -
references
used to specify infos about the reference of the specified test -
violated_properties
used to specify infos about the violated properties of the test -
mitigations
used to specify infos about the possible mitigations of the test
An operation can be either a message interception or a session operation. The most basic and useful type of operation is message interception, which allows you to intercept messages and then edit them. To do this, you simply need to specify the message type and the required tags
The message type tag specifies the message to which the given operation should be applied. Message types can be defined in the msg_def.json file, which is created in the Burp folder at the first execution of the plugin. By default, some OAuth message types are present, but you can add or modify them as needed.
A message type is defined by a set of checks. These checks are evaluated against a message, and if all of the checks pass, then the message is processed by the operation.
To define a message type you have to tell:
- The
name
-
is request
if the message is a request or not (true, false) -
response name
(optional) if you want to also associate a name to the response of that message (often useful when you know how a request is, but not the response) -
request name
(optional) if you need to intercept a message by its response, but you want to access the request, just put the name of the request to use it in the language. Note that if you intercept the response, you can not edit the request anymore, because it has already been sent. -
checks
list (see check section for details)
An operation can be used with these tags:
-
message type
which specifies a message type -
action
The action to be done on this operation, can beintercept
orclear cookies
-
from session
specify which session has to be sniffed to search for the message, default is the standard session -
then
the action to be done on the intercepted message after the execution of the operation,forward
ordrop
(default forward) -
save
saves the intercepted message to the given variable name -
preconditions
dependig on their result theMessage operations
are executed or not. If a precondition fails, the entire test is considered not supported. The preconditions are defined as a list ofcheck
elements -
message operations
List ofmessage operation
to do on the message. See the proper section for details -
replace request
used with the name of a variable containing a message. It replaces the request of the intercepted message with a saved message. -
replace response
used with the name of a variable containing a message. It replaces the response of the intercepted message with a saved message. -
checks
: which is a list ofcheck
. To consider an operation successful all the checks has to be evaluated to true.
The execution of the operations differs depending on the type of test:
- active tests: The operations are executed sequentially one after the other. This means that until an operation has not been finished (i.e. the message is not arrived yet) the next operation will not be available
- passive tests: All the operation are executed over all the messages passed trough the proxy
There is the possibility to handle different sessions in an active test, for example to replay messages.
The sessions have to be defined in the sessions
tag inside a Test
, then, each session can be started or stopped with an operation having:
- tag
session
associated with the name of which session is reffering to, - tag
action
the action to do on that session, like start, stop, clear cookies, pause, resume
Each session uses a different port on the proxy, this is done to differentiate the messages inside the proxy. Burp has to be manually configured to open more proxy ports based on the number of contemporary sessions to be executed. To do so, go to the proxy tab in burp, options, and then add enough port for your sessions. You have also to link each of your sessions to a port, to do so, go to the plugin, after you read your JSON input test suite, in the session config tab write the ports you have previously defined. Note that the port has to be different for each contemporary session, otherwise the tests will not work.
A message is divided in three parts
-
url
only for requests, is the message whithout head and without body -
head
contains all the message except the body -
body
is the message without head
Warning! Message Operations are deprecated. Please, use Edit Operation when defining new tests to edit messages.
The message operations are operations to be done on the intercepted message in an operation.
The syntax contains always the from
tag, which specifies the message section where to search to do the given action (url, body, head). Then we have the possible actions:
-
remove match word
it removes the matched string, can be fed with a regex -
remove parameter
with value the name of the parameter to be removed. A variant of the previous, it removes the parameter searched with its value -
edit
edits the given parameter's value, the tagin
specifies in what has to be edited -
edit regex
edits the content matched by the passed regex with the content specified inin
tag. -
save
it saves the given parameter's value, in a variable with name taken fromas
tag. -
save match
is saves the matched string in a variable with name taken fromas
tag -
add
add a header with the name specified, and with value specified withthis
. -
url decode
can be set tofalse
in order to disable url decoding of URL query parameters. Works only with save at the moment.
An example could be:
Edit the parameter state inside the url of a message with the new value "newstatecode"
"message operations": [
{
"from": "url",
"edit": "state",
"in": "newstatecode"
}
]
or to save could be,
"message operations": [
{
"from": "head",
"save": "code",
"as": "myVariable"
}
]
If you choose the body section, the meaning of the tags is different, infact:
-
remove match word
is equal toremove parameter
, the value of these tags is treated as a regex which matches the entire body, all the matches are removed. -
edit
is associated with a regex, substituting everything that matches that regex with the value of thein
tag -
save
is associated with a regex, it saves what is matched by that regex, saving it in a variable with name specified inas
tag -
add
has an empty string as value. The actual string to be appended has to be specified with tag 'value'. The string will be appended to the body.
Note that the content lenght of the body section is automatically updated or removed if the content of the body is edited.
The edit operation can be used to modify the content of a message, a jwt, or other sources.
By using an Edit Operation inside an Operation, you are able to edit the intercepted message content. There are multiple ways of editing it, in the following section they will be described. You can use the following tags:
-
from
to select the section of the message you need -
edit
to edit the value of the given parameter. (only for url and head sections) usevalue
to specify the new value. -
edit regex
to edit with a regex the section of the message you selected. usevalue
to specify the new value -
add
to add some content to the given section. in case of url and head, you need to specify the name of the parameter in this tag, and the value withvalue
. If the parameter is not found, a new parameter is added, if the parameter is already present, the new value will be appended to the old one. For the body section, the content will be always appended to the end of the body, so you can leave this tag value empty and put the content to append in thevalue
tag. -
encode
used to encode the given content. The value should be what to decode, for urll and head is a parameter and for body is a regex. -
encodings
when you useencode
you should provide a list of encodings to be used to encode the selected value. The supported encodings are the same for the decode operation, and can be found here -
remove
used to specify the name of a parameter to remove in url and head. Not available on body. -
value
used to specify the new value for the edit operations -
use
used in place ofvalue
to use the given variable value as new value. You should give a variable name to this tag.
Note: the url section is the entire request url such as "https://domain.com:port/path?query=something"
Note: if you use edit regex in the head, the regex is executed over all the headers
Note: Save from message is not possible in edit, is should be done in message operations
example:
"edit operations": [
{
"from": "url",
"edit": "client_id",
"value": "fakeclientid"
}
]
It is possible to edit the decoded content of decode Ops by using edit Operations. A list of edit Operations has to be specified. When using Edit Op. inside Decode Operations, depending on the type
specified in Decode Operations, you can use different keys.
-
type
: JWT-
jwt from
specifies the section of the jwt to edit (header, payload, signature) -
jwt edit
JSON path of the key to edit -
jwt remove
JSON path of the key to remove -
jwt add
JSON path pointing to the position where add the new key + 'key' with the name of the key andvalue
with the value. Note that avoiding thevalue
or lefting its value empty will make the added key value havenull
value. -
jwt save
JSON path to the key to save. Note that you can only save values that are strings or JSON Arrays. Integers and Double will be converted to String. -
value
used with edit or add, to specify the value of the key
-
-
type
: XML- see next XML section
- no
type
specified, (treated as plain text):- Using
txt remove
the matched text will be removed from the text - Using
txt edit
the matched text will be edited with the text specified invalue
tag - Using
txt add
the text specified invalue
will be inserted at the end of the matched text - Using
txt save
the matched text will be saved in a variable having the name specified in tagas
- Using
This type is used to edit decoded JWT tokens. This way is possible to edit, add, save or resign them. The possible actions are:
-
jwt from
Used to specify the section of the token to execute the given action, choose btween:header
payload
signature
-
jwt remove
If used on signature removes the entire signature -
jwt edit
value
If used on signature edits the entire signature. -
jwt add
value
-
jwt save
as
if used on sinature saves the entire signature -
jwt sign
Specifying a PEM-encoded private key that will be used to sign the jwt
When signing a jwt, the supported algorithms are:
- RS256
- RS512
Edit the scope claim inside an OAuth request jwt
"decode operations": [
{
"from": "url",
"type": "jwt",
"encodings": [],
"decode param": "(?<=authz_request_object=)[^$\n& ]*",
"edits": [
{
"jwt from": "payload",
"jwt edit": "$.scope",
"value": "wrong_scope"
}
]
}
]
Check the scope claim inside an OAuth request jwt
"decode operations": [
{
"from": "body",
"decode param": "(?<=authz_request_object=)[^$\n& ]*",
"encodings": [],
"type": "jwt",
"checks": [
{
"in": "payload",
"check": "$.scope",
"is": "openid"
}
]
}
]
The available XML actions are:
- Remove tag
- use
remove tag
with the tag name
- use
- Remove tag's attribute,
- use
remove attribute
with the attribute name - the name of the tag which contains the attribute has also to be specified using
xml tag
- use
- Edit tag value
- use
edit tag
with the tag name - use
value
to specify the new value
- use
- Edit attribute value
- use
edit attribute
with the attriute name - the name of the tag containing the attribute has also to be specified using
xml tag
- use
- Add tag
- use
add tag
with the name of the tag to add - use
value
with the value of the tag to add - the name of the parent xml node to add the new node has to be specified with
xml tag
- use
- Add attribute
- use
add attribute
with the attribute name - use
value
with the attribute value - the name of the tag to insert the new attribute into has to be specified with
xml tag
- use
- Save tag value
- use
save tag
with the tag name
- use
- Save attribute value
- use
save attribute
with the attribute name - the name of the tag containing the attribute has also to be specified with
xml tag
- use
Note on the occurencies: If there are more elements that has the same tag name, you can use the tag occurrency
specifying the index of the occurrency you want to edit, for example, if you have three tags named "person", but you want just to edit the third occurrency of that "person" tag, then you need to put three
Note on the namespace: the tag name comprehend the namespace i.e. if the tag you want to select is this:
<Something:apple></Something:apple>
in the tag name you have to specify "Something:apple"
It is a type used to edit, remove, add, or save pieces of a decoded content that is treated as a text. You have to specify a regex using one of the following tags with the associated action, the possible usages are:
- Using
txt remove
the matched text will be removed from the text - Using
txt edit
the matched text will be edited with the text specified invalue
tag - Using
txt add
the text specified invalue
will be inserted at the end of the matched text - Using
txt save
the matched text will be saved in a variable having the name specified in tagas
It is possible to use the tag use
instead of the tag value
to use the text saved in the variable specified using the use
tag.
There's the possibility to remove the signature from a saml request or response and resign it with a test private key, just specify self-sign
: true in the message operation.## Decode operation
Another possibility is just to remove the signature, using remove signature
set to true in the message operation.
Note that these keys are avaiable and applied only on decoded parameters, also if decode param
is defined.
A list of decode operations can be added to each Operation (passive or active). These operations are used to decode encoded content taken from inside an intercepted message. A decode operation can have its own list of decode operations; these are called recursive decode ops. and they take as input the previously decoded content.
The HTTP parameter containing the content to be decoded has to be specified with the decode param
If the section of the message is 'body,' the decode param
takes a regex (for more information, see the section below).
Next, a list of encodings (or the type
) has to be specified. You can specify an encodings list with the tag encodings
the order of these encodings will be followed while decoding, and when the message is re-encoded, the order will be reversed. With the tag type
the content is decoded following a fixed set of rules (e.g., jwts or XML). If you specify the type
tag, the encodings
tag will be ignored. If you use the type
tag when using Edit Operations, you may be allowed to use more tags (e.g., with jwts or XML) to edit easily; otherwise, the decoded content will be used as plain text.
In decode operations is possible to use check operations to check the decoded content, depending on the specified type, the allowed check operations differ.
- JWT type -> See 'Checks on JSON content' section
- No type (encodings used) -> See check section
Needed tags:
-
type
and/orencodings
-
decode param
ordecode regex
-
from
select from where decode the content (HTTP message section or previous decode output)
optional tags:
decode operations
checks
edits
An important note about the body (from) section is that the input of decode param
has to be a regex, and whatever is matched with that regex is decoded.
An useful regex to match a parameter's value could be (?<=SAMLResponse=)[^$\n& ]*
which searches the SAMLResponse= string in the body, and matches everything that is not $ or \n or & or whitespace
When decoding a jwt (by using tag type=jwt) it is possible to check the signature of that jwt by providing a public key. To do this, use the jwt check sig
tag with value the PEM-encoded public key to be used to check.
Note: The supported algorithms for signing are:
- RS256
- RS512
To decrypt a JWE to access the JWT in its payload use these tags
-
jwe decrypt
with the private key in PEM string format -
jwe encrypt
with the public key in PEM string format
Note: You can decrypt without specifying encrypt, this will prevent the JWE from being edited (as no encryption key is passed)
Note: You can't encrypt, without decrypt
Note: When decrypting a JWE, if you then access the jwt header, or jwt payload, you are accessing the ones of the JWE. If the JWE contains a JWT in his payload (nested JWT) then you will have to first decrypt the JWE, and then do another decode operation to decode the nested JWT, by selecting the payload of the JWE with a regex.
Note: Supported algorithms are:
- RSA_OAEP
- RSA_OAEP_256
- ECDH_ES_A128KW
- ECDH_ES_A256KW
In this table you can find a description of all the tags available for this Operation based on the input Module.
input module (container) | Available tags | Required | value type | allowed values |
---|---|---|---|---|
standard Operation | from | yes | str | head, body, url |
decode param or decode regex | yes | str or str(regex) | * | |
decode Operation (type=jwt) | from | yes | str | jwt header, jwt payload, jwt signature |
decode param | yes | str(JSON path) | * | |
decode param or decode regex | yes | str(JSON path) or str(regex) | * | |
* | type | str | xml, jwt | |
encodings | list[str] | base64, url, .. | ||
decode operations | list[decode Operation] | * | ||
checks | list[check Operation] | * | ||
edits | list[edit Operation] | * | ||
jwt check sig | str(PEM) | PEM-encoded public key | ||
jwe decrypt | str(PEM) | PEM-encoded private key | ||
jwe encrypt | str(PEM) | PEM-encoded public key |
When using the from
tag in a recursive decode (one that is inside another), you can use - depending on the previous decode type - other sections, such as "jwt header" "jwt payload" ..
Source: standard Operation (HTTP intercepted message)
-
from
: (url, head, body)
Source: decode Operation JWT
-
from
: (jwt header, jwt payload, jwt signature)
in recurdsive decode op, the decode param accepts different inputs, e.g. if previous decoded content is a jwt, decoded content will accept a JSON path
Syntax example of a recursive decode operation:
"decode operations": [
{
...,
"decode operations": [
{
"from": "somwhere in the previous decode",
"encodings": "asdasd",
}
]
}
]
Example of decoding a jwt from the url of a message in the asd parameter, and then decode the jwt found inside of the jwt.
"decode operations": [
{
"from": "url",
"type": "jwt",
"decode param": "asd",
"decode operations": [
{
"from": "jwt header",
"type": "jwt",
"decode param": "$.something"
}
]
}
]
Example of decoding a value in the url with a regex
{
"from": "url",
"decode regex": "(?<=request=)([^&]+)",
"type": "jwt",
"edits": [
{
"jwt from": "payload",
"jwt edit": "iss",
"value": "https://www.example.com/"
}
]
}
Session operations are used to edit the session tracks given the actual test progress. Each session operation is composed by:
-
session
specifies wich session to do changes -
save
, associated with tagas
to specify the name of the variable. Available actions to be saved are:last_action
last_open
last_url
last_click
-
track
used to specify actions in the track to be saved as variable to be then used in an insert. Associated with tagrange
containing the from an to markers to specify the actions to be saved. For example "range: "[M0,ML]" or "(MO,ML]"
-
insert
it is possible to build a string composed by the variables previously saved like this: "sometext that is appended in the track with$variable_to_add$ ", it has to be specified also the tagat
with a marker, to say where to put the inserted action. Default markers are M0 (start of the track), ML (end of the track). -
remove
removes an action at the specified marker
Note that in save
each element can be accessed trough .elem
, otherwise the entire session action is considered. There is also the possibility of adding .parent
to get the parent div element.
Note that during insertion, the element inserted is always positioned after the given marker.
{
"session": "s2",
"action": "start",
"session operation": [
{
"session": "s2",
"insert top": "cosescritte e $variabile$"
}
]
}
"session operation": [
{
"session": "s1",
"save" : "last_action.elem",
"as" : "elem"
},
{
"session": "s1",
"save" : "last_url",
"as" : "url"
},
{
"session" : "s1",
"insert" : "open | $url$",
"at" : "ML" // marker last
},
{
"session" : "s1",
"insert" : "snapshot | $elem$",
"at" : "ML" // marker last
},
{
"session" : "s1",
"mark" : "last_click",
"name" : "M1"
},
{
"session": "s1",
"save" : "",
"from" : "M0", // marker zero, first action in track
"to" : "M1",
"as" : "qualcosa"
}
]
The Checks tag inside an operation has a list of Check elements, which can be defined with:
-
in
says were to check the given parameter, can be head, body, url -
check
checks if the given string is present in the specified message section. -
check param
specifies the name of the parameter to be checked, depending on the section choosed, the tool will search for the parameter using a pattern. (for the url, it will search for a query parameter, for the head, it will search for a head parameter) -
check regex
specify a regex that checks the selected content by matching it. .use variable
(true or false) set to true if you want to specify a variable name on the following tags, to check wrt to that variable value. -
url decode
if you want to disable url decoding in http messages, see the note below for details. - The actual check on the value. (if none of these are specified, the check will only check if the given parameter is present)
is
not is
contains
not contains
-
is present
specifying true or false, to check whether is present or not -
is in
the value is between a list of values. Ifuse variable
is used, you have to specify the name of the variable to use in the value of this tag. -
is not in
the value is not between a list of values. Ifuse variable
is used, you have to specify the name of the variable to use in the value of this tag. -
is subset of
used to check that a matched JSON array is a subset of the given array. Is subset means that all the values in the matched array are present in the given array. Ifuse variable
is used, you have to specify the name of the variable to use in the value of this tag. -
matches regex
when usingcheck param
orcheck
in json, you can use this tag to execute a regex to the matched value of the parameter or the value of the json key specified with the jsonpath -
not matches regex
asmatch regex
but the result is true when the regex doesn't match -
json schema compliant
to pass a json schema to be validated against what you match withcheck
. Can only be used in jwt checks. Make sure to match the json schema with what you are selecting with the json PATH withcheck
. For more info see this section
Note that you can use
check regex
ORcheck
ORcheck param
.
Note that
check
accepts only theis present
tag.
Note that by default, all the values read from a message are URL-decoded before the checks are executed. You can disable this behaviour by using
url decode
= false. You should disable url-decoding when you are checking values that contains "+" characters, that would be converted to spaces.
In passive tests the checks's result are intended as the entire test result, so all the checks has to pass to have a successfull test.
In case a check operation is executed inside an operation that gives a JSON as an output (e.g. decode operations with type=jwt), the check operation is enabled to use JSON paths to identify keys and values specified with check
tag. The in
tag specifies the section of the JWT (header, payload, signature). Note that signature is treated as plain text.
Note: when using check regex
with json content, the specified content will be treated as plain text. e.g the header of a jwt will be treated as plain text, and the regex will be executed over the entire header.
Note: matched array contents will always be converted to string for simplicity. This means that if you want to check an integer or float, you should write it as a string (e.g. 12.3 -> "12.3")
Note: Json paths have a lot of operands to select elements, for more info check this guide
"decode operations": [
{
"tagsofadecode": "decodejwt",
"checks": [
{
"in": "header",
"check": "jsonpath",
"is": "something"
}
]
}
]
When using JSON schema, you should select which part of your JSON you want to execute the JSON schema validation against. To select all the JSON just use "check": "$.".
Warning: you shouldn't select leaf keys in the json that have a non-json content (string, integer, array, ...). This is because, a JSON content is expected to be checked by the JSON schema, so you should always select a non-leaf key or the entire json, by writing an appropriate JSON schema to check the specific key.
For example, having this json:
{
"one": "value",
"two" : {
"three": "value"
}
}
If you want to validate the value of the key one
you should select all the json, as the key is a leaf. By doing:
"checks": [
{
"check": "$.",
"json schema compliant": "{\"properties\": {\"one\": {\"type\": \"string\"}}}"
}
]
The json schema correctly indented is:
{
"properties": {
"one": {
"type": "string"
}
}
}
The same holds for the key three
, which is also a leaf. But this time you can select the two
key.
"checks": [
{
"check": "$.two",
"json schema compliant": "{\"three\": {\"type\": \"string\"}}"
}
]
or just doing from the root like before
"checks": [
{
"check": "$.",
"json schema compliant": "{\"properties\": {\"two\": {\"properties\": {\"three\" : {\"type\": \"string\"}}}}}"
}
]
the json schema correctly indented:
{
"properties": {
"two": {
"properties": {
"three" : {
"type": "string"
}
}
}
}
}
When checking the value of json keys, you have to consider the type of the value.
- mig-t will convert each int or float type as string, this means that when using the check operators, you should always use a string, not an int or a double.
- checking a value that is a JSON Array is only allowed when using the
contains
ornot contains
oris subset of
operators - When matching a JSON Array, the values of the array are all converted to string
If you need to do a check on an active test, you have to do a validate
operation, which is basically an operation where you can do checks
Check using a variable value: check that the value of the header "Host" is equal to the value of the variable "var1"
"checks" : [
{
"in": "head",
"check param": "Host",
"use variable": true,
"is": "var1"
}
]
Preconditions are used in an operation of an active test to check something in the intercepted message before the execution of the rest of the operation. If the preconditions are evaluated to false, the test is considered unsupported, not failed. The preconditions are basically a list of checks. To use a precondition just write
"preconditions" : []
filling the list wit the checks you need.
Note: Over the list of check or regex a AND operation is made, so all of the checks (or regex) in the list has to be successful to continue the test.
Content of different type can be saved and then used by using this tag. It can be used both in an operation, to save a message, in a Message Operation to save the value of a found parameter and also inside Edit operations. The tag to use is:
-
save
associated with the name of the variable
There are more ways of using the value of a variable, depending of its type:
- Using a message-type variable: it can be used in an operation with the tag
action
set to intercept there is the possibility of usereplace request
(orreplace response
) with the name of the variable. This way the intercepted message's request (or response) is replaced with the specified variable value. Note that when a message is replaced, all the message operations in that operation will be ignored. - Using a string-type variable: can be used in Message Operations or Edit Operations, where you have to add or edit a parameter's value, writing
use
and the name of the variable
When saving and using variables, take care to assign a variable before its use - Using a JSON Array type variable: you can save a JSON array into a variable, for example by using an Edit Operation inside a Decode Operation that decoded a JWT. Then you can use the saved JSON Array in checks.
Note that when saving a variable, if the value is empty (no match or no parameter found), the MessageOperation (edit, add, ..) where the variable is used will not be executed, the execution will continue without errors.
The result tag is used in active tests to specify the oracle to be used to verify the execution of the session.
it can be set to:
-
correct flow [sessionname]
the test succedes only if all the user actions specified in the session "sessionname" track are executed correctly. -
incorrect flow [sessionname]
opposite ofcorrect flow
, the test succedes only if there is an error in the execution of the session. This can be due to:- the session was not executed entirely, i.e. an unexpected page is displayed and mig-t tries to click a button that is not present
- asserts in the track definition fails
-
assert_only
the test result ignores the validation of the session flow but gives a result depending on the assertions defined in the track. This means, that if the execution of the session fails, this will not change the result of the test.
The result can be combined with the result of the checks in an operation. The succes is evaluated witmh the Boolean operator AND between the result and all the results of the operations
Note that if correct (or incorrect) flow is used without specifying a session name, all the sessions are checked.
Note for the definition of the track: to have a successfull oracle we suggest to define a track that not only does the login of the user, but also performs some actions on the final page, this way the result of the track is more complete. (i.e. if we just tell to login, the track will not try to act on the logged page, this way the plugin has no clue on if the final page contains an error or not)
A test can have one of three different results, that are:
- passed: based on the test description and objectives, the test execution was successful and the verified content met the pre-defined conditions.
- failed: based on the test description and objectives, the test execution was successful but the verified content didn't met the pre-defined conditions.
- not applicable: it was not possible to execute the test, the result cannot be determined with ceirtainty. In this case, it is not possible to know if the test failed because of external causes or due to the test itself, possible causes are:
- wrong test definition (i.e. tried to sign a jwt but provided an invalid key)
- unexpected error in mig-t during execution (check debug tab in mig-t)
- a message that the test needed to intercept was not found
Note that "successful execution" in failed test, doesn't mean that the test was executed entirely, it means that what was executed upon the point that made the test fail, was executed successfully.
Note that if you are filling a field where a regex is expected, you have to backslash () all the regex operators such as (?{}.*) if you need them to be searched instead of executed.
The session track is a list of actions that the browser will do to simulate an user. The session track is defined in a custom language that extends the one defined by Katalon-Recorder sample plugin they call it "sample for new formatters".
Basically, each User Action in the session track is an action to be done on the browser such as a click, type a string, or open an url. The available actions are:
-
open
Opens the given url -
click
Clicks on the specified HTML element -
type
Type on the specified HTML element the specified text
The syntax is as follows
<action> | <elem> | <content>
Note that the < >
should not be included, and the spaces are not mandatory.
Note: the correct execution of the track can influence the result of the test. More details in the result section
An html element can be identified by:
- A link: searches in all hrefs the given link, i.e.
link=/go/somewhere
- Its ID: searches in the page an element that has the given ID, i.e.
id=someid
- Its xpath: searches in the page an element by its xpath
open | https://webpage.it/ |
click | link=login |
type | id=username | [email protected]
type | id=password | mail_password
click | link=login |
click | xpath=/html/body/div/button/ |
wait
command, that is used to tell the browser to wait n millisecond before executing the next action. Example usage as follows:
wait | 3000
clear cookies
command, which will clear all the cookies in the current session, usage:
clear cookies |
The session can include the asserts, the asserts are a way to validate that the session flow is going how it is supposed to go. If the asserts fail, the result of the test becomes failed.
The possible asserts to be used are:
-
assert clickable
Make sure that an html object is clickable -
assert not clickable
Make sure that an html object is not clickable -
assert visible
Make sure that an html object is visible -
assert not visible
Make sure that an html object is not visible -
assert element content is
Make sure that the content of the specified element is as specified in<content>
-
assert element content has
Make sure that the element content of the specified element contains the string specified in<content>
-
assert element class is
Make sure the class of the element is as specified in the<content>
-
assert element class has
Make sure one of the classes of the html element contains the string specified in the<content>
-
assert element has attribute
Make sure one of the attributes of the element is as specified in<content>
-
assert element not has attribute
Make sure the element doesn't have the attribute specified in<content>
Syntax is as follows:
<assert> | <elem> | <content>
Examples:
assert clickable | xpath=/body/.. |
assert not visible | id="elem" |
assert element content is | xpath=/body/div/label | text to match
assert element class has | xpath=/body/... | class_to_match
- Added decode operations
- Removed "decode parameter" from Message Operation
- Added checks in decode operations
- Added support for Checks to work with JSON content
- Changed tag
encoding
inencodings
- Added edit Operation
- Moved tags used to modify decoded content in Message Operations to Edit Operation inside Decode Operation
- Removed
raw header
raw payload
raw signature
fromjwt from
tag in Decode Operation - Added supprot of regex in checks (in future they will substitute existing regex)
- Remove support for hardcoded standard message types such as oauth request and oauth response
- Removed support for hardcoded identification of OAuth flow
- removed
request
,response
,oauth request
oauth response
from Message type - removed
regex
andmessage section
tag from Message Type, now only checks are available (that contains also regex) - removed
regex
from Operation in passive tests - Removed validate Operation, now just use checks inside an intercept Operation
- Removed OAuth metadata tag in test
- Added signing of decoded jwt with private key inside Edit Operation
- Added check of signature of jwt inside the decode operation
- Added edit operation also in Operations: message editing
- Added encode option to edit operation
- Removed "remove match word" from edit operation, just use edit regex with empty substitution
- Added decode regex in Decode Operations
- Added json schema validation in checks for jwts
- Added possibility of saving JSON Arrays to Variables in Edit Operations
- Added possibility of using saved JSON Arrays in Checks with Array tags (is in, is subset of, ..)