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 控制台破解并没有什么不同。因此,这种用法并不代表安全漏洞。这个对吗?

更新

为了更清楚地了解确切的用例。基本要点是有人会转到一个 URL,http: //www.myapp.com/?url=http: //anotherurl.com/&condition= {{javascriptstring}}。当一个worker可用时,它会启动一个幻像实例,page.open提供的URL,然后当condition遇到时,它会截取网页的屏幕截图。这样做的目的是,某些页面,尤其是那些具有大量异步 javascript 的页面,具有不像DOM readyor那样简单的奇怪的“就绪”条件window ready。这样,在 javascript 条件为真之前不会截取屏幕截图。示例包括$(".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 或 Fragment 或 URL 的一部分,那么它很容易被利用。如果输入来自 UI,则可以通过点击劫持来利用它。

于 2012-12-08T01:29:47.633 回答