概要
ZAPのAPI(UI)を使用してブラウザ操作でAPI用URLを作成する。
その後、curlでURLを使ってZAPからWebサーバに向けて スパイダーを実施し結果reportの確認を行えることを確認できた。
また、他のCLIベースやbaselineなどで実施したときには設定できなかった設定(本来は設定可能で単に設定方法を知らないだけかも)をコンテキストに追加し設定できた。
構成
ZAPのAPIによる操作
ApiDetails · zaproxy/zaproxy Wiki · GitHub
HelpStartConceptsApi · zaproxy/zap-core-help Wiki · GitHub
上記を参考にして、URLformatにしたがってAPIが使用できるのかを確認する。
【フォーマット】
http(s)://xxx.xxx.xxx.xx:0000/UI/<format>/<Components>/<operation>/<name>/?[parameter]
(例)ZAPバージョン取得
http://192.168.20.165:8080/JSON/core/view/version/?zapapiformat=JSON&formMethod=GET
■設定値
format:JSON
Components:core
operation:view
name:version
parameter:zapapiformat=JSON&formMethod=GET
■実施画面
(例)SCAN実施後アラート情報
■設定値
format:HTML
Components:core
operation:view
name:alertsSummary
parameter:zapapiformat=HTML&formMethod=GET&baseurl=http://192.168.20.161
■実施画面
スパイダー実施用API作成
ZAPの起動
ZAP(コンテン)を起動させる。(接続ポート:8080)
docker run -v $(pwd)/out:/zap/wrk/:rw -u root -d -p 8080:8080 \
-i owasp/zap2docker-stable zap.sh \
-daemon -host 0.0.0.0 -port 8080 \
-config api.disablekey=true \
-config api.addrs.addr.name=.* \
-config api.addrs.addr.regex=true
APIキーを無効:-config api.disablekey = true
任意のIPからAPIへのアクセスを許可:-config api.addrs.addr.name=.* -config api.addrs.addr.regex=true
接続ポート:8080
クライアントからブラウザでAPI(UI)にアクセス
http://192.168.20.165:8080でAPI(UI)画面に接続できる。
API用URLの取得
"Local API"からリンクをたどり、Componentsとoperationを選択し設定/確認画面を開く
(例)SCAN実施後アラート情報取得のための設定画面
Component: core を選択し、operatoinは view の alertsSummary を選択し設定画面を開いてみた。
アラートのサマリ情報表示画面(HTMLフォーマット)が表示されたことが分かる。
※この画面のURLのアドレスフィールドにはAPI用URLが表示されるので、このURLを直接入力することでも結果の表示が可能となる。
アラートのサマリ情報表示をJSONフォーマットで表示した場合
また、このときのJSON形式で表示させたURLを、curlコマンドで直接入力すると情報が取得できることが分かる。
■curlコマンドでの取得結果
# curl "http://192.168.20.165:8080/JSON/core/view/alertsSummary/?zapapiformat=HTML&formMethod=GET&baseurl=http%3A%2F%2F192.168.20.161"
{"High":0,"Low":97,"Medium":23,"Informational":0}
ブラウザ操作時と同じ値が取得できる
Spider実施用URL作成
モード指定
テストモード設定(protect)
mode:protect これでプロテクトモードで起動できる??
http://192.168.20.165:8080/JSON/core/action/setMode/?zapapiformat=JSON&formMethod=GET&mode=protect
context
Context作成
contextName:WebScanContext
http://192.168.20.165:8080/JSON/context/action/newContext/?zapapiformat=JSON&formMethod=GET&contextName=WebScanContext
SCAN対象URLをContextに追加
regex:http://192.168.20.161.*
http://192.168.20.165:8080/JSON/context/action/includeInContext/?zapapiformat=JSON&formMethod=GET&contextName=WebScanContext®ex=http%3A%2F%2F192.168.20.161.*
Contextの確認
http://192.168.20.165:8080/JSON/context/view/context/?zapapiformat=JSON&formMethod=GET&contextName=WebScanContext
spider用設定
(option設定)継続時間設定
http://192.168.20.165:8080/JSON/spider/action/setOptionMaxDuration/?zapapiformat=JSON&formMethod=GET&Integer=10
(option設定)クロールの深度設定
http://192.168.20.165:8080/JSON/spider/action/setOptionMaxDepth/?zapapiformat=JSON&formMethod=GET&Integer=5
※ZAPツール上での設定個所
(option設定)RobotsTxt設定
初期値は未確認
http://192.168.20.165:8080/JSON/spider/action/setOptionParseRobotsTxt/?zapapiformat=JSON&formMethod=GET&Boolean=true
(option設定)SitemapXml設定
初期値は未確認
http://192.168.20.165:8080/JSON/spider/action/setOptionParseSitemapXml/?zapapiformat=JSON&formMethod=GET&Boolean=true
APIでのspiderを実施
http://192.168.20.165:8080/JSON/spider/action/scan/?zapapiformat=JSON&formMethod=GET&url=http%3A%2F%2F192.168.20.161&maxChildren=&recurse=&contextName=WebScanContext&subtreeOnly=
実施状況確認
■ステータス
(IDや進捗が見れる)※表示例の”100”の個所が進捗となる
http://192.168.20.165:8080/JSON/spider/view/scans/?zapapiformat=JSON&formMethod=GET
■進捗確認
(ID:0 で確認:Statusが 0 ~ 100 で変化していく)
http://192.168.20.165:8080/JSON/spider/view/status/?zapapiformat=JSON&formMethod=GET&scanId=0
アラート情報確認
■report出力(JSON形式)
http://192.168.20.165:8080/JSON/core/view/alert/?zapapiformat=JSON&formMethod=GET&id=0
※HTML形式での表示
■全件確認
http://192.168.20.165:8080/JSON/core/view/alerts/?zapapiformat=JSON&formMethod=GET&baseurl=http%3A%2F%2F192.168.20.161&start=&count=&riskId=
※HTML形式での表示
■サマリ確認
http://192.168.20.165:8080/JSON/core/view/alertsSummary/?zapapiformat=JSON&formMethod=GET&baseurl=http%3A%2F%2F192.168.20.161
※HTML形式での表示
■JSON表示を整形し抽出(スパイダーで取得したURL確認)
診断対象が指定しているアドレスのみアラートが出ているのかをURLを抽出して確認する。
他のグローバルサイトのアドレスはなかったため、一応指定アドレスのみ診断対象となっていそうでした。
# curl "http://192.168.20.165:8080/JSON/core/view/alerts/?zapapiformat=JSON&formMethod=GET&baseurl=http%3A%2F%2F192.168.20.161&start=&count=&riskId=" | jq -r '.alerts[] | .url '
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 5666k 100 5666k 0 0 3759k 0 0:00:01 0:00:01 --:--:-- 3757k
http://192.168.20.161/robots.txt
http://192.168.20.161
http://192.168.20.161
http://192.168.20.161
http://192.168.20.161/sitemap.xml
http://192.168.20.161/wp-admin/admin-ajax.php
~省略~
http://192.168.20.161/wp-includes/js/tinymce/utils/
http://192.168.20.161/wp-includes/js/tinymce/utils/
http://192.168.20.161/wp-includes/js/tinymce/utils/
http://192.168.20.161/wp-includes/js/tinymce/tinymce.min.js
http://192.168.20.161/wp-includes/js/tinymce/wp-tinymce.js.gz
http://192.168.20.161/icons/compressed.gif
http://192.168.20.161/wp-includes/js/tinymce/wp-tinymce.php
http://192.168.20.161/wp-includes/js/thickbox/?C=N;O=D
http://192.168.20.161/wp-includes/js/thickbox/?C=N;O=D
~省略~
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=S;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=S;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=D;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=D;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=D;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=D;O=D