>100 Views
September 06, 26
スライド概要
OSSな脆弱性診断ツールのZAPを試してみる回。
ZAP を実際に触ってみる回 EPISODE #7 ― 無料の診断ツールを穴だらけのアプリに撃ってみた ― 2026-09-06 (日) 20:30〜 Quatrex × かーでぃ #明日話せるセキュリティネタ会
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 今日の流れ 2026-09-06 | Quatrex × かーでぃ 1. 前々回のおさらい ― 脆弱性診断は OSS でできる 2. ZAP とは何者か ― 間に挟まるプロキシ 3. 実際に当ててみる ― 穴だらけのアプリと、対策を固めたアプリに 4. わかったこと ― 届いたところと、届かなかったところ 今日いちばん見てほしいのは、同じツール・同じ撃ち方で、 穴だらけのアプリと、対策を固 めたアプリで、結果がまるで違うこと。 2 / 31
1. 前々回のおさらい 脆弱性診断は OSS でできる 3 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 診断は4種類。それぞれに無料の OSS がある 種類 SAST DAST SCA シークレット検出 何を見る ソースコードを静的に読む 動いているアプリを外から叩く 依存ライブラリの既知 CVE コードに混入した鍵・パスワード 2026-09-06 | Quatrex × かーでぃ 代表 OSS Semgrep ZAP Trivy GitLeaks このうち ZAP だけが「動かして叩く」DAST。今日はここを実際にやる。 4 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 脆弱性の地図 ― 8つのカテゴリ # 1 2 3 4 5 6 7 8 カテゴリ 入力検証 認証 認可・アクセス制御 セッション管理 データ保護・暗号 設定・構成 依存・サプライチェーン ロギング・ロジック 2026-09-06 | Quatrex × かーでぃ 代表的な攻撃 / 失敗 SQLi / XSS / コマンドインジェクション パスワードスプレー / クレデンシャルスタッフィング IDOR / BOLA / 権限昇格 CSRF / セッション固定 / ハイジャック 平文保存 / 弱い暗号 / TLS 不備 デフォルト設定 / ヘッダ不備 / 公開バケット 既知 CVE / typosquatting ログ不在 / 監視不在 / ロジック悪用 IDOR = Insecure Direct Object Reference(安全でない直接オブジェクト参照)。他人の ID を指 定すると他人のデータが見えてしまう類。API 版の呼び方が BOLA。 5 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 2026-09-06 | Quatrex × かーでぃ OSS 4本は、どこを守っているのか # 1 2 3 4 5 6 7 8 カテゴリ 入力検証 認証 認可・アクセス制御 セッション管理 データ保護・暗号 設定・構成 依存・サプライチェーン ロギング・ロジック ZAP ● ○ ● ○ ● Semgrep ● ● Trivy GitLeaks 人 ● ● ● ● ● ● 3 と 8 は「人」の列にしか印が付かない。ここが今日の最後に戻ってくる場所。 ● 主に担当 ○ 部分的に 6 / 31
2. ZAP とは何者か 間に挟まるプロキシ 7 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 2026-09-06 | Quatrex × かーでぃ ソースを見ない。通信を見る どういう道具か Zed Attack Proxy 動いているアプリに外からリクエストを 投げて穴を探す 無償・オープンソース。この分野の定番 商用の Burp / AppScan / Acunetix の対 抗馬 呼び名が変わった 長く「OWASP ZAP」だった 今は ZAP by Checkmarx 中身も使い方も無償も変わらない 記事は旧名が大半。検索はどちらでも可 8 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 仕組みは「間に座る」だけ 2026-09-06 | Quatrex × かーでぃ ブラウザ ──▶ [ ZAP プロキシ ] ──▶ 対象アプリ └▶ 通信を 記録・改ざん・再送 ソースコードは1行も見ない。だから言語もフレームワークも問わない 逆に、ZAP が知っているのは「通った通信」だけ。踏んでいない画面は検査されない SAST は「こう作ったから守られているはず」という設計側の説明。DAST は「外から叩い たらどうだったか」という結果側の確認。 この2つが揃って、はじめて「対策できている」 と言い切れる。 9 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる どんな形で配られているのか デスクトップ GUI Windows / macOS / Linux の インストーラ 手で触って探索する用 Java 17 以上(macOS 版は 同梱) Docker イメージ ghcr.io/zaproxy/zaproxy 入れずに使い捨てで回せる 今日の実演はこれ 2026-09-06 | Quatrex × かーでぃ クロスプラットフォー ム ZIP 解凍して置くだけ Core 版は最小構成 Java 17 以上が必要 中身は Java のアプリ ( zap-2.17.0.jar )。Docker イメージには zap-baseline.py / zap-fullscan.py / zap-api-scan.py が同梱されている。 10 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる Docker のタグは用途で選ぶ タグ stable bare weekly nightly 今日 2026-09-06 | Quatrex × かーでぃ 位置づけ 通常はこれ。リリース版 + 更新されたアドオン CI 向けの最小構成。スキャンスクリプトは入らない 毎週月曜更新。新しい機能を試したいとき 毎日更新。最新のソースから ghcr.io/zaproxy/zaproxy:stable (約 3.7GB / ZAP 2.17.0) イメージは Docker Hub と GitHub Container Registry の両方にある。 11 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 2026-09-06 | Quatrex × かーでぃ 無償でここまでやれるのか 価格 攻撃を撃つスキャン 自動化・CI 組込み 手で触る調査 ZAP 無償 制限なし 得意 できる Burp Community 無償 使えない 不向き 得意 Burp Pro 有償 制限なし 可 得意 手で触る調査では Burp Pro がよく使われる。ZAP の強みは、無償で毎回まわせること。 12 / 31
3. 実際に当ててみる 2つのアプリに、同じ ZAP を撃つ 13 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 3つの使い方。今日は上2つ 2026-09-06 | Quatrex × かーでぃ 使い方 Baseline Full GUI 攻撃 しない (受動) する (能動) 任意 Docker 何をするか 巡回して、通信を眺めて分かる問題だけ報告 上に加えて実際に攻撃リクエストを送る 手で探索しながら調べる docker run --rm -v "$(pwd):/zap/wrk/:rw" -t ghcr.io/zaproxy/zaproxy:stable \\ zap-baseline.py -t http://対象:8080 -j -m 3 -r report.html Baseline は受動。SQLi や XSS のように「攻撃を撃って初めて分かる穴」は Baseline では出 ない。 14 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 実演の題材 ― 一見、普通の業務アプリ 2026-09-06 | Quatrex × かーでぃ 社内の問い合わせを記録・共有するため の内製ツール、という設定 担当者検索 / 申し送りメモ / 手順書 / 疎通 確認 / 伝票 / 管理メニュー どこの会社にもありそうな画面。見た目 におかしなところは無い 15 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 実は、穴が8個仕込んである 2026-09-06 | Quatrex × かーでぃ さっきの画面に、古典的な穴を8個仕込んだ。 画面 ログイン 担当者検索 申し送りメモ 手順書 疎通確認 ヘッダ・Cookie 伝票 管理メニュー 仕込んだ穴 SQL インジェクション (認証バイパス) 反射型 XSS + SQLi 格納型 XSS パストラバーサル OS コマンドインジェクション CSP なし / HttpOnly なし IDOR (他人の伝票が見える) 認可チェックなし このうち ZAP がいくつ見つけるか。答えは結果で確かめる。 16 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる Baseline と Full で結果が変わる Baseline (受動) High: 0件 Medium 4 / Low 8 / Info 4 ヘッダ・Cookie の不足止まり 2026-09-06 | Quatrex × かーでぃ Full (能動・攻撃を撃つ) High: 7件 Medium 7 / Low 9 / Info 6 SQLi・XSS・コマンド注入が挙がる 同じアプリ。撃つか撃たないかで、見 つかる穴がまるで違う。 17 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 2026-09-06 | Quatrex × かーでぃ 検知されまくる ― High の中身 High アラート SQL Injection Cross Site Scripting (Reflected) Cross Site Scripting (Persistent) Cross Site Scripting (DOM Based) Remote OS Command Injection Remote OS Command Injection (Time Based) Path Traversal 指摘数 3 3 2 3 1 5 1 出た画面 ログイン・検索 検索 申し送りメモ 申し送りメモ・検索 疎通確認 疎通確認 手順書 High 7件 = アラートの「種類」が7つ。 実際の指摘箇所は合わせて 18 か所。 18 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 中を開ける ― 穴のあるコードはこれ 2026-09-06 | Quatrex × かーでぃ 担当者検索。入力をそのまま SQL の文字列に埋め込んでいる。 $q = $_GET['q'] ?? ''; // 入力をエスケープせずに SQL へ連結している $sql = "SELECT id, name, dept, tel FROM users WHERE name LIKE '%$q%'"; $rows = $db->query($sql)->fetchAll(); $q に ' が1つ混じるだけで、SQL の構文が壊れる。 19 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 2026-09-06 | Quatrex × かーでぃ ZAP が撃ったのは、たった1文字 送られたリクエスト GET /search?q=%27 返ってきた証拠 evidence: SQLSTATE[HY... param : q attack : ' シングルクォート1文字だけ DB のエラーが画面に出た → 構文が壊れた =注入できる このアラートには CWE-89 が付く。CWE は弱点の種類につけられた世界共通の番号(MITRE が 管理)。ZAP 独自の項目ではなく、89 番が SQL インジェクション。直し方は prepare() と execute() に置き換えるだけ。 20 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 小ネタ ― ツールの言うことは鵜呑みにしない 2026-09-06 | Quatrex × かーでぃ 実際のレポートでは、SQLi がこう表示された。中身は SQLite なのに。 SQL Injection - Oracle レポートに理由が書いてある。さっきの SQLSTATE[HY を、ZAP が Oracle のエラー特徴として 登録していたため。 「穴がある」ことは正しく検知した でも「Oracle だ」はエラー文字列からの推測で、外れている 種別や深刻度は、人が最後に確かめる。この確認作業こそが専門性 21 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 実務のはまりどころ ― ログインの向こう側 2026-09-06 | Quatrex × かーでぃ 業務システムはログインしないと何も見えない。 何も教えず走らせると、ログイン画面1枚だけ 診断して「問題なし」と言ってくる。 段階 ① ログイン画面だけ ② セッション Cookie を渡す ③ ID / PW を渡す やり方 素で回す 手動ログインして Cookie を差し込む ZAP に毎回ログインさせる 位置づけ まず1回目はこれで十分 手っ取り早い。今回やったのはこれ 本命。次のページ 22 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる ID / PW を ZAP に渡してログインさせる 2026-09-06 | Quatrex × かーでぃ できる。Context に認証方法とユーザーを登録する。GUI でも、YAML でも書ける。 env: contexts: - name: 社内アプリ authentication: method: browser # ブラウザを動かして実際にログインさせる parameters: loginPageUrl: http://example/login verification: method: response # ログイン済みかを見分ける目印 loggedInRegex: ログアウト users: - name: tanaka credentials: username: tanaka password: pass123 method は browser / form / json / script / autodetect などから選ぶ。迷ったら browser が確実。 23 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 次は、対策を固めたアプリに同じことを 2026-09-06 | Quatrex × かーでぃ Laravel で作り、Claude Code (Opus) できっちりセキュリティ対策をした試作の Web アプ リ。 同じ ZAP を3回当てた結果。 当て方 Baseline (未ログイン) Cookie を渡す Full (攻撃あり) 到達エンドポイント 7 87 89 High 0 0 0 Medium 2 2 3 Low 8 10 9 7 → 87。ログインを渡すかどうかで、診断できる範囲が12倍以上。 24 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 同じツールで、この差 穴だらけアプリ Full で High 7件 SQLi・XSS・コマンド注入 ツールは正しく穴を見つける 2026-09-06 | Quatrex × かーでぃ 対策を固めた試作アプリ Full でも High 0件 副産物で500エラーも見つかった 教科書的な穴は無い、の一次証拠 ZAP が穴だらけアプリで7件出せる道 具だからこそ、こちらの0件に意味が ある。 25 / 31
4. わかったこと 届いたところと、届かなかったところ 26 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる ZAP でも取れないもの 仕込んだのに、黙った2つ 認可なし /admin 誰でも全社員のパスワードが見える IDOR /receipt?id= 他人の伝票が開ける どちらも ZAP から見れば正常な 200。攻撃の形 をしていない。 2026-09-06 | Quatrex × かーでぃ 今回は仕込んでいないが、同じく届かない ビジネスロジックの穴 業務を知らないと判定できない 踏めなかった画面 認証の奥、特定条件でしか出ない画面 ソース / 依存ライブラリの CVE そもそも ZAP の担当外(Semgrep・Trivy) 左の2つは実際に仕込んで、実際に黙った。右は今回のアプリには無いもの(依存ライブラリを1つも使っていな いので CVE は最初から存在しない)。 27 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 目安 ― ツールで6割、残り4割は人 2026-09-06 | Quatrex × かーでぃ ツール 約6割 / 人 約4割 ツールで潰せるのは、入力検証と設定まわりが中心 認可・業務ロジック・運用は、業務を知る人が見るしかない これはセキュリティベンダーに頼んでも同じ。ベンダーに渡すべきは「誰が、どこまで触れて よいか」の業務情報 28 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる 無料の診断にも、ちゃんと意味がある 2026-09-06 | Quatrex × かーでぃ ZAP のレポートはセキュリティベンダーのお墨付きにはならない。そこは正直に線を引く。 得られるもの 費用 頻度 無料の自前チェック 教科書的な穴の検出 ほぼゼロ 変更のたびに回せる セキュリティベンダーの診断 認可・ロジックまで含む評価と証明 相応にかかる 年数回が現実的 あからさまな穴を先に潰しておけば、穴を塞ぐ頻度そのものが上がる 出す前に潰してあるので、指摘が減る → 再検査の往復も減る 結果として、セキュリティベンダーにお世話になる回数と費用を抑えられる 29 / 31
明日話せるセキュリティネタ会 #7 — ZAP を実際に触ってみる まとめ / 次回予告 2026-09-06 | Quatrex × かーでぃ ZAP は間に挟まるプロキシ。ソースを見ないから言語を問わない 受動 (Baseline) はヘッダ止まり。攻撃を撃つ Full で初めて SQLi・XSS が挙がる 穴だらけで High 7、対策を固めたアプリで High 0。ツールは正しく見つける ただし認可とビジネスロジックは取れない。そこは人の仕事 次回: 潰しきれない、パッチも間に合わない。その間どうするか → WAF 30 / 31
ご清聴ありがとうございました 質問・雑談どうぞ 明日話せるセキュリティネタ会 #7