• 【安全】 Java 过滤器 解决存储型xss攻击问题


    XSS简介

    跨站脚本( cross site script )为了避免与样式css(Cascading Style Sheets层叠样式表)混淆,所以简称为XSS。

    XSS是一种经常出现在web应用中的计算机安全漏洞 ,也是web中最主流的攻击方式。

    什么是XSS?

    XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。

    从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

    分类

    反射型

    反射型xss攻击( Reflected XSS)又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻

    击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的链接( 即每次攻击需要用户的点击)。

    存储型

    存储型XSS (Stored XSS)又称为持久型跨站点脚本,它一般发生在XSS攻击向量 (一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大,因为每当用户打开页面,查看内容时脚本将自动执行。谷歌的orkut 曾经就遭受到XSS。

    两种类型实现的结果完全相同,不同的是前者需要点击,后者存在于网页的数据库内

    XSS(cross site script)跨站脚本攻击攻击场景

    攻击者可以通过构造URL注入JavaScript、VBScript、ActiveX、HTML或者Flash的手段,利用跨站脚本漏洞欺骗用户,收集Cookie等相关数据并冒充其他用户。通过精心构造的恶意代码,可以让访问者访问非法网站或下载恶意木马,如果再结合其他攻击手段(如社会工程学、提权等),甚至可以获取系统的管理权限。

    举例说明
    例如:在项目看板里待材料初审存储下面代码,点击A项目会弹出框

    Payload: <iframe οnlοad=alert("xss");></iframe>
    
    • 1

    在这里插入图片描述

    例如 全部阶段结果标准-存储下面代码,点击20200927测试-2

    Payload: <textarea οnfοcus=alert("xss"); autofocus>
    
    • 1

    解决方案

    找到项目已有的filter过滤器,在过滤HttpServletRequest参数时,进行参数的处理,使用转义,将 < 转义为 & lt , > 转义为 & gt

    public PaasHttpRequestWrapper(HttpServletRequest request) {
            super(request);
            StringBuilder stringBuilder = new StringBuilder();
            InputStream inputStream = null;
            try {
                inputStream = request.getInputStream();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            if (inputStream != null) {
                try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
                    char[] charBuffer = new char[CHAR_BUFFER_LENGTH];
                    int bytesRead;
                    while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                        stringBuilder.append(charBuffer, BUFFER_START_POSITION, bytesRead);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                stringBuilder.append("");
            }
            body = stringBuilder.toString();
            // 解决xss攻击问题
            if (body.contains("<")) {
                body = body.replace("<", "<");
            }
            if (body.contains(">")) {
                body = body.replace(">", ">");
            }
            initParameterMap();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    Redis是什么
    力扣刷题day52|84. 柱状图中最大的矩形
    基于JavaSwing开发电子琴程序(简约版)(小作业) 课程设计 大作业源码
    国内最牛的Java面试八股文合集,不接受反驳 我这该死的魅力
    Vitalik:Layer2 是以太坊社区文化的延伸
    【LeetCode】Day187-分割回文串
    Go[Golang]语言学习实践[回顾]教程01--为何选择学习使用Go语言
    【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路
    【Maven】maven安装、IDEA创建maven的web项目、添加依赖、集成Tomcat
    Rocky Linux 运维工具yum
  • 原文地址:https://blog.csdn.net/u011397981/article/details/133755684