■Active Rulesスクリプト編(3) scan関数を使ったスクリプト
それでは前回からの続きで、scan関数を使ったサンプルスクリプトを作成します。
scan関数は、part4で確認した通り
・scan()関数は、「入力ベクトル」で指定された攻撃ベクター(URL Query String / POST Data 等)に合致する項目ごとにコールされる
(コールされる際、引数にパラメーターのkeyとvalueがそれぞれ入る)
今回は、GETの各パラメーターのキーにブラケット([])を付けてリクエストを行うサンプルを書いてみます。
スクリプト中のコメントにも書いてありますが、GETパラメーターのキーにブラケットを付けて、どんなレスポンスが戻ってくれば異常といえるのかは定義ができず、自動的な判定が難しいため、ひとまずステータスコードが200以外だったらアラート、という処理にはしてありますが、このスクリプトの場合人間の目による結果の監視が必要と思います。
// scannode関数
function scanNode(as, msg) {
//nop 何もしない
}
// scan関数
function scan(as, msg, param, value) {
// 停止ボタンが押されていたら止める
if (as.isStop()) {
return
}
// デバッグログ
print('scan called for url=' + msg.getRequestHeader().getURI().toString() +
' param=' + param + ' value=' + value);
// リクエストをコピー
var clmsg = msg.cloneRequest();
// setParam (message, parameterName, newValue)
as.setParam(clmsg, param+'[]', value);
// sendAndReceive(msg, followRedirect, handleAntiCSRFtoken)
as.sendAndReceive(clmsg, true, false);
// レスポンスのステータスコードを取得
statusCode=clmsg.getResponseHeader().getStatusCode();
// ステータスコードが200以外だったら異常が発生したとみなす。
// ただし、キーにブラケット([])を追加することによってどんなレスポンスが戻ってくれば
// 異常と言えるか不明なので正確な自動判定は難しい。人間によるログ確認が必要。
if(statusCode!=200){
// raiseAlert(risk, int confidence, String name, String description,
// String uri, String param, String attack, String otherInfo,
// String solution, String evidence,int cweId, int wascId,
// HttpMessage msg)
// risk: 0: info, 1: low, 2: medium, 3: high
// confidence: 0: falsePositive, 1: low, 2: medium, 3: high, 4: confirmed
as.raiseAlert(1, 2, '*** parameter bracket error ***',
'*** parameter bracket error ***',
clmsg.getRequestHeader().getURI().toString(),
param, '(bracket)', '(bracket)', '(bracket)',
param+'[]', 0, 0, clmsg);
}
}
このスクリプトをpart4でやったように、ActiveRulesスクリプトとして保存・有効化し、例えば
http://localhost/zaptest/dir1/dir2/dir3/test.php?aaa=bbb&ccc=ddd&eee=fff

また、ZAPがどのようなリクエストを行っているか、ZAPの先にFiddlerなどのもう一つのプロキシツールをかませて通信を記録すると、ちゃんと各パラメーターのキーにブラケットが付いていることが確認できます。(ZAP2.5.0の場合。2.4.3の場合、おそらくは例のバグの関連でキーにブラケットが付かないリクエストが飛び、意図通り動作しません)
実行時にZAPが発行したリクエスト(ZAPの先にFiddlerを接続して確認):
http://localhost/zaptest/dir1/dir2/dir3/test.php?aaa%5B%5D=bbb&ccc=ddd&eee=fff
http://localhost/zaptest/dir1/dir2/dir3/test.php?aaa=bbb&ccc%5B%5D=ddd&eee=fff
http://localhost/zaptest/dir1/dir2/dir3/test.php?aaa=bbb&ccc=ddd&eee%5B%5D=fff
Active Rulesスクリプト編はこれで終わりです。
次へ