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๋ฅผ ์ผ๋ถ ์๋ ์์ฑํด์ฃผ๋ ๋๊ตฌ๋ก ์ ํ์ฉํ๋ค๋ฉด ๋น ๋ฅด๊ฒ ์คํฌ๋ฆฝํธ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
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
- Zest + YAML = โค๏ธ
- Cross handling Cookies in Zest
- Zest script in CLI
- ZAP์์ Zest Script๋ก Headless ๊ธฐ๋ฐ์ ์ธ์ฆ ์๋ํ ์ฒ๋ฆฌํ๊ธฐ
- Zest์ ZAP! ๊ฐ๋ ฅํ ๋ณด์ ํ ์คํธ ๋ฃจํด์ ๋ง๋ค์ด๋ด์ โก๏ธ
- Zest์ ZAP์ ์ด์ฉํ Semi-Automated Security Testing