跨站点脚本 (XSS) 可能吗?

Cross site scripting (XSS) possible?

我在我的应用程序中发现了以下代码:

eval( 'window.opener.' + fct );

变量 fct 来自 GET 参数(因此可以由用户更改)。

是否可以传递一些邪恶的值来执行JavaScript?我不确定,因为如果您更改 URL 并将 link 发送给用户,然后他点击它,"window.opener" 将为空,因此会抛出错误:

eval( 'window.opener.x; alert(1);' ); // Uncaught TypeError: Cannot read property 'x' of null

是否存在任何可能导致安全问题的攻击媒介?我知道,你永远不应该使用 eval() - 但我也会尝试找到概念证明。

谢谢!

Is there any attack vector, that could cause a security problem?

是的。您正在执行任意 JavaScript。任何代码都可以是运行。这是一个严重的安全问题。

首先,JavaScript上下文中使用的任何可变数据都应该是JSON编码的,这与JavaScript兼容。您没有说明您使用的是什么服务器端语言,所以这里有一个 PHP 示例来说明:

var fct = <?php echo json_encode($_GET['fct']); ?>;

如果 fct 是从查询字符串客户端解析的,则这个紧迫的问题不存在,因为此时您没有将任意字符串解析为 JavaScript。但是,您仍然遇到评估问题。

您应该将代码重写为:

window.opener[fct]

这样一来,您只引用了您需要的内容,而无需注入脚本。

现在,您还需要将此变量中的内容列入白名单,opener 是否应该包含您不想公开的内容。

如果 fctx = alert('yes') 那么它将导致:

window.opener.x = alert('yes')

表达式的右侧将首先被计算,允许代码执行。

如果你不想触发任何错误,你可以这样做:

window.opener.x = (window.opener={pwnd:confirm('game over')})