技術的な仕様
診断の仕組み
Shisho Cloud は、登録されたそれぞれのシナリオに対して擬似攻撃を送信し、レスポンスを精査して脆弱性を検出します。 シナリオは、依存関係を持つエンドポイントのシーケンスです。
アプリケーションによっては、リクエストに認証ヘッダーやログイン後の Cookie など特定の情報を付与する必要がある場合があります。 認証設定を登録することにより、巡回や診断でリクエストを送信する際に付与すべきヘッダー等を指定できます。 付与するヘッダー等の値は固定値だけでなく、ログイン操作を表すシナリオをリプレイして動的に抽出することもできます。
場合によっては、アプリケーションの一部機能を診断の対象外にしたいこともあるでしょう。 そのような場合には、スコープを適切に設定することにより、アプリケーションの特定部分のみを診断することができます。
以降のセクションでは、それぞれの概念をより詳しく説明します。
スコープ
スコープは、アプリケーションの診断対象とする範囲を定義します。
デフォルトの入力方式では、URL の prefix を指定すると、その prefix から始まる URL が診断対象になります。 「スコープを追加」ボタンをクリックして、複数の prefix を指定することもできます。

トグルをクリックして上級者モードに切り替えると、prefix の代わりに正規表現を用いて、診断対象とする URL の範囲を定義できます。

シナリオ
シナリオは、診断の単位であり、依存関係のあるエンドポイントのシーケンスを表します。例えば以下のようなリクエストの流れをシナリオとして表現でき、エンドポイントの関係性を踏まえた診断が可能となります。
- 入力画面の CSRF トークンを抽出し、それを付与して POST リクエストを送信する
- アイテムを削除するリクエストを送信する前に、アイテムを作成するリクエストを送信する
- アイテムの作成リクエストを送信した後に、アイテム情報が表示される画面をリクエストし、蓄積型の脆弱性を検出する
シナリオは1つ以上のステップから構成され、1つ1つのステップはリクエストを送信するエンドポイントを指します。
例えば以下の2ステップからなるシナリオは、アイテムを作成した後にアイテム一覧画面をリクエストするものです。これにより、アイテム作成に起因する蓄積型の脆弱性を検出することができます。

各ステップの YAML 入力欄には以下の詳細オプションを記述できます。
- ステップ間の入出力の関係を表すもの
extractors: リクエストの結果から値を抽出し、変数に格納して後続のステップで使えるようにするbindings: 以前のステップのextractorsで変数に格納した値を、このステップのリクエストパラメータに注入する
- 診断での取り扱いを調節するもの
skipInjection: そのステップに攻撃ペイロードを注入しない

extractors
リクエストの結果から値を抽出し、変数に格納して後続のステップで使えるようにする設定項目であり、後述する Extractor オブジェクトの配列を指定します。配列の要素として複数の Extractor オブジェクトを指定すれば、複数の情報を抽出してそれぞれ変数に格納できます。
YAML 入力欄に例えば以下を入力すると、レスポンスボディに対して正規表現 token=([a-z0-9]+) によるマッチが行われ、括弧で囲まれた第1グループである ([a-z0-9]+) にマッチした部分が name で指定された名前である変数 token に格納されます。
extractors:
- name: token
type: regex
part: body
regex:
- "token=([a-z0-9]+)"
group: 1
Extractor オブジェクト
Extractor オブジェクトは、リクエストの結果から値を抽出する方法と、抽出した値を格納する変数名を定義します。
基本的な構造は以下の通りです。name にて指定した変数名は、後続するステップの bindings で用いられます。type には抽出方法のタイプを指定し、さらに抽出方法ごとの設定項目が続きます。
name: "<格納先の変数名>"
type: "<抽出方法のタイプ>"
# ... <抽出方法に応じた設定> ...
抽出方法のタイプには以下のいずれかを指定します。
regex: 正規表現を用いて文字列から値を抽出xpath: XPath を用いて HTML・XML 内の値を抽出json: jq クエリを用いて JSON 内の値を抽出cookie: レスポンスからすべての Cookie を抽出
regex Extractor
正規表現を用いて値を抽出する Extractor です。
設定項目:
regex: 抽出に用いる正規表現の配列- 構文については RE2 のドキュメントを参照してください
group: 値を抽出するキャプチャグループの番号- デフォルト:
0(マッチの全体)
- デフォルト:
part: 正規表現でマッチする対象all: レスポンス全体 (デフォルト)body: レスポンスのボディheader: レスポンスのヘッダー
例えば以下の Extractor は、レスポンスのヘッダーに対してマッチを行い、1番目のグループ、つまり Location ヘッダーの値の部分を redirect_url という変数に格納します。
name: redirect_url
type: regex
part: header
regex:
- "(?m)^Location: (.+?)$"
group: 1
xpath Extractor
XPath を用いて HTML や XML から値を抽出する Extractor です。
設定項目:
xpath: 抽出に用いる XPath の配列attribute: 抽出する属性名- 未指定の場合: ノードのテキスト
例えば以下の Extractor は、1番目の <form> 要素の内部にある <input name="csrf_token" value="..."> のような要素を検索し、その value 属性の値を csrf_token という変数に格納します。
name: csrf_token
type: xpath
xpath:
- '(//form)[1]//input[@name="csrf_token"]'
attribute: value
目的の要素を指す XPath は、ブラウザの開発者ツールを用いて簡単に取得できます。詳細な手順はブラウザごとに異なりますが、開発者ツール上で目的の要素を右クリックし、「Copy XPath」のようなメニューを選択すると、その要素を指す XPath がクリップボードにコピーされます。また、開発者ツールのコンソールでは、 $x('//form[1]//input[@name="csrf_token"]') のように $x 関数を用いて、XPath による検索結果を確認できます。