渗透实战PortSwigger Labs AngularJS DOM XSS利用详解

本Lab学习到关于AngularJS的 xss 漏洞利用

直接输入回显页面,但是把<>进了 html 编码了

当我们输入{``{1+1}},没有当作字符处理,而是执行了

{``{}} 是多种前端框架(如 Vue、Angular、Django 模板等)中常见的模板插值语法,主要用于将数据动态绑定到视图,双花括号 {``{1+1}} 包裹的表达式会执行运算。

测试{``{alert()}},因为存在沙箱机制过滤了危险字符

这里用到新的绕过方法{``{ $eval.constructor('alert()')() }}

下面分析为什么这样可以执行alert()

创建 AngularJS 代码

html 复制代码
<!DOCTYPE html>
<html>
  <head>
    <title>AngularJS</title>
    <!-- 引入AngularJS库(1.6.9版本) -->
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
  </head>
  <!-- 定义Angular应用(模块名为myApp)和控制器(myCtrl)的作用域 -->
  <body ng-app="myApp" ng-controller="myCtrl">
    <!-- 双向数据绑定:显示$scope.firstName的值 -->
    {{ firstName }}
    <!-- 表达式计算:直接输出1+1的结果2 -->
    {{ 1+1 }}            
  </body>

  <script>
    // 创建AngularJS模块(名为myApp),空数组表示无依赖模块
    var app = angular.module("myApp", []);

    // 定义控制器myCtrl,注入$scope服务
    app.controller("myCtrl", function($scope) {
      // 在$scope上定义firstName属性,初始值为"John"
      $scope.firstName = "John";
    });
  </script>
</html>

当我们在代码中加入{``{ $eval.constructor('alert()')() }},通过构造函数执行alert()

创建一个<p id="test"></p>
angular.element(document.getElementById('test')).scope();获取的作用域对象
$id=2是子作用域

任何时候我们创建 javascript 对象,都会从原型Prototype继承一些默认属性,例如$eval$on


$id=1是根作用域,来自Prototype

我们可以定义一个函数function test(),最后通过test()调用这个函数执行打印输出Hello world!

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/Function手册中查看关于Function() Constructor

虽然这是创建函数的方式,但不推荐这样做

根据上面的方法重新写一个函数

若不将函数赋给某个变量,将不会执行

记住前面说的

我们直接在后面加()即可调用函数

所以此时再看本次Lab解题 payload最后这个()就是在调用前面通过构造函数创建的函数

这次我们直接看下test()函数的构造函数,就是Function()构造函数,因为它可以创建Function对象

在AngularJS中,$onScope对象的方法,用于监听事件。作为函数,它本身是Function的实例,因此其constructor属性指向Function构造函数

$on.constructor('alert()') 等价于 Function('alert()'),生成一个匿名函数,再通过 () 调用该函数,于是就形成了最终的 payload

为什么不能直接{``{Function('alert()')()}},因为有防护机制,所以要用scope对象的方法的构造函数传入 payload 执行

PortSwigger 靶场实战持续更新中

bash 复制代码
echo "Quermeinhumike+8mmh0dHBzOi8vd3d3LmJpbGliaWxpLmNvbS92aWRlby9CVjE4cDdyejhFaDgv
P3ZkX3NvdXJjZT0zMGU4ODFmYzYxYjJkYWFjMDVmYWFkN2RmZjAyMjMxZgo="|base64 -d
相关推荐
未来龙皇小蓝9 小时前
RBAC前端架构-02:集成Vue Router、Vuex和Axios实现基本认证实现
前端·vue.js·架构
晓得迷路了9 小时前
栗子前端技术周刊第 116 期 - 2025 JS 状态调查结果、Babel 7.29.0、Vue Router 5...
前端·javascript·vue.js
顾北1210 小时前
AI对话应用接口开发全解析:同步接口+SSE流式+智能体+前端对接
前端·人工智能
摸鱼的春哥10 小时前
春哥的Agent通关秘籍07:5分钟实现文件归类助手【实战】
前端·javascript·后端
念念不忘 必有回响10 小时前
viepress:vue组件展示和源码功能
前端·javascript·vue.js
C澒10 小时前
多场景多角色前端架构方案:基于页面协议化与模块标准化的通用能力沉淀
前端·架构·系统架构·前端框架
崔庆才丨静觅10 小时前
稳定好用的 ADSL 拨号代理,就这家了!
前端
江湖有缘10 小时前
Docker部署music-tag-web音乐标签编辑器
前端·docker·编辑器
恋猫de小郭11 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
崔庆才丨静觅18 小时前
hCaptcha 验证码图像识别 API 对接教程
前端