一、前言

最近测试发现系统某个接口有个xss漏洞,比如,保存数据入库时,会把<a>标签保存入库;然后查看列表时,会把<a>标签显示出来;

说是这个漏洞可以构建恶意链接,点击会跳转到恶意网址,让修复掉。

二、修复方法:前端修复

这个问题之前也遇到过,于是就按照之前的修复方法,让前端加一个xss.js,过滤掉不合法的标签后,再把数据传给后台。

谁知道这次不行了,测试直接抓包,用postman直接给后台发送含有<a>标签的请求,结果又存入数据库了。

如果从前端输入含有<a>标签的请求,点击保存,那样前端就会用xss.js把<a>标签过滤后发给后台,是没有问题的;

但是如果抓包,直接给后台发请求,那还是存在xss.js漏洞。(而且抓包测试过分了吧,那样好多系统岂不是都有漏洞了)

三、修复方法:后端修复(springboot项目)

为了符合要求,准备在后端Controller处增加过滤器,判断,如果请求报文中的参数含有不合法标签(<a>标签等),就过滤掉这个请求,不继续处理,返回错误信息。

结果踩了一堆坑,才好不容易弄好。

先发下修复流程:

1.先写一个全局过滤器(/*),用来让HttpServletRequest.getInputStream()获取的流可以重复读取,可以参考下面的文章:
https://blog.51cto.com/u_3664660/3212696

2.再写一个拦截器,拦截指定url(/save),就是保存数据库的那个url:

这个拦截器中,会使用HttpServletRequest.getInputStream()获取请求体内容(json传递的数据,就需要这样获取);

也会使用request.getParameterNames().hasMoreElements()request.getParameter(request.getParameterNames().nextElement())等方法,获取key-value传参中的所有value;

然后用方法pattern.matcher(value).find()匹配这些参数,如果符合匹配条件,就拦截这条请求,不继续处理,返回错误信息;

匹配规则样例为:

Pattern pattern = Pattern.compile("(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\\b(select|update|union|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|drop|execute)\\b)|(<a)|(<abbr)|(<address)|(<area)|(<article)|(<aside)|(<audio)|(<b)|(<bdi)|(<bdo)|(<big)|(<blockquote)|(<br)|(<caption)|(<center)|(<cite)|(<code)|(<col)|(<colgroup)|(<dd)|(<del)|(<details)|(<div)|(<dl)|(<dt)|(<em)|(<figcaption)|(<figure)|(<font)|(<footer)|(<h1)|(<h2)|(<h3)|(<h4)|(<h5)|(<h6)|(<header)|(<hr)|(<i)|(<img)|(<ins)|(<li)|(<mark)|(<nav)|(<ol)|(<p)|(<pre)|(<s)|(<section)|(<small)|(<span)|(<sub)|(<summary)|(<sup)|(<strong)|(<strike)|(<table)|(<tbody)|(<td)|(<tfoot)|(<th)|(<thead)|(<tr)|(<tt)|(<u)|(<ul)|(<video)", 2);

这个规则是本人根据xss.js写的,意思是,如果请求数据中包含了这些非法标签,就拦截掉,返回错误信息,不让这些数据保存入数据库。

可以参考这个文章:https://blog.csdn.net/meser88/article/details/121211112

四、踩坑记录

修复方法按照上面的后端修复就没什么问题了,下面记录下踩过的坑。

1.@WebFilter和@Component一起使用导致urlPatterns不起作用

本来最开始是想写个过滤器过滤指定url的,结果发现这个过滤器过滤了所有路径的url;

后来才发现@WebFilter和@Component不能一起用,应该在过滤器里用@WebFilter,在启动类Application.java里用@ServletComponentScan去扫描那个过滤器才对。

可以参考这篇文章:https://blog.csdn.net/weixin_38152047/article/details/121244269

2.httpServletRequest.getInputStream()不能重复读取的坑

为了判断请求数据(json)是否包含非法标签,只能把流读取出来再判断;

可是在过滤器/拦截器里读取完流后,发现流没有问题、放行给Controller时,就会报错:流不能再次读取。

百度了好多方法,有给流设置mark()与reset()的,不过请求流不支持这样;

最后还是用了一个全局过滤器,封装了个HttpServletRequestWrapper类解决的。

可以参考这篇文章:https://blog.51cto.com/u_3664660/3212696

3.正则表达式拦截非法标签的坑

这个其实是个小坑;刚开始本人准备拦截<a>这样的;

后来才想到,这样不行,a标签里面是有参数的;

因此改为了拦截<a这样的,只要报文里匹配到这个,就拦截掉。

xss漏洞修复踩坑总结相关推荐

  1. Web安全原理剖析(十八)——XSS平台及漏洞修复建议

    目录 5.2 使用XSS平台测试XSS漏洞 5.3 XSS漏洞修复建议 5.2 使用XSS平台测试XSS漏洞   XSS平台可自行本地搭建或使用在线平台.   首先在XSS平台注册账号并登录,单击&q ...

  2. XSS漏洞原理和利用

    XSS漏洞原理和利用 XSS漏洞的危害 1.窃取用户Cookie,如果用户Cookie被窃取,攻击者可以不通过密码,而直接登录用户账户 2.使用XMLHttpRequest构造模拟用户请求操作 3.X ...

  3. 开源工具 PrivateBin 修复XSS 漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 PrivateBin 是热门 ZeroBin 的一个分叉,它是一款在线工具,用于存储信息并通过 256位 AES 在浏览器中加密/解密,即服务器 ...

  4. 速修复!开源编辑器CKEditor 中存在两个严重XSS漏洞,影响Drupal 和其它下游应用...

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 专栏·供应链安全 数字化时代,软件无处不在.软件如同社会中的"虚拟人",已经成为支撑社会正常运转的最基本元素之一,软件的安全 ...

  5. 开源内容管理系统Drupal 修复信息泄露和 XSS 漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本周,开源的内容管理系统 Drupal 修复了多个信息泄露和跨站点脚本 (XSS) 漏洞,其中包括一个"严重"级别 ...

  6. Drupal 更新开源编辑器 CKEditor,修复两个 XSS 漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本周三,Drupal 内容管理系统开发人员宣布称更新了版本8.8.x和8.7.x,解决了影响 CKEditor 库的多个漏洞. CKE ...

  7. XSS安全漏洞修复解决方案

    背景:等保测评公司针对我系统进行了一次渗透测试,并发现存在XSS漏洞,现记录修复过程. 框架:SSM. 全站XSS: 漏洞风险等级:中危 涉及页面:全站存在内容输入处 漏洞描述:所有模块可以修改内容处 ...

  8. Vue 踩坑笔记: 引入 ElementUI 时打包失败修复记录(ERROR in ./node_modules/element-ui/lib/theme-chalk/index.css)

    Vue 踩坑笔记: 引入 ElementUI 时打包失败修复记录(ERROR in ./node_modules/element-ui/lib/theme-chalk/index.css Module ...

  9. XSS漏洞及修复方案

    XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序.这些恶意网页程序通常是JavaScript,但实际上也可以包括Java ...

最新文章

  1. oracle数据导出方法,oracle多种导入导出数据方法
  2. python语言入门教程-Python语言十分钟快速入门
  3. mysql 二进制日志详解_Mysql二进制日志详解
  4. 无监督和有监督的区别_无监督元学习(Unsupervised Meta-Learning)
  5. JAVA Stack栈和Heap堆的区别(转)
  6. python列表转字节_如何在Python中将十进制数转换为字节列表
  7. 第16课 开灯关灯 《小学生C++趣味编程》
  8. python编程胡牌将是什么意思_python麻将和牌算法
  9. FPGA 串口中断_一个严谨的STM32串口DMA发送amp;接收(1.5Mbps波特率)机制
  10. NCBI引物设计-查找目的基因前后序列方法、序列比对
  11. android管理交换机,用手机android超级终端 如何开启交换机端口
  12. 计算机一级考试题产品销售情况表,Excel案例(十二)——销售统计表
  13. 微信小程序wx.createInnerAudioContext使用方法
  14. CSDN不友好的收藏夹
  15. 知识欠缺到沙漠化了吧
  16. 阿里云SSL数字证书Nginx配置部署
  17. Java学习路线!Javacad二次开发
  18. FE内容付费系统响应式(带手机版) v5.46
  19. 程序员常见700单词
  20. 软件ios软件测试,【松勤软件测试】ios app测试注意地方

热门文章

  1. Win7系统Microsoft Office Word已停止工作完美解决
  2. APP安全--网络传输安全 AES/RSA/ECC/MD5/SHA
  3. 前端之使用NodeJS+Cheerio实现网络爬虫图解
  4. 银行业务笔记之存款业务
  5. 第一次面试经历(全程尴尬)
  6. STM32实现水下四旋翼(一)飞行原理
  7. 推荐 8 个支持 Vue3 的前端 UI 组件库,免费开源、漂亮美观,涵盖常用的业务组件
  8. DQN(Deep Q Network)论文笔记
  9. 2020网易笔试第四题
  10. onkeydown事件的拦截