跨站点脚本 (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
是否应该包含您不想公开的内容。
如果 fct
是 x = alert('yes')
那么它将导致:
window.opener.x = alert('yes')
表达式的右侧将首先被计算,允许代码执行。
如果你不想触发任何错误,你可以这样做:
window.opener.x = (window.opener={pwnd:confirm('game over')})
我在我的应用程序中发现了以下代码:
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
是否应该包含您不想公开的内容。
如果 fct
是 x = alert('yes')
那么它将导致:
window.opener.x = alert('yes')
表达式的右侧将首先被计算,允许代码执行。
如果你不想触发任何错误,你可以这样做:
window.opener.x = (window.opener={pwnd:confirm('game over')})