模拟一个无线弹窗的 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...


Donne
694 声望25 粉丝

知其然,知其所以然。


引用和评论

0 条评论