page.evaluate()中是否存在phantomJS注入漏洞?

时间:2012-12-08 01:20:28

标签: javascript security phantomjs

使用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}}。当一名工作人员可用时,它将启动虚拟实例,page.open提供的URL,然后当满足condition时,它将截取该网页的屏幕截图。这样做的目的是某些页面,特别是那些具有大量异步javascript的页面,具有奇怪的“就绪”条件,这些条件不像DOM readywindow ready那么简单。这样,在javascript条件为真之前不会截取屏幕截图。示例包括$(".domNode").data("jQueryUIWidget").loaded == true$(".someNode").length > 0

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

是的,这是DOM based XSS。这是一个漏洞,可用于劫持用户(或管理)会话并使用户暴露于其他攻击。

如果输入来自GET / POST或片段或URL的一部分,那么它很容易被利用。如果输入来自UI,则可以是exploited with clickjacking