AngularJS表达式中$on.constructor的作用是什么?
$on.constructor在AngularJS XSS payload中的作用 你遇到的这个是AngularJS 1.x版本沙箱绕过的经典payload,$on.constructor的核心作用就是绕开Angular对表达式的执行限制,拿到原生JS的Function构造器,最终实现任意代码执行。
具体拆解逻辑:
- AngularJS的双大括号
{{}}表达式默认跑在沙箱环境里,不是直接执行原生JavaScript:沙箱会拦截对window、Function这类高危全局对象的直接访问,你要是直接在{{}}里写alert(1)或者new Function('alert(1)')(),会直接被沙箱拦下报错,根本跑不起来。 $on是AngularJS作用域(scope)对象上自带的内置方法,作用是绑定作用域级别的事件监听,属于Angular默认允许在表达式里访问的合法属性,不会触发沙箱拦截。- 所有JavaScript函数的
.constructor属性,都指向原生的Function构造函数——这是JS语言本身的特性,和函数是谁定义的没关系。所以写$on.constructor本质就是绕了个弯,不用直接引用全局的Function,就拿到了被沙箱禁止直接访问的原生Function构造器。
把整个payload串起来看逻辑就很顺了:
$on.constructor('alert(1)')等价于new Function('alert(1)'),把传入的字符串编译成一个原生可执行的JS函数- 末尾的
()就是调用这个刚生成的函数,最终执行alert(1)触发弹窗,完成XSS利用。
这类绕过的核心思路其实很简单:Angular沙箱只会拦截你直接写Function的场景,没防住“通过合法可访问的对象反查它的构造器”这条路径,后续很多Angular沙箱绕过的变种,本质都是换了个Angular允许访问的函数/对象来取constructor,原理完全一致。
内容的提问来源于stack exchange,提问作者questioner
相关产品推荐
相关产品推荐

