javascript - page.evaluate() 是否存在 phantomJS 注入(inject)漏洞?

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

更新

为了更清楚地说明确切的用例。基本要点是有人会去一个 url,http://www.myapp.com/?url=http://anotherurl.com/&condition= {{javascriptstring}}。当工作人员可用时,它将启动一个幻影实例,page.open提供的 URL,然后是 condition被满足,它会截取网页的屏幕截图。这样做的目的是某些页面,尤其是那些具有大量异步 javascript 的页面,具有奇怪的“就绪”条件,不像 DOM ready 那么简单。或 window ready .这样,在 javascript 条件为真之前不会截取屏幕截图。示例包括 $(".domNode").data("jQueryUIWidget").loaded == true$(".someNode").length > 0 .

最佳答案

我对 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 做什么样的讨厌的事情,但这是一个用户能够运行他们想要的任何代码的例子,所以这听起来不是一个好主意。用户字符串实际上可以是整个程序。

澄清一下,注入(inject)漏洞不在 page.evaluate() 中,它在 您的 代码中的 eval 中。

关于javascript - page.evaluate() 是否存在 phantomJS 注入(inject)漏洞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13773478/

相关文章:

javascript - 我在使用一些 javascript do while 循环时遇到问题

javascript - JSON 中位置 0 vuejs 中的意外标记 <

javascript - 如果带有调试器语句 Javascript 的代码部署在生产环境中,会带来多少安全问题?

Javascript 插件模式 : extendable or closures?

javascript - 向 Fluxpoint api 发送请求时出错

security - 程序如何对其创建者保密?

linux - 现代 Unix/Linux 系统上的密码是否仍限制为 8 个字符?

python - 在 Phantomjs + selenium 中启用 cookie

Python 绑定(bind)到 Selenium Webdriver : ActionChain not executing in PhantomJS

java - PhantomJS 版本与 Selenium 的兼容性