クラウド型Web脆弱性診断ツール VAddyブログ

- 継続的セキュリティテストへの道 -

RestAPIサーバのセキュリティテストを実現しました

VAddyはCIツールと連携し、継続的なセキュリティテストを実現するクラウド型Web脆弱性検査ツールです。

最近のモバイルアプリケーションやシングルページアプリケーションのような構成ですと、APIサーバに対してPOST/PUTリクエストを送信する際に、パラメータはJSON形式というのも多くなりました。

今回、このJSON形式の場合でも、JSONデータに含まれるパラメータに対してSQLインジェクションの検査ができるようになりました。
これにて、Angular.jsやBackbone.js、iOSAndroidアプリケーションと通信するAPIサーバ側の検査が可能となりました。

実はAPIサーバのJSONデータの検査対応はそれほど優先度が高くなかったのですが、VAddyミートアップを通してユーザからの要望を頂いた結果、優先すべき項目となり、すぐに実装してリリースとなりました。
このようにVAddyは検査エンジンを自社で実装していることもあり、ユーザの要望を通して必要な機能をすばやく実装していきます。



APIサーバの検査までの流れ

POST/PUTでJSONデータをAPIサーバに送信する場合は、HTTPリクエストヘッダの中にContent-type: application/jsonが含まれていると思います。 このヘッダ情報がある場合にJSONの中のパラメータも検査対象となります。 Angular.jsなどjavascriptフレームワークを使っていればこの形式になっていると思いますので、問題なく検査できます。

モバイルアプリケーションやシングルページアプリケーションでは、APIサーバ側から作成を始めることもありますので、VAddyでどのようにスキャンまで行うか説明します。 VAddyでは、検査対象となるURLやパラメータをクロール情報としてスキャン実行前に登録する必要があります。 通常ではブラウザのProxy設定をVAddyのProxyサーバに変更して、Webアプリケーション画面を操作すればクロール情報が生成されますが、View側の画面をまだ作成していない場合は、このクロールをcurlなどのコマンドを使って生成します。

まず、curlコマンドから自分のWebアプリケーションにアクセスできるか確認します。

GETリクエストの場合

curl http://www.example.com/blog/Api/view.json?id=1


POSTリクエストの場合(データはJSON形式)

curl -v -H "Accept: application/json" -H "Content-type: application/json" 
-X POST -d '{"Articles":{"title":"post_aa", "body":"bodyhoge"}}' 
http://www.example.com/blog/Api/add.json

これで問題なければ、下記のようなシェルスクリプトを作成します。


#!/bin/sh
PROXY='--proxy http://54.92.84.100:28888'

## (1)
curl $PROXY  -k 'http://www.example.com/vaddy-abc12345.html?action=begin&project_id=xxxxxx'

## (2) 
curl $PROXY  -k 'http://www.example.com/blog/Api/view.json?id=1'

## (3)
curl $PROXY   -k  \
-H "Accept: application/json" \
-H "Content-type: application/json" \
-X POST -d '{"Articles":{"title":"post_aa", "body":"bodyhoge"}}' \
'http://www.example.com/blog/Api/add.json'

## (4)
sleep 1;
curl $PROXY  -k 'http://www.example.com/vaddy-abc12345.html?action=commit&project_id=xxxxxx'

もしhttpsのサイトをクロールする場合は、クロール時に証明書エラーが出ますので、curlの -k オプションもしくは --insecure オプションを全てのcurlコマンド実行時に付与してください。

VAddyのクロールにはCookieが必須のため(PrivateNet版を除く)、クロール開始URLでcookieの保存に-cオプションを、その後はそのcookieを利用するため-bオプションを利用します。ここではcookie.txtというファイルにcookieの内容を保存していますので、このシェルスクリプトと同じディレクトリに書き込み権限が必要になります。 (2020年8月の同時クロール機能のリリースによりcookieは不要になりました。)

まず最初に変数PROXYに、VAddyのProxyサーバの情報をセットします。これにて全てのHTTPリクエストはVAddy Proxyを経由してユーザのwebアプリケーションにアクセスするようになります。この変数をPROXY=“のように空にすればVAddy Proxyを経由せずに通常のアプリケーションの動作確認に利用できます。ProxyにセットするIPとポート番号はプロジェクトによって異なる可能性がありますので、VAddyの画面のProxyCrawlingメニューからProxyのIPとポート番号をご確認ください。


(1)と(4)は、VAddyのクロール記録の開始と終了を行うためのURLです。実際のURLはVAddyにログインしてご確認ください。
(4)のクロール終了URLのアクセスの前に念のため1秒のsleepを入れてください。(クロール開始から終了まで早く終わる場合にうまくクロールが終了できない場合があるため)

(2)と(3)は、最初にアクセスできるか試したcurlコマンドに、Proxy情報を付与しています。

URLやパラメータが増えるたびに、このシェルスクリプトに情報を追加して実行していくだけで、VAddyのクロール情報が更新され、スキャンの実行時にそれらが検査されます。 スキャンの実行はVAddyの画面からも実行できますが、VAddy WebAPIやそれを操作するgo-vaddyというコマンドラインツール、Jenkinsプラグインを既に提供していますので、cronで定期的な実行や、CIと連携した検査が実現できます。

今後もユーザからのフィードバックを頂きながら、ユーザに愛されるサービスとなるよう進めていきたいと思います。