游客发表
<script>alert('Hello,站脚 world!')</script> 就这三行,2015年我拿它黑进了一家电商后台。站脚不是站脚吹,当时那个管理员只要点开商品编辑页,站脚我就能看到他后台的站脚所有订单——包括他的登录密码,明文存的站脚那种。
XSS全名叫跨站脚本攻击,站脚本质就一句话:你往别人的站脚网页里塞自己的代码,然后让别人的站脚浏览器帮你执行。受害者访问正常网站,站脚却中了你的站脚招,浏览器分不清哪段脚本是站脚网站自己写的,哪段是站脚你注入的。
最常见的站脚坑在输入框。评论区、站脚搜索栏、用户名——凡是用户能打字的地方,都可能成为突破口。比如你注册个昵称叫<img src=x onerror=alert(1)>,如果网站没过滤,别人一看到你的昵称,弹窗就出来了。这是最基础的反射型,骗点击用的。
真正狠的是存储型。你把恶意脚本存在服务器上,所有访问页面的人都遭殃。论坛帖子里藏一段,管理员一审核就中招——这叫“钓管理员”。黑客拿到管理员的cookie,等于拿到整个网站的钥匙。
还有第三种DOM型,不走服务器,纯前端搞事。URL里的参数被JavaScript直接拼进DOM,你改一下地址栏的#后面的内容就能触发。这种最难防,因为服务器端根本看不见攻击流量。
我见过最骚的操作,是有人在招聘网站的“期望薪资”栏里塞了段JavaScript。HR一打开简历,脚本自动把他的期望薪资改成1块钱,然后以他的名义给HR发了一封“我免费干活”的邮件。虽然最后没成,但思路绝了——人类对输入框的信任,远大于对代码的警惕。
防御手段其实不玄乎。核心原则就一条:永远不信任用户输入。输出到HTML的时候,把<转成<,把引号转成实体编码。现在主流框架都自动做了这件事——React默认转义,Vue也是。但总有人关掉它,用v-html直接插原始HTML,等于把城门打开。
另一个坑是白名单永远比黑名单可靠。你滤掉script标签,人家用img的onerror属性;你滤掉onerror,人家用svg的onload;你滤掉所有事件属性,人家用javascript:伪协议。黑名单永远追不完,白名单只放行你允许的标签和属性,剩下的全砍。
前阵子看某大厂漏洞报告,一个存储型XSS挂了三年没人发现。位置在用户头像的“图片描述”字段,过滤了标签但没滤掉Markdown的图片语法——)。前端渲染Markdown时没做协议校验,直接拼进href。你说这算谁的锅?框架背一半,写过滤逻辑的人背另一半。
说到底,XSS不是技术难题,是安全意识问题。你代码写得再漂亮,只要有一处没转义,整栋楼就塌了。就像锁门——你装了再贵的锁,忘关窗户照样进贼。而且这贼偷完东西,你还以为是自家人干的。
友情链接