Web系统常见漏洞修复

news2024/12/25 11:19:25

背景
在工作中,我们的交付团队在交付项目时,可能会遇到甲方会使用一些第三方工具(奇安信等)对项目代码进行扫描,特别是一些对安全性要求比较高的企业,比如涉及到一些证券公司、银行、金融等。他们会在项目上线前进行代码安全检测,通过了对方才会发布上线。正好我所在企业中的交付团队遇到了这种情况,我将最后我们团队针对一些漏洞的修复代码分享出来供大家参考,方便未来自己修复同样的漏洞,当然漏洞的种类不是很全,我会在以后遇到其他类型时及时更新。

1.存储型XSS&反射型XSS

1.1 漏洞描述

存储型XSS是指应用程序通过Web请求获取不可信赖的数据,并且在未检验数据是否存在XSS代码的情况下,将其存入数据库。当程序下一次从数据库中获取该数据时,致使页面再次执行XSS代码。存储型XSS可以持续攻击用户,在用户提交了包含XSS代码的数据存储到数据库后,每当用户在浏览网页查询对应数据库中的数据时,那些包含XSS代码的数据就会在服务器解析并加载,当浏览器读到XSS代码后,会当做正常的HTML和JS解析并执行,于是发生存储型XSS攻击。

反射型XSS是指应用程序通过Web请求获取不可信赖的数据,并在未检验数据是否存在恶意代码的情况下,将其发送给用户。反射型XSS一般可以由攻击者构造带有恶意代码参数的URL来实现,在构造的URL地址被打开后,其中包含的恶意代码参数被浏览器解析和执行。这种攻击的特点是非持久化,必须用户点击包含恶意代码参数的链接时才会触发。
我们的项目中被扫出这两个问题的时候还是比较头疼的,因为出现的频率很高,有一千五百多个暴露代码行,特别是存储型XSS,基本在我们所有写的接口返回那都暴露了,比如下面这张截图。
在这里插入图片描述

1.2 漏洞修复

我们后台的接口很多,我们不可能一行一行处理。经过几分钟的和甲方讨论我们将这两种类型视为一种漏洞类型,并且进行在公共地方修改加过滤处理。大致代码如下:

@ControllerAdvice
@Slf4j
public class CleanXssResponseAdvice implements ResponseBodyAdvice<Object> {

    //只对返回json格式的起作用
    private static List<MediaType> list = Arrays.asList(APPLICATION_JSON_UTF8, APPLICATION_JSON);

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return false;
    }

	@Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (list.contains(selectedContentType) && !ObjectUtils.isEmpty(body) && body instanceof InvokeResultUtil){
            InvokeResultUtil invokeResultUtil = (InvokeResultUtil) body;
            Object data = invokeResultUtil.getData();
            if (!ObjectUtils.isEmpty(data) && invokeResultUtil.isSuccess() ) {
                String dataString = JSONObject.toJSONString(data, SerializerFeature.WriteDateUseDateFormat);
                Object object = JSON.parseObject(StringUtils.cleanXSS(dataString), data.getClass());
                InvokeResultUtil result = new InvokeResultUtil(object);
                result.setCode(200);
                result.setMessage("sucess");
                return result;
            } else {
                return body;
            }
        } else {
            return body;
        }
    }
}
import org.owasp.esapi.ESAPI;
import org.owasp.esapi.Encoder;
import org.owasp.esapi.errors.EncodingException;

public static String cleanXSS(String value) {

        Encoder encoder = ESAPI.encoder();
        value = encoder.encodeForJavaScript(value);
        value = encoder.encodeForHTML(value);
        try {
            String v2 = encoder.encodeForURL(value);
            value = v2;
        } catch (EncodingException e) {
            log.error("cleanXSS url编码错误");
            e.printStackTrace();
        }
        return value;
    }

2.HTTP响应截断

2.1 漏洞描述

程序从一个不可信赖的数据源获取数据,未进行验证就置于HTTP头文件中发给用户,可能会导致HTTP响应截断攻击。
例如如果请求中提交的是一个Jane Smith字符串,那么包含该cookie的HTTP响应可能表现为以下形式:
HTTP/1.1 200 OK

Set-Cookie: author=Jane Smith

那么如果攻击者提交的是一个恶意字符串,比如Wiley Hacker\r\nHTTP/1.1 200 OK\r\n…,那么HTTP响应就会被分割成以下形式的

HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...

那么如果攻击者提交的是一个恶意字符串,比如Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...,那么HTTP响应就会被分割成以下形式的两个响应:

HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...

2.2 漏洞修复

程序中在处理请求头时,在设置请求头值时过滤:

headers.add("Authorization", HtmlUtil2.encodeForHtml(authorization));
or
response.setHeader("content-length", HtmlUtil2.encodeForHtml("" + contentLength));
public class HtmlUtil2 {
    public static String encodeForHtml(String input) {
        if (input == null) {
            return null;
        }
        //HtmlUtils.htmlEscape
        // 在这里添加适当的HTML编码逻辑,以防止恶意内容被解释为HTML
        return input.replace("<", "&lt;").replace(">", "&gt;")
                .replaceAll("\r", "").replaceAll("\n", "")
                .replaceAll(" ", "").replaceAll("/","");
    }
}

3.Json注入

3.1 漏洞描述

JSON注入是指应用程序所解析的JSON文档或请求来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,攻击者可以插入一些元素做一些可以预测的操作,比如解析JSON失败,导致抛出异常,甚至可以导致XSS和动态解析代码。

3.2 漏洞修复

我们在使用工具类进行json转换时进行判断是否合法:

public static JSONObject fromJson(String json) {
        json = isValidJson(json);
        return JSONObject.parseObject(json);
}

public static String isValidJson(String json) {
        json = StringEscapeUtils.escapeJson(json);
        json = StringEscapeUtils.unescapeJson(json);
        try {
            JSON.parse(json, Feature.IgnoreNotMatch);
            return json;
        } catch (JSONException e) {
            throw new IllegalArgumentException("不是有效的Json ");
        }
}

4.文件上传

4.1 漏洞描述

文件可能会被攻击者注入危险内容或恶意代码,当程序允许用户上传时,攻击者可以通过文件将恶意代码在服务器上运行或者将危险内容注入程序。

4.2 漏洞修复

对上传文件后缀与MIME Type进行匹配校验, 对文件头信息与文件后缀进行匹配校验,并且对文件路径和文件名字进行校验,校验是否存在"/“,”“,”~“,”…“,”./“,”…/"。
在这里插入图片描述

public static boolean valid(String str) {
        return str.contains("../") || str.contains("/") || str.contains("~") || str.contains("..") || str.contains("./") || str.contains("\\");
    }

5.硬编码URL

5.1 漏洞描述

程序中采用硬编码方式处理URL地址,一方面会降低系统安全性,另一方面不易于程序维护。

5.2 漏洞修复

先加密后解密:

public static final String ALI_NLS_TOKEN = new String(Base64.getDecoder().decode("Base64后的密文"));

6.明文密码

6.1 漏洞描述

明文密码会降低系统安全性,应对程序中使用的密码值进行加密。

6.2 漏洞修复

同硬编码URL一样的处理方式,或者将password加密成密文,这样扫描工具就不会扫到相关字段。

7.重定向

7.1 漏洞描述

应用程序允许未验证的用户输入控制重定向中的URL,攻击通过构建URL,使用户重定向到任意URL,利用这个漏洞可以诱使用户访问某个页面,挂马、密码记录、下载任意文件等,常被用来钓鱼。

7.2 漏洞修复

主要是检验url是不是合法url:
在这里插入图片描述
注意这里方法名一定是safeUrls,这里是按照扫描工具修复建议。

public static boolean safeUrls(String url) {
		URI uri;
		try {
			uri = new URI(url);
		} catch (URISyntaxException e) {
			e.printStackTrace();
			return false;
		}

		if(uri.getHost() == null){
			return false;
		}
		return "http".equalsIgnoreCase(uri.getScheme()) || "https".equalsIgnoreCase(uri.getScheme());
	}

8.路径遍历

8.1 漏洞描述

应用程序对用户可控制的输入未经合理校验,就传送给一个文件API。攻击者可能会使用一些特殊的字符(如…和/)摆脱受保护的限制,访问一些受保护的文件或目录。

8.2 漏洞修复

在对文件进行操作时,调用此方法过滤一下:

    public static Boolean securityFilePathCheck(String filePath, String filePathWhite) {
        String[] filePathWhitelist = new String[]{};
        if (StringUtils.isNotBlank(filePathWhite)) {
            filePathWhitelist = filePathWhite.split(",");
        }
        if (StringUtils.isBlank(filePath)) {
            return false;
        }
        // 路径安全校验
        if (filePath.contains("../")) {
            throw new BusinessException("不支持的操作");
        }
        filePath = getSecurityFilePath(filePath);
        File file = FileUtils.getFile(filePath);
        filePath = file.getAbsolutePath();
        if (filePathWhitelist == null || filePathWhitelist.length == 0) return true;
        for (String whiteFilePath : filePathWhitelist) {
            PathMatcher matcher = FileSystems.getDefault().getPathMatcher(whiteFilePath);
            if (matcher.matches(Paths.get(filePath))) {
                return true;
            }

        }
        throw new BusinessException("该路径不在白名单中");
    }

9.命令注入

9.1 漏洞描述

命令注入是指,在应用程序执行的命令中包含来源于不可信数据时,程序本身没有对这些不可信数据做正确、合理的验证和过滤,导致系统执行恶意命令。

9.2 漏洞修复

过滤:

public static String getSecurityFilePath(String filePath) {
        if (StringUtils.isBlank(filePath)) {
            return null;
        }
        filePath = filePath.replace("<", "&lt;").replace(">", "&gt;")
                .replaceAll("\r", "").replaceAll("\n", "")
                .replaceAll(" ", "");
        File file = FileUtils.getFile(filePath);
        return file.getAbsolutePath();
    }

还有漏洞比如SQL相关的注入和安全问题处理起来就比较简单了,这里就不再赘述。其实很多漏洞的修复就是在原本的代码上加了一层所谓的“安全检测”,目的仅仅是能够通过工具的安全扫描,上面部分代码我要求方法名必须是什么也是满足工具给的建议,工具不会去看你写的过滤器里面有什么逻辑,可能就仅仅扫描到你含有建议中的关键字、关键方法就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1003628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻松学会添加滚动字幕,让你的视频更具吸引力!

在视频中加入滚动字幕&#xff0c;可以增加视频的吸引力和可读性。通过滚动字幕&#xff0c;观众可以更好地了解视频的内容和主题&#xff0c;同时也可以增加视频的观赏性。今天小编就来教教大家要如何进行操作 第一步&#xff1a;首先我们要进入【好简单批量智剪】主页面&…

固定资产管理系统如何简化流程

对于企业而言&#xff0c;管理固定资产是一项重要的任务&#xff0c;而如何有效地进行报销则是固定资产管理的关键环节。为了解决这个问题&#xff0c;许多企业引入了固定资产管理系统。那么&#xff0c;这个系统究竟能如何简化流程呢&#xff1f;  固定资产管理系统可以实现…

Mybatis 动态SQL – 使用trim标签替代where,set标签

前面几篇我们介绍了where,set标签的使用&#xff1b;本篇我们继续介绍如何使用Mybatis提供的tirm标签替代where,set标签。 如果您对where,set标签不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 动态SQL – 使用if,where标签动态…

直播app源码,QUIC协议:改善性能与安全性

一、QUIC协议的定义&#xff1a; QUIC协议是由 “谷歌”提出的一种基于UDP传输层协议的新型协议&#xff0c;由于TCP协议的延迟较高、丢包重传效率较低等缺点&#xff0c;QUIC协议被开发应用出来&#xff0c;让直播app源码平台拥有更可靠、更快、更安全的数据传输&#xff0c;并…

给文章添加阅读模式纯js

今天给大家分享添加文章的阅读模式&#xff0c;让更好的体验度。 方法&#xff1a;首先建个input <input type"button" value"阅读模式" onclick"miniPic()" style"background-color:#275ecf;color:#FFFFFF;width:70px;height:20px;bo…

Python开发者必读!优化你的代码风格的7个技巧

当你编写Python代码时&#xff0c;是否曾想过如何让它更加清晰、整洁&#xff0c;并且易于阅读&#xff1f;Python的简单性是其吸引力之一&#xff0c;但这并不意味着你可以在编码时忽略代码质量。好的代码风格和结构可以让你的Python项目更容易维护&#xff0c;更少出现错误&a…

AI艺术写真头像二维码生成分销公众号小程序开源版开发

AI艺术写真头像二维码生成分销公众号小程序开源版开发 以下是AI艺术写真头像二维码生成分销公众号小程序的功能列表&#xff1a; 用户注册和登录功能&#xff1a;用户可以通过手机或邮箱注册和登录账号。 AI艺术写真头像生成功能&#xff1a;用户可以上传照片&#xff0c;通过…

芯科蓝牙BG27开发笔记5-有坑就蒙

笔记1中的蓝牙点灯是可以运行的&#xff0c;但是有时又会在连接过程中死机&#xff0c;笔记2中经过调试&#xff0c;通过屏蔽log输出的模块解决了此问题&#xff0c;问题定位到了uart。 那到底uart有什么问题&#xff1f; 在对这套工具和代码不熟悉的情况下&#xff0c;根据以…

使用阿里云轻量应用服务器安装Docker进行SpringBoot项目的部署上线

零、写在前面 项目源码&#xff1a;QiuShicheng/Qiu-blog (github.com) 项目是跟着B站up主【三更草堂】做的&#xff0c;本人最终系统是修改了一些前端代码。 (注&#xff1a;源码中前端代码未修改&#xff0c;仍是up主提供的&#xff09; 购买了一个轻量应用服务器2核2G&a…

Windows下WSL将ubuntu挪位置-系统盘清理

Windows下WSL将ubuntu挪位置-系统盘清理 Excerpt 文件夹&#xff0c;将 C 盘下对应路径的 .android 文件夹拷贝过来覆盖&#xff1b;最近 C 盘空间暴涨&#xff0c;用工具 WinDirStat。文件夹里的内容都是无用的垃圾&#xff0c;可以统统清除掉&#xff0c;找到对应的老路径修改…

​重生奇迹MU剑士技能升级攻略​

奇迹剑士技能升级技巧 游戏中剑士作为近战的代表职业&#xff0c;一直以来都是血牛职业&#xff0c;除了拥有强大的防御一级减伤能力之外&#xff0c;剑士还有着非常不错的输出能力。 如果其他职业与重生奇迹MU剑士近身战斗&#xff0c;那么完全讨不到半点便宜。虽然剑士表现…

CentOS8安装mysql-community-client错误解决

安装MySQL5.7.37的mysql-community-client-5.7.37-1.el7.x86_64.rpm时&#xff0c;提示如下&#xff1a; 提示的意思是缺少依赖软件包。 使用如下命令安装依赖包&#xff1a; yum install libncurse* 实际安装如下两个软件包。 成功后再次安装mysql-community-client-5.7.37…

2020-2022年低纬高原区典型种养殖区氮磷干湿沉降数据集

摘要 氮磷干湿沉降是指大气中氮磷通过沉降方式到达地面,进入陆地生态系统物质循环的过程,干湿沉降在环境氮磷污染输入中占据重要比例。我国是种养殖业大国,摸清源于种植业和养殖业氮磷干湿沉降负荷,对评估氮磷干湿沉降生态效应,指导环境污染治理,促进种养殖业绿色发展具有…

vim的使用介绍以及命令大全

懒羊羊感谢大家的关注和三连支持~ 目录 前言 一、vim的使用介绍 二、命令大全 1.命令模式 &#xff08;1&#xff09;复制&#xff08;配合粘贴命令p使用&#xff09; &#xff08;2&#xff09;剪切 &#xff08;3&#xff09;粘贴 &#xff08;4&#xff09;删除 …

企业可以自己建立大数据平台吗?有哪些好处?

随着企业的快速发展&#xff0c;企业累积了越来越多的数据&#xff0c;但管理巨量的大数据是一件非常难的事情&#xff0c;且很多数据没有充分发挥作用。因此不少企业在问&#xff0c;企业可以自己建立大数据平台吗&#xff1f;有哪些好处&#xff1f; 企业可以自己建立大数据…

不同场景下的JMETER设置

不同场景下的JMETER设置 1.基准测试 验证主要业务在单用户运行下的性能指标&#xff0c;为多用户并发并发和混合场景的性能分析提供基础参考。 基准测试JMETER线程组设置(在1秒内执行5个线程循环一次)&#xff1a; 2.并发测试 多用户在同一时间访问某一个模块或则应用的场景&…

为什么要选择期权?开通期权有何益处?

相较于期货&#xff0c;期权的交易方式更为灵活多样&#xff0c;对标的期货市场也有较高的要求。据了解&#xff0c;在国际成熟的期权市场上&#xff0c;流动性和价格波动性是判断期货品种是否适合开展期权交易的两大关键因素&#xff0c;下文介绍为什么要选择期权&#xff1f;…

什么气传导蓝牙耳机好?2023气传导耳机推荐

​随着科技的发展&#xff0c;耳机市场正迎来一场前所未有的变革。气传导耳机作为一种新兴的耳机类型&#xff0c;正逐渐受到消费者的关注和青睐。然而&#xff0c;面对层出不穷的气传导耳机&#xff0c;我们该如何选择&#xff1f;本文将帮助你挑选到最适合自己的气传导耳机&a…

【全国大学生IoT设计竞赛】安谋科技国赛三等奖分享:城市环境监测小车——城市守望者

本文参加极术社区和灵动微电子组织的【有奖征集】分享作品传播技术成果&#xff0c;更有奖品等你来领&#xff01;线上征集活动。 8月23到25日&#xff0c;我们参加了在南京大学举行的线下2023物联网创新设计大赛全国总决赛。由全国高等学校计算机教育研究会主办&#xff0c;湖…

Vscode 快速下载

https://vscode.cdn.azure.cn/stable/8b617bd08fd9e3fc94d14adb8d358b56e3f72314/VSCodeUserSetup-x64-1.82.0.exe https://vscode.cdn.azure.cn/------>镜像&#xff0c;将官网的下载地址复制过来&#xff0c;stable开始拼接到后面