前の投稿 次の投稿

OWASP ZAPのスクリプトを作ってみる part2

Stand Aloneスクリプト編(2) テンプレートスクリプトを動かす


Hello World成功だけでは面白くないので、今度はZAPに組み込まれているStand Aloneのテンプレートを使って、サンプルスクリプトを実行してみます。

1) 前回と同じように「スクリプト」タブのStand Aloneを右クリック-「新規スクリプト…」を選択。新規スクリプトのダイアログで以下のように入力し「保存」をクリック。

Script名:script_test2
タイプ:Stand Alone
Script engine:ECMAScript:Oracle Nashorn
テンプレート:Traverse sites tree.js
説明:任意の内容
開始時にロード:チェック



前回と違うのは、テンプレートとして「Traverse sites tree.js」を選択した点です。

「保存」を押下すると、「Scriptコンソール」の上ペインに以下のようなコードが現れます。
// This script traverses the sites tree - change it to do whatever you want to do :)
//
// Standalone scripts have no template.
// They are only evaluated when you run them. 

function listChildren(node, level) {
    var i;
    for (i=0;i<level;i++) print ("    ");
    var j;
    for (j=0;j<node.getChildCount();j++) {
        println(node.getChildAt(j).getNodeName());
        listChildren(node.getChildAt(j), level+1);
    }
}

root = org.parosproxy.paros.model.Model.getSingleton().
        getSession().getSiteTree().getRoot();

listChildren(root, 0);
ここに表示されたコードは、Script作成時に「テンプレート:」に指定したファイルから読み込んできたコードです。

テンプレートの元となっているファイルはどこにあるかというと、見落としやすいのですが「Scripts」タブの下の方の「Templates」の中にあります。

ZAPスクリプトを自作するにあたって、「Templates」にあるファイルは重要な参考資料になりますので、どんなコードがあるのか見て回ると良いかもしれません。


ではこの「script_test2」スクリプトを動かしてみましょう。

このスクリプトは、名前が「Traverse sites tree」であることからも分かるように、ZAP上に何らかの履歴がある(「サイト」タブに何かのサイトが表示されている)必要があります。
サイトタブが空だと実行しても何も起こらないようです。

ひとまず、このスクリプトを動かすため、ローカルWEBサーバーをXAMPPなどを利用して立て、それにZAP経由でアクセスして履歴をZAP内に記録します。(本例ではhttp://localhost とします)

それから「Scripts」タブで「script_test2」スクリプトを選択して、「Scriptコンソール」上部の「実行」ボタンを押下すると……printlnが未定義と言われてしまいます。

<eval>:11 ReferenceError: "println" is not defined<eval>:11 ReferenceError: "println" is not defined




ZAPのコミュニティなどでこのエラーメッセージの対処方法を探してみると、このエラーが出た場合はprintlnの代わりにprintを使えばよいとのこと。

(RhinoというJava 7までのJavaScript engineを利用しているとこのエラーが発生すると言っている人もいるのですが、スクリプト作成時に「Script engine:ECMAScript:Oracle Nashorn」とJava8のJavaScript engineであるNashornを選択しているのにこの問題が発生するので、これが原因ではなさそうです。もしかしたらこのエラーが発生せずにそのまま動作する環境もあるのかもしれませんが、情報が少なくてよく分かりません)

アドバイスに従い、コード中の"println"を"print"に書き換え、再度「実行」を押下すると……今度は動作しますが、おそらくはコード作者が意図しているようなツリーっぽい表示にはなりません。ノードのリストアップはされるものの、空行がたくさん挟まった見づらいリストになってしまいます。

実行結果:


(※なお、このスクリプトでは外部サイトへの新しいアクセスは行わず、ZAP内部の記録だけを使って処理をしているため、もし外部サイトに関するノードが実行結果に出てきてしまっても実際のアクセスはしていないので問題ありません)

おそらくprintlnをprintに書き換えたせいでスクリプトが想定した動作をしていないと思われるので、ちゃんとツリーっぽい表示になるように直してみます。
function listChildren(node, level) {
    var str="";
    var i;
    for (i=0;i<level;i++) str+="  ";
    var j;
    for (j=0;j<node.getChildCount();j++) {
        print(str + node.getChildAt(j).getNodeName());
        listChildren(node.getChildAt(j), level+1);
    }
}

root = org.parosproxy.paros.model.Model.getSingleton().
        getSession().getSiteTree().getRoot();

listChildren(root, 0);

これを実行すると、例えばこんな感じのツリー表示が下のペインに作成されます。
http://localhost
  GET:dashboard
  dashboard
    images
      GET:bitnami-xampp.png
      GET:xampp-logo.svg
      GET:fastly-logo.png
      GET:social-icons.png
      GET:favicon.png
    javascripts
      GET:modernizr.js
      GET:all.js
    stylesheets
      GET:normalize.css
      GET:all.css

今回はテンプレートスクリプトを動作させてみました。

余談として、ZAPはデフォルトだとスクリプトの出力が追記になるので不便なのですが、ほうきの隣にあるこのボタンを押下すると、スクリプト実行前に前回の出力を削除してくれるので開発時などに便利です。


次は、このテンプレートスクリプトを拡張してもう少し役に立つスクリプトを作成してみます。

次へ

Leave a Reply

Powered by Blogger.
© WEB系情報セキュリティ学習メモ Suffusion theme by Sayontan Sinha. Converted by tmwwtw for LiteThemes.com.