XSS介绍

XSS: Cross site scripting,跨站脚本攻击

本来应该叫做CSS,但是css常常代表样式,所以就改用X

原理:用户的数据被当作脚本执行了

XSS主要是通过加入script脚本获取到用户的cookie,然后就可以登陆进行一些欺骗操作了

攻击手段:

  • 把带有script标签的url发给用户,如果用户点击了,就会被攻击(如果链接可疑,则使用短链)
  • 输入框输入攻击脚本

场景:

QQ空间进入到别人空间,然后发现自己就被盗号了

XSS攻击类型

两大类型

  • 反射型:通过url参数直接注入,然后把url发送给受害者(如果直接给用户肯定看的出来,这个时候做成短链)
  • 注入型:存储到DB后读取时注入,比如评论里添加xss攻击

XSS攻击注入点:

  • HTML节点内容,实例:
    • from=beijing<script>alert(1)</script>
    • 评论区添加xss攻击
  • HTML属性:img src=image/1" onerror="alert(1),中间这样添加就可以攻击
  • javascript代码:from=beijing";alert(1);",默认都有开始和闭合的引号
  • 富文本: 评论区添加富文本

XSS防御:

两种思路:

  • 数据不要变成脚本可执行程序
  • 变成了程序也不让他执行

具体方法:

  • 浏览器自带的会防御注入到HTML节点和属性的XSS攻击,但是通过url注入到js代码的工具不会防御,如果后台关闭X-XSS-Protection,就可以让浏览器不防御
  • 转译成HTML实体相应字符实体表
    • HTML内容转译,只显示text内容,只需要 < => $gt; > => $lt;
    • HTML属性转译,主要是 单引号、双引号、空格
    • javascript代码转译:如果用的是属性转译js显示就有问题
      • " => \",' => \',
      • \ => \\,情型:from=beijing";alert(1);//", //代表注释
      • 终极解决方法: JSON.stringify(xxx),这样外面就默认是带有双引号了

        注意点:js中带有,浏览器自动就会拦截报错

    • 富文本过滤: 需要保留一些html标签,所以不能转译,而是过滤
      • 黑名单过滤(变种太多了,所以写的不一定完整,不推荐使用)site.js查看具体内容
      • 白名单进行过滤

框架的xss

三大框架React\Vue\Angular默认自带防御xss

React参考

Angular参考

Vue参考

防御点:能不用innerHTML就不要使用