浅谈XSS的攻击与防御

465 阅读4分钟

什么是XSS

XSS,即Cross Site Script,为了与样式表css区分开,遂在安全领域简写为XSS。XSS本质是一种“HTML注入”,即代码与数据没有明确的界限,导致数据被当做代码执行而引发的问题。

小声点,下面要开始干坏事了。

演示XSS攻击的一些案例

以下演示均假设网站没有做相应的防御措施。

  • 反射型攻击(非持久型XSS) 假如网站有个需求是携带用户输入的参数到一个新页面并展示出来,我们输入了可执行脚本 <script>alert('弹弹弹,弹出鱼尾纹~')</script>

    这样地址栏可能是这样的 www.xxx.com?param=<script>alert('弹弹弹,弹出鱼尾纹~')</script>

    那么新页面就会弹出一个弹框,更有甚者,构造出的代码是一个无限循环,浏览器将卡死……

  • 存储型攻击

    假设某网站评论区允许用户随意输入文本,我们在文本域中输入了这样的内容: 这是一段评论,<a href="http://www.这是一个危险链接">好看的东西猛戳这里</a>这是一段评论…… 评论到了公共平台以后,难免会有其他用户点击,点进去就到了钓鱼网站(甚至这是一个带有事件监听的标签eg: <span onclick="自定义脚本"></span>),目的达成。

  • DOM Based XSS

    通过修改页面的结构形成。比如: 页面上有一个编辑功能,可对用户输入的内容进行拼接并显示。当用户输入地址时,业务功能是把地址放在a标签内,变成一个 跳转链接 ,点击后能跳到输入的网页。 而代码实现是这样的:

    用户输入的地址用变量 value 表示,生成的标签代码是

    '<a href=' + value + '>跳转链接</a>'

    写这个代码的程序员非常好,简直是黑客们的卧底啊。 看我输入点啥来好呢?

    value = "' onclick=(function(){这里搞一些坏坏的事情,比如弹弹弹、发请求删东西、把你的money给我(想想都有点儿小j动)}()) //'"

    那组装一下就变成了

    <a href='' onclick=(function(){这里搞一些坏坏的事情,比如弹弹弹、发请求删东西、把你的money给我(想想都有点儿小j动)}()) //'>跳转链接</a>

    value的第一个单引号 使得 <a href=' 部分闭合; 末尾的双斜线,将最后一个单引号注释掉了。中间的点击事件,还可以阻止一下默认行为防止跳转,总之想干什么比较自由。

看到这里是不是有人已经跃跃欲试了(网警的金属手环也已急不可耐)。

有橘麻麦皮不知……来不及了,麻麦皮。

如果你觉得XSS能干的事还很少,没关系,那可能是你没了解过这项技术【窃取cookie、构造get/post请求、钓鱼、获取用户设备信息、识别用户安装的软件、CSS History Hack、获取用户真实IP地址、XSS-Proxy、XSS Worm、百度空间蠕虫事件、字符编码转义、不安全的HTML标签利用、window.name的利用、Flash XSS、sql注入、一些UI框架的漏洞……】

预防XSS攻击的一些手段

不说浏览器所做过的一些事了,只针对前后端开发者所要做的说说吧。

最常见的,输入检查。 看上面的攻击手法,输入内容是很直接的攻击方式。比如输入中是否包含 尖括号 、script 标签、JavaScript,用户名、密码等限定字符只能是数字、字母等。

输出检查 我们知道react 中有个属性名是dangerouslySetInnerHTML 用于直接将字符串形式的信息放置于标签上。通常一些转义字符有 &gt; &lt; &quot; &amp;……输出的时候进行转义,能起到一定的预防XSS的作用。类似的还有 转码函数 ,富文本数据的处理。富文本内的标签设置白名单,不常用的有潜在风险的标签禁止使用。

参考资料 《白帽子讲Web安全》,吴翰清·著