使用 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/