XSSLab-level15
字数 1132 2025-08-12 11:34:37

AngularJS ng-include 指令的XSS漏洞分析与利用

1. 漏洞背景

本文分析的是XSSLab第15关的漏洞,主要涉及AngularJS中的ng-include指令的安全问题。该漏洞允许攻击者通过构造特定的URL参数,实现跨站脚本攻击(XSS)。

2. 漏洞分析

2.1 ng-include指令功能

ng-include是AngularJS中的一个指令,用于包含外部的HTML文件。其基本语法为:

<div ng-include="'external.html'"></div>

2.2 漏洞利用思路

分析发现两种可能的利用方式:

  1. 包含之前的页面:通过包含之前存在XSS漏洞的页面,构造XSS攻击
  2. 自建WEB界面:创建一个含有XSS漏洞的HTML页面,通过ng-include包含

2.3 第一种利用方式:包含之前的页面

  1. 测试包含Level1页面:

    http://172.16.12.153:83/level15.php?src='level1.php'
    
  2. 尝试拼接XSS payload:

    • 直接使用<script>标签会被转义为HTML实体
    • 但事件处理器的payload可以成功执行:
      http://172.16.12.153:83/level15.php?src='level1.php?name='
      

2.4 第二种利用方式:自建WEB界面

  1. 创建一个简单的含有XSS的HTML页面:

    <?php header('Access-Control-Allow-Origin:*');?>
    <html>
    
    </html>
    
  2. 关键点说明:

    • header('Access-Control-Allow-Origin:*'):设置CORS允许所有域访问
    • 使用Python启动HTTP服务:
      python -m http.service
      
  3. 遇到的问题:

    • AngularJS的安全限制阻止了来自不受信任源的资源加载
    • 错误信息:$sec:insecurl - 对来自不受信任源的资源的处理被阻止

3. 关键知识点

3.1 CORS机制

跨域资源共享(CORS)允许浏览器向跨源服务器发出XMLHttpRequest请求,克服AJAX的同源限制。

  • 简单请求:浏览器直接发出CORS请求,在头信息中增加Origin字段
  • 服务器响应
    • 若未包含Access-Control-Allow-Origin:请求失败
    • 若包含Access-Control-Allow-Origin: *:允许所有域访问
    • 若指定特定域名:仅允许该域名访问

3.2 AngularJS安全限制

AngularJS默认阻止来自不受信任URL的资源加载,这是比CORS更严格的限制。即使设置了CORS头,如果URL不在AngularJS的白名单中,请求仍会被阻止。

4. 漏洞利用总结

成功利用的payload:

http://172.16.12.153:83/level15.php?src='level1.php?name='

关键点:

  1. 使用事件处理器而非<script>标签绕过HTML实体转义
  2. 利用之前存在漏洞的页面作为跳板
  3. AngularJS的安全限制使得外部URL包含变得困难

5. 防御建议

  1. 对用户输入进行严格的过滤和转义
  2. 限制ng-include可加载的资源范围
  3. 使用AngularJS的严格上下文转义(SCE)模式
  4. 实施内容安全策略(CSP)
AngularJS ng-include 指令的XSS漏洞分析与利用 1. 漏洞背景 本文分析的是XSSLab第15关的漏洞,主要涉及AngularJS中的 ng-include 指令的安全问题。该漏洞允许攻击者通过构造特定的URL参数,实现跨站脚本攻击(XSS)。 2. 漏洞分析 2.1 ng-include指令功能 ng-include 是AngularJS中的一个指令,用于包含外部的HTML文件。其基本语法为: 2.2 漏洞利用思路 分析发现两种可能的利用方式: 包含之前的页面 :通过包含之前存在XSS漏洞的页面,构造XSS攻击 自建WEB界面 :创建一个含有XSS漏洞的HTML页面,通过 ng-include 包含 2.3 第一种利用方式:包含之前的页面 测试包含Level1页面: 尝试拼接XSS payload: 直接使用 <script> 标签会被转义为HTML实体 但事件处理器的payload可以成功执行: 2.4 第二种利用方式:自建WEB界面 创建一个简单的含有XSS的HTML页面: 关键点说明: header('Access-Control-Allow-Origin:*') :设置CORS允许所有域访问 使用Python启动HTTP服务: 遇到的问题: AngularJS的安全限制阻止了来自不受信任源的资源加载 错误信息: $sec:insecurl - 对来自不受信任源的资源的处理被阻止 3. 关键知识点 3.1 CORS机制 跨域资源共享(CORS)允许浏览器向跨源服务器发出XMLHttpRequest请求,克服AJAX的同源限制。 简单请求 :浏览器直接发出CORS请求,在头信息中增加 Origin 字段 服务器响应 : 若未包含 Access-Control-Allow-Origin :请求失败 若包含 Access-Control-Allow-Origin: * :允许所有域访问 若指定特定域名:仅允许该域名访问 3.2 AngularJS安全限制 AngularJS默认阻止来自不受信任URL的资源加载,这是比CORS更严格的限制。即使设置了CORS头,如果URL不在AngularJS的白名单中,请求仍会被阻止。 4. 漏洞利用总结 成功利用的payload: 关键点: 使用事件处理器而非 <script> 标签绕过HTML实体转义 利用之前存在漏洞的页面作为跳板 AngularJS的安全限制使得外部URL包含变得困难 5. 防御建议 对用户输入进行严格的过滤和转义 限制 ng-include 可加载的资源范围 使用AngularJS的严格上下文转义(SCE)模式 实施内容安全策略(CSP)