4

PhantomJS を使用すると、ブラウザでコードを実行できますpage.evaluate()。そのブラウザー コンテキストで実行できるコードをユーザーが指定できるようにすると、攻撃ベクトルにさらされることになりますか? ブラウザのコンテキストからphantomJS環境にエスケープして、サーバー上でコマンドを実行する方法はありますか?

次に例を示します。

page.open(options.url, function(status) {
    var test = function() {
            return page.evaluate(function() {
                return eval({{USER JAVASCRIPT STRING}});
            });
    });

        var interval = setInterval(function() {
          if (test()) {
            clearInterval(interval);
            // take screenshot, do other stuff, close phantom
          }
        }, 250);
});

私の理解では、eval()内部で発生するpage.evaluate()と、開かれたページのコンテキストから逃れることができなくなります。ユーザー JavaScript 文字列は文字列として渡されます (単一の JavaScript ファイルに「コンパイル」されません)。ユーザーがブラウザでサイトを閲覧し、お気に入りの Javascript コンソールからハッキングしようとするのと同じように思えます。したがって、この使用法はセキュリティ上の脆弱性を表すものではありません。これは正しいです?

アップデート

正確なユースケースについてもう少し明確にするため。基本的な要点は、誰かがhttp://www.myapp.com/?url=http://anotherurl.com/&condition= {{javascriptstring}} という URL にアクセスすることです。ワーカーが利用可能になると、指定されpage.openた URLでファントム インスタンスが起動され、指定された URLconditionに到達すると、Web ページのスクリーンショットが取得されます。これの目的は、一部のページ、特に大量の非同期 JavaScript を含むページに、DOM readyまたはほど単純ではない奇妙な「準備完了」条件があることwindow readyです。この方法では、javascript 条件が true になるまでスクリーンショットは取得されません。例には、$(".domNode").data("jQueryUIWidget").loaded == trueまたはが含まれます$(".someNode").length > 0

4

2 に答える 2

2

私は PhantomJS にあまり詳しくありませんが、eval未知のコードを実行することに関しては、本質的に安全ではありません。意図したコンテキストをエスケープするのは非常に簡単です。

return page.evaluate(function() {
    return eval({{javascriptstring}});
});

http://example.com/?url=http://anotherurl.com/&condition={{javascriptstring}}

{{javascriptstring}}等しい場所はどうですか:

console.log('All your script are belong to us');

PhantomJS でどんな厄介なことができるかはわかりませんが、これはユーザーが必要なコードを実行できる例であるため、これは良い考えとは思えません。ユーザー文字列は文字通りプログラム全体である可能性があります。

明確にするために、インジェクションの脆弱性は ではなく、コードpage.evaluate()evalにあります

于 2012-12-10T12:04:25.847 に答える
1

はい、これはDOM ベースの XSSです。これは、ユーザー (または管理者) のセッションをハイジャックし、ユーザーを他の攻撃にさらすために使用できる脆弱性です。

入力が GET/POST、フラグメント、または URL の一部からのものである場合、悪用は非常に簡単です。入力が UI からのものである場合、クリックジャッキングで悪用される可能性があります。

于 2012-12-08T01:29:47.633 に答える