【发布时间】: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 ready 或 window 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