模拟一个无线弹窗的 xss 攻击请求。
以下为服务器端代码,接受 from 参数并通过 htmlspecialchars
进行过滤后输出到前端:
$from = htmlspecialchars($_GET['from']);
echo "<script>location.href='{$from}';</script>";
若此时前端访问的 url 为:
http://localhost:8080/?from=%27;alert(1)//
则最终输出到前端的内容为:
<script>location.href='';alert(1)//';</script>
分析此段输出,//
注释了后面的部分,alert
是同步 CPU 代码所以页面首先执行弹窗,然后执行 location.href=''
刷新当前页面。
最终的现象就是弹窗输出1,确定以后刷新当前页面,再次弹窗...,就造成了无限弹窗的 xss 攻击。
为什么过滤了还是无效?
因为 htmlspecialchars
是转换了双引号、尖括号和&符号,但是没有转义单引号,而且自己构造了一个脚本输出....
%27 是单引号的url编码,要了解url编码可以查看阮一峰的这篇文章http://www.ruanyifeng.com/blo...。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。