使用 Mvc Razor 字符串编码来防止 AngularJS 沙箱逃逸
Using Mvc Razor string encoding to protect against AngularJS sandbox escapes
我正在尝试了解这里的一些奇怪行为。
我将 MVC 5 与 AngularJS 版本 1.4.5 一起使用。此版本的 Angular 容易受到某些 XSS 攻击,因为您可以逃脱沙箱。
以下字符串将发出带有文本“5”的警报:
{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}
我有一个 razor 页面,Index.cshtml 包含以下 razor 代码和 HTML:
<div ng-app="">
<div>
@{
var breakAngular = "{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}";
}
@breakAngular
</div>
</div>
现在,razor 引擎将始终在呈现页面时对 html 进行编码,因此“{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}
”将转换为无害的“{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}
”
但是,当我加载页面时,警报仍然会执行。
我希望服务器端 razor 引擎在输出之前使用攻击向量对字符串进行编码,这意味着该字符串是安全的,但在加载页面时仍会执行警报。
这就像 angular 沙箱可以以某种方式访问字符串并在 razor angine 有机会清理毫无意义的字符串之前对其进行解释。
我在这里遗漏了什么,有什么方法可以防止此类漏洞?
很遗憾,目前无法更新 angularJS!
更新
显然这可以防止 angularjs 沙箱逃逸。
@Html.Raw(Html.Encode(breakAngular))
Angular 文档传统上非常清楚混合客户端和服务器端模板的危险。 Razors 的默认编码是为了在某些情况下缓解 XSS,但当然不能解决所有问题,因为不同的客户端模板框架引入了不同的模板机制。
我不会将用户提供的数据放入这样的 angular 模板中。如果您需要从服务器提供数据,解决此问题的一种方法可能是将其放在 ng-app 之外,而是使用 javascript 从 DOM.
我正在尝试了解这里的一些奇怪行为。
我将 MVC 5 与 AngularJS 版本 1.4.5 一起使用。此版本的 Angular 容易受到某些 XSS 攻击,因为您可以逃脱沙箱。
以下字符串将发出带有文本“5”的警报:
{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}
我有一个 razor 页面,Index.cshtml 包含以下 razor 代码和 HTML:
<div ng-app="">
<div>
@{
var breakAngular = "{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}";
}
@breakAngular
</div>
</div>
现在,razor 引擎将始终在呈现页面时对 html 进行编码,因此“{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}
”将转换为无害的“{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}
”
但是,当我加载页面时,警报仍然会执行。
我希望服务器端 razor 引擎在输出之前使用攻击向量对字符串进行编码,这意味着该字符串是安全的,但在加载页面时仍会执行警报。
这就像 angular 沙箱可以以某种方式访问字符串并在 razor angine 有机会清理毫无意义的字符串之前对其进行解释。
我在这里遗漏了什么,有什么方法可以防止此类漏洞?
很遗憾,目前无法更新 angularJS!
更新
显然这可以防止 angularjs 沙箱逃逸。
@Html.Raw(Html.Encode(breakAngular))
Angular 文档传统上非常清楚混合客户端和服务器端模板的危险。 Razors 的默认编码是为了在某些情况下缓解 XSS,但当然不能解决所有问题,因为不同的客户端模板框架引入了不同的模板机制。
我不会将用户提供的数据放入这样的 angular 模板中。如果您需要从服务器提供数据,解决此问题的一种方法可能是将其放在 ng-app 之外,而是使用 javascript 从 DOM.