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:10080'

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

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

## (3)
curl $PROXY -b cookie.txt -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'

## (4)
curl $PROXY -b cookie.txt 'http://www.example.com/vaddy-abc12345.html?action=commit&project_id=xxxxxx'

まず最初に変数PROXYに、VAddyのProxyサーバの情報をセットします。これにて全てのHTTPリクエストはVAddy Proxyを経由してユーザのwebアプリケーションにアクセスするようになります。この変数をPROXY=“のように空にすればVAddy Proxyを経由せずに通常のアプリケーションの動作確認に利用できます。

(1)と(4)は、VAddyのクロール記録の開始と終了を行うためのURLです。実際のURLはVAddyにログインしてご確認ください。
(2)と(3)は、最初にアクセスできるか試したcurlコマンドに、Proxy情報を付与しています。
クロール開始URLでcookie情報をcookie.txtに保存し保存し、以降のリクエストでそれを利用しています。

URLやパラメータが増えるたびに、このシェルスクリプトに情報を追加して実行していくだけで、VAddyのクロール情報が更新され、スキャンの実行時にそれらが検査されます。 スキャンの実行はVAddyの画面からも実行できますが、VAddy WebAPIとJenkinsプラグインを既に提供していますので、Jenkins経由、CirlceCI経由でも実行可能です。 JenkinsやCircleCIでこのcurlのコマンドを実行するシェルスクリプトを実行し、その後スキャン実行までCIで行えば、コードのpushからクロール情報登録、スキャンまで一気に実行できます。

今後もユーザからのフィードバックを頂きながら、ユーザに愛されるサービスとなるよう進めていきたいと思います。 VAddyの第2回ミートアップは既に満席となってしまいましたが、今後も定期的に行って行く予定ですので、 興味ある方はこちらからご登録ください。 https://vaddy.doorkeeper.jp/