Zest

Introduction

Zest는 Mozilla 보안팀에서 만든 JSON/YAML 기반의 스크립팅 언어입니다. 현재는 ZAP Core에서 관리되고 있고 HTTP Request/Response, Headless Browser 그리고 Test에 사용되는 Assertion 등을 이용해서 동작을 정의하고, 이를 순차적으로 실행하며 테스트할 수 있습니다.

Format

JSON

{
  "about": "Zest에 대한 설명",
  "zestVersion": "0.8",
  "title": "스크립트 이름",
  "description": "스크립트 설명",
  "prefix": "https://www.hahwul.com",
  "type": "StandAlone",
  "parameters": {
    "tokenStart": "{{",
    "tokenEnd": "}}",
    "tokens": {},
    "elementType": "ZestVariables"
  },
  "statements": [],
  "authentication": [],
  "index": 0,
  "enabled": true,
  "elementType": "ZestScript"
}

YAML

about: Zest에 대한 설명
zestVersion: '0.8'
title: 스크립트 이름
description: 스크립트 설명
prefix: 'https://www.hahwul.com'
type: StandAlone
parameters:
  tokenStart: '{{'
  tokenEnd: '}}'
  tokens: {}
  elementType: ZestVariables
statements: []
authentication: []
index: 0
enabled: true
elementType: ZestScript

🚀 Interfaces

ZAP GUI

Zest는 ZAP 내부 Scripting engine으로 사용되며 ZAP 내부에서 GUI를 통해 스크립트를 작성하고 사용할 수도 있습니다.

Zest CLI

Zest는 기본적으로 ZAP의 라이브러리로 동작하지만, CLI 인터페이스도 가지고 있습니다. 별도로 빌드해서 사용이 가능하며 zest-env 이미지를 이용해서 Docker, Github action 등을 통해 사용하실 수 있습니다. 자세한 내용은 아래 “Zest in CLI” 글을 참고해주세요.

https://github.com/hahwul/zest-env

docker pull hahwul/zest-env:v1.0.0
docker run hahwul/zest-env:v1.0.0 zest -script <YOUR-ZEST-SCRIPT>

⌨️ How to Write

ZAP Script Console

ZAP 내부의 Scripts tab, Scripts Console tab을 통해 GUI, CLI로 코드를 작성할 수 있습니다.

ZAP Zest Record

ZAP 내부에는 Zest Record란 기능이 있습니다. Record 시점 이후부터 발생한 웹 요청을 기록하면서 Zest script를 일부 자동 작성해주는 도구로 잘 활용한다면 빠르게 스크립트를 구성할 수 있습니다.

https://user-images.githubusercontent.com/13212227/148578438-36f6b97d-3ff9-4c15-a4e4-aaa19c92a2a5.jpg

TextEditor & IDE

JSON/YAML 기반이기 때문에 직접 Zest script를 작성할 수 있습니다. 다만 JSON 자체가 수정에 용이하지 않은 포맷이다 보니 GUI 코드 작성이 더 좋다곤 생각합니다. (2023년 9월에 YAML 포맷이 추가되어서 JSON보단 조금 더 편한 작성을 지원하게 되었습니다.)

🧬 Structure

Statements

Zest는 statements란 값을 기반으로 동작합니다. 이 값은 실제 처리할 액션이 담기는 값으로 Array 형태를 띕니다. Zest를 실행하면 이 Array를 순차적으로 실행하며 웹 요청을 발생하고 Action, Assertions, Contidion, Assignment에 따라서 로직을 처리하고 결과를 보여줍니다.

Condition (ifStatements)

Zest 내부에서 분기(If)를 위해선 Condition을 사용하여 분기 처리를 구현할 수 있습니다.

Assertions

Assertion은 검증을 위한 기능입니다. 유닛 테스와 같은 테스트 코드들에서 Assertion 처리하는 것과 동일한 개념입니다. 우리가 지정한 룰 이외의 결과가 있다면 이를 표현해줘서 쉽게 알 수 있도록 제공해줍니다.

Action

Action은 실행할 동작을 지정합니다. 해당 부분에는 Sleep, 변수 값 세팅 등이 있고 Scan 관련 부분은 ZAP과의 의존성이 있습니다.

Assignment

Assignment은 변수를 컨트롤하는 기능입니다. 이를 이용하여 난수를 생성, 특정 값을 계산 등 작업을 처리할 수 있고 이를 form이나 attribute 등 Zest 내부에서 값을 불러와 사용할 수 있습니다.

변수는 내부에서 {{ 변수명 }}으로 불러와서 사용할 수 있습니다.

Loop

Zest가 테스트를 목적으로 순차 실행을 하는 언어이기 때문에 반복문 구성이 어려울 것 같지만 Loop를 통해 반복문을 구성할 수 있습니다. 다만 실제로 복잡한 형태의 반복문 구성을 위해선 위 Assignment와 같이 사용해야하기 때문에 이러한 부분은 Ruby나 Python 등 일반적인 스크립트 언어가 좋을 것 같습니다.

Tools

Articles

References