使用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控制台进行破解之间没有什么不同。因此,此用法不代表安全漏洞。这是对的吗?
更新
为确切的用例提供更多清晰度。基本要点是有人会转到网址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
。
答案 0 :(得分: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
。
答案 1 :(得分:1)
是的,这是DOM based XSS。这是一个漏洞,可用于劫持用户(或管理)会话并使用户暴露于其他攻击。
如果输入来自GET / POST或片段或URL的一部分,那么它很容易被利用。如果输入来自UI,则可以是exploited with clickjacking。