【问题标题】:Is there a phantomJS injection vulnerability in page.evaluate()?page.evaluate() 中是否存在 phantomJS 注入漏洞?
【发布时间】:2012-11-26 05:52:26
【问题描述】:

使用 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);
});

据我了解,page.evaluate() 中出现的eval() 可以防止它们逃离打开的页面的上下文。用户 javascript 字符串作为字符串传递(它不会“编译”成单个 javascript 文件)。在我看来,这与用户使用浏览器浏览网站并试图通过他们最喜欢的 Javascript 控制台破解并没有什么不同。因此,这种用法并不代表安全漏洞。这是正确的吗?

更新

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

【问题讨论】:

  • 听起来不错。与使用 jsfiddle 或其他东西没有什么不同,只要它不为脚本作者以外的用户执行……但我可能会弄错。
  • @Wesley Murch 是的,除了在 jsfiddle 上没有要劫持的会话...
  • @Rook:是的,注意到了,但只要第二部分是真的?我不熟悉 PhantomJS,所以无法评论 “有没有办法从浏览器上下文逃到 phantomJS 环境,从而在我们的服务器上执行命令?”...我们可能需要更多上下文这里也有核子。
  • @Wesley Murch 基于 dom 的 xss 的要点是在网站上下文中的浏览器上执行 javascript,这是一个可用于劫持帐户的严重漏洞。我也更新了我的帖子;。

标签: javascript security phantomjs


【解决方案1】:

我对 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 中。

【讨论】:

  • 用户字符串可以是整个程序,这完全没问题。来自 PhantomJS 文档:page.evaluate:evaluates the given function in the context of the web page. The execution is sandboxed, the web page has no access to the phantom object and it can't probe its own setting. 与我访问该 URL 并在窗口中输入 console.log("") 有何不同。我可以访问 Internet 上的任何网站,并使用我的浏览器在其上执行无限量的 Javascript。但是没有什么害处,因为我的黑客行为不会干扰或影响该网站的任何其他访问者。
  • 我假设不同之处在于:1)代码在您的服务器上执行,而不仅仅是用户的浏览器(对吗?)。如果您可以让用户基本上将他们想要的任何代码粘贴到您执行eval() 的位置,那么我想这很好。 2)与 Rook 的回答相关,如果用户可以与嵌入式代码共享链接(看起来就是这种情况),那么您的网站可能会提供 xss 有效负载。甚至像使用while(1){} 或任何其他无限循环使用户的浏览器崩溃(或可能锁定整个系统)这样的愚蠢行为,都是因为eval 函数。
  • 无限循环会做什么,例如,在我向一个页面发送数千个请求之后,该页面将在您的服务器上执行它?或者,如果您将最恶意的代码粘贴到page.evaluate 回调中,可能发生的最坏情况是什么?这就是你允许的。再一次,这是危险的 eval 位。我可能在这里遗漏了重要的细节,所以我很期待您的回复,因为我很好奇。
【解决方案2】:

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

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

【讨论】:

  • 仅当页面对象或其派生对象与其他用户共享时。对吗?
  • @rambo coder 否,它必须可以通过 Fragment/URL GET 或 POST 访问。所以攻击者必须能够将用户重定向到这个页面。
  • @Rook 我不明白。 DOM XSS 仅在我修改 your dom 时才有效。但是,如果你修改自己的 DOM,那有什么害处呢?
  • @Nucleon {{USER JAVASCRIPT STRING}} 来自哪里?这是 GET、POST 还是 Fragment?是页面上的表格吗?
  • 即使经过您的编辑,我仍然不明白您所指的攻击向量。如何通过在自己的窗口中执行 javascript 对他人造成伤害?您能否在 phantomjs 上下文中提供一个会导致此问题的具体示例,以便我更好地理解。我没有看到我的场景和 XSS/Clickjacking 之间的联系。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 2011-06-10
  • 2010-11-05
  • 2017-05-28
  • 1970-01-01
  • 2020-08-21
相关资源
最近更新 更多