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 漏洞利用思路
分析发现两种可能的利用方式:
- 包含之前的页面:通过包含之前存在XSS漏洞的页面,构造XSS攻击
- 自建WEB界面:创建一个含有XSS漏洞的HTML页面,通过
ng-include包含
2.3 第一种利用方式:包含之前的页面
-
测试包含Level1页面:
http://172.16.12.153:83/level15.php?src='level1.php' -
尝试拼接XSS payload:
- 直接使用
<script>标签会被转义为HTML实体 - 但事件处理器的payload可以成功执行:
http://172.16.12.153:83/level15.php?src='level1.php?name='
- 直接使用
2.4 第二种利用方式:自建WEB界面
-
创建一个简单的含有XSS的HTML页面:
<?php header('Access-Control-Allow-Origin:*');?> <html> </html> -
关键点说明:
header('Access-Control-Allow-Origin:*'):设置CORS允许所有域访问- 使用Python启动HTTP服务:
python -m http.service
-
遇到的问题:
- 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='
关键点:
- 使用事件处理器而非
<script>标签绕过HTML实体转义 - 利用之前存在漏洞的页面作为跳板
- AngularJS的安全限制使得外部URL包含变得困难
5. 防御建议
- 对用户输入进行严格的过滤和转义
- 限制
ng-include可加载的资源范围 - 使用AngularJS的严格上下文转义(SCE)模式
- 实施内容安全策略(CSP)