先日、AeyeScanにChatGPTの技術を導入した「生成AIオプション」をリリースしました。
「生成AIを活用した脆弱性診断」に関する特許を取得並びに、取得した特許技術をもとにAeyeScanの新たな機能をリリース
https://www.aeyesec.jp/post/pr_20231010_generativeai
このオプションを適用することで、設定、巡回、スキャン、レポートの各項目で生成AI技術の利点を享受できます。今回は、生成AIオプションにおけるスキャン機能に焦点を当てて詳細を解説します。
●生成AIオプション(スキャン機能)の詳細
生成AIオプションを利用することで、これまでツールによる診断では検出が難しかった脆弱性も検出可能になりました。具体的には以下の2種類の脆弱性に対応しており、本記事ではセカンドオーダーXSSの脆弱性を取り上げていきます。
- セカンドオーダーXSSの脆弱性
- 認可不備の脆弱性
●セカンドオーダーXSSの脆弱性
セカンドオーダーXSS(Stored XSS)は、XSSの一形態として知られ、攻撃者が Webアプリケーションに悪意のあるスクリプトを保存し、それが後のユーザーに対して実行される攻撃を指します。
攻撃は「保存」「実行」「攻撃」の3ステップで実行されます。
保存: 攻撃者はWebアプリケーション上に悪意のあるスクリプトを含むデータを保存します。これは、掲示板やレビュー欄、プロフィール情報などの機能を利用して行われることが一般的です。
実行: 他のユーザーが保存されたデータを閲覧する際、悪意のあるスクリプトが実行されます。
攻撃: スクリプトの実行により、ユーザーのセッション情報窃取、不正な操作、マルウェアのダウンロードなど、様々な攻撃が可能となります。
悪意のあるスクリプトが保存されると、複数のユーザに対して攻撃が実行される可能性があるため、非常に危険な攻撃となり得ます。
●ChatGPTを活用したセカンドオーダーXSSの検出方法
セカンドオーダーXSSの検出は、データの保存と再利用の流れを正確に追う必要があるため、ツールでの自動検出は困難というのが通説でした。しかし、ChatGPTのような高性能の生成AIをうまく活用することができれば、高い精度で検出することが可能になります。
ツールでセカンドオーダーXSSを検出する仕組みを構築するにあたり、まずは検出フローから整理していきます。
●検出フロー
手動診断を行う人間(脆弱性診断士)は、下記のような工程を経て脆弱性の確認や分析を行い、脆弱性の有無を判断します。
・ サイトを網羅的に巡回
・ サイト内の各機能をリストアップし、機能名を付ける
・ 各機能の関連性を一般的な知識を基に推測
・ 推測した関連性を実際のWebサイトで検証
・ 検証結果を基に、データの流れを特定
・ 特定したデータの流れに基づき、入力値の出力状況を確認
各工程を人間で行うのではなく自動化することができれば、セカンドオーダーXSSのツール検出が可能であるといえます。ここからは、AeyeScanでどのように自動化を進めていったのかご説明します。
●各工程の自動化方法
・ サイトの網羅的な巡回
AeyeScanには自動巡回機能が備わっており、この条件は達成できていました。
・ サイト内の各機能のリストアップと機能名の付与
例:ECサイトの場合、会員登録、ログイン、マイページなど。
機能名の付与は、ロジックのみでは困難であり、ChatGPTの支援が必要となります。
・ 機能の関連性の推測
ロジックのみでは困難であり、こちらもChatGPTの支援が必要です。
・ 推測した関連性の検証
ChatGPTによって関連性が判定された機能に対してアクセスし、ロジックによって実際の関連性を確認します。
・ データの流れの特定
入力値の出力画面と出力箇所を特定します。ここまで集めた情報があれば、ロジックによって確認可能です。
・ 入力値の出力状況を確認
実際の検査パターンを送信し、応答を確認します。
上記の考察から、「機能名の付与」と「機能の関連性の推測」がChatGPTの支援により実現できるならば、セカンドオーダーXSSの自動検出が可能であるといえます。

●プロンプトの作成
必要な機能が分かったので、プロンプトを作成していきます。
●機能名の付与
・ プロンプトの作成
機能名を決定するために人間が使用している情報には以下がありそうです。
- ページのURL: どのページがどの機能に関連しているのかを特定するため。
- ページのタイトル: しばしば、ページのタイトルにはそのページの主要な機能や内容が含まれています。
- ページのコンテンツ: ページ内のテキスト、入力フォーム、ボタンやリンクなどの情報。
- 遷移元画面の機能名: 一連の手順やフローがある場合、それを理解するため。
- サイトの全体的なテーマやカテゴリ: 例えば、ショッピングサイト、ニュースサイト、ブログなど。
これらの情報をChatGPTに入力して、機能名を判別するプロンプトを作成してみましょう。弊社のデモサイトを例にテストしてみます。
---
あなたは脆弱性診断士です。脆弱性診断のために、巡回した画面に適切な機能名を付与してください。巡回した画面の情報は以下の形式で入力します。
- ページのURL: http://example.com/my-page/user-edit
- ページのタイトル: Essence - 登録情報編集
- ページのコンテンツ: 略
<body>
<!-- ##### Breadcumb Area Start ##### -->
<div class="breadcumb_area bg-img" style="background-image: url(/img/bg-img/breadcumb.jpg);">
<div class="container h-100">
<div class="row h-100 align-items-center">
<div class="col-12">
<div class="page-title text-center">
<h2>登録情報編集</h2>
</div>
</div>
</div>
</div>
</div>
<!-- ##### Breadcumb Area End ##### -->
<!-- ##### Checkout Area Start ##### -->
<div class="checkout_area section-padding-80">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3">
<div class="mt-50 clearfix">
<div class="mb-30">
<h5>編集フォーム</h5>
</div>
<form action="/my-page/user-edit" method="post">
<input type="hidden" name="csrf_token" value="ZFLfFwjk-K0Xxm-kW4Rvx-O0-Y8G-QonFCc8">
<div class="row">
<div class="col-md-6 mb-3">
<label for="last_name">姓</label>
<input type="text" class="form-control" id="last_name" name="last_name" value="デモ">
</div>
<div class="col-md-6 mb-3">
<label for="first_name">名</label>
<input type="text" class="form-control" id="first_name" name="first_name" value="太郎">
</div>
<div class="col-12 mb-3">
<label for="country">国</label>
<input type="text" class="form-control" id="country" name="country" value="日本">
</div>
<div class="col-12 mb-3">
<label for="post_number">郵便番号</label>
<input type="text" class="form-control" id="post_number" name="post_number" value="100-0001">
</div>
<div class="col-12 mb-3">
<label for="prefecture">都道府県・州・地域</label>
<input type="text" class="form-control" id="prefecture" name="prefecture" value="東京都">
</div>
<div class="col-12 mb-3">
<label for="city">市町村</label>
<input type="text" class="form-control" id="city" name="city" value="千代田区">
</div>
<div class="col-12 mb-3">
<label for="street">番地</label>
<input type="text" class="form-control" id="street" name="street" value="1-1-1">
</div>
<div class="col-12 mb-3">
<label for="building">建物・部屋番号</label>
<input type="text" class="form-control" id="building" name="building" value="テストマンション111号室">
</div>
<div class="col-12 mb-3">
<label for="phone_number">電話番号</label>
<input type="tel" class="form-control" id="phone_number" name="phone_number" value="090-XXXX-XXXX">
</div>
<div class="col-12 mb-3">
<label for="mail_address">メールアドレス</label>
<input type="email" class="form-control" id="mail_address" name="mail_address" value="test@example.com">
</div>
</div>
<button type="submit" class="btn essence-btn">確認</button>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
略
- 遷移元画面の機能名: マイページ
- サイトの全体的なテーマやカテゴリ: ECサイト
```
結果
以下の情報を考慮して、機能名を付与します。
ページのURL: http://example.com/my-page/user-edit
ページのタイトル: Essence - 登録情報編集
ページのコンテンツ: 各種入力フォームやボタンが含まれる情報編集ページ
遷移元画面の機能名: マイページ
サイトの全体的なテーマやカテゴリ: ECサイト
機能名の提案:「ユーザー情報編集」
理由:
タイトルに「登録情報編集」と明記されている。
ページのコンテンツには、名前、国、郵便番号、住所、電話番号、メールアドレスなどのユーザーの基本情報を編集するための入力フォームが存在する。
遷移元が「マイページ」というユーザーセンター的なページであるため、ユーザー個人に関する情報編集ページと推測される。
サイトがECサイトであることを考慮すると、このような情報編集機能は一般的にユーザーの購入情報やプロフィールに関連するものであると考えられる。
---
上手く判別することが出来ました。
●機能の関連性の推測
・ プロンプトの作成
機能の関連性を決定するために人間が使用している情報には以下がありそうです。
- 機能名の一覧: 付与した機能名の一覧
- 入力画面: フォーム入力を行った画面
- フォーム入力値: 名前、メールアドレスなどのフォーム入力値
これらの情報をChatGPTに入力して、機能の関連性を推測するプロンプトを作成してみましょう。

こちらも上手く判別することが出来ました。
最終的には、このプロンプトの英語版をベースに入力形式、出力形式を整え、APIから実行することで、セカンドオーダーXSSを検出することが可能になりました。
●まとめ
以上、生成AIオプションのスキャン機能のうち、セカンドオーダーXSSの検出方法を詳細に解説しました。
次回は、認可不備の脆弱性について解説する予定です。