java代码审计和安全漏洞修复

news2024/11/18 3:31:39

java代码审计和安全漏洞修复

本文目录

    • java代码审计和安全漏洞修复
      • 开源:奇安信代码卫士
        • 官网使用
        • gitee服务使用
      • 非开源:思客云找八哥
      • 错误类型以及修改方法
        • 1.硬编码
        • 2. 路径操作
        • 3. 路径操作 - Zip文件条目覆盖
        • 4. SQL注入
        • 5. SQL注入 - Hibernate
        • 6. XML外部实体注入,有风险的XML外部实体解析
        • 7. 空加密密钥
        • 8. 系统信息泄露
        • 9. 私密违反:私密信息序列化
      • 其他参考链接

开源:奇安信代码卫士

官网使用

  • 选择源码并上传

  • 检测

  • 查看漏洞

  • 详情

gitee服务使用

在项目的【服务】项下,选择【奇安信代码卫士】

【创建分析】

新建分析,选择【检测分支】,支持扫描的语言:php、java/jsp、python、c/c++,java 版本最高支持 1.8,点击【提交】

查看扫描结果

https://codescan.qianxin.com/#/login
https://blog.csdn.net/SHELLCODE_8BIT/article/details/129281099
https://blog.csdn.net/qq_36434219/article/details/127659944

非开源:思客云找八哥

  • 详情

错误类型以及修改方法

1.硬编码

  • 漏洞
    public void hardcodedCredentials(String name, String password) {
        if(name.equals("admin") && password.equals("admin")) {
            // Do something
        }
    }

修复思路:密码等敏感数据不要直接从代码中读取,可以使用配置文件或数据库存储的方式来存储系统所需的数据,录入数据时,还可以在对敏感数据做加密处理之后再进行数据的录入

  • 修复方法1
import org.springframework.beans.factory.annotation.Value;

    @Value("${admin.username}")
    private String adminUsername;

    @Value("${admin.password}")
    private String adminPassword;

    public void checkCredentials(String name, String password) {
        if(name.equals(adminUsername) && password.equals(adminPassword)) {
            // Do something
        }
    }
  • 修复方法2
    public void hardcodedCredentials(String name, String password) {
        if (name.equals(System.getenv("ADMIN_NAME")) && password.equals(System.getenv("ADMIN_PASSWORD"))) {
        }
    }

2. 路径操作

  • File漏洞
    public void pathManipulation(HttpServletRequest request, String rootPath) throws FileNotFoundException {
        String filename = request.getParameter("filename");
        String fullFileName = rootPath + filename;
        File downFile = new File(fullFileName);
    }

思路:对输入文件进行验证,使用安全的读取文件的方法

  • 修复方法
import org.apache.commons.io.FileUtils;

    public void pathManipulation(HttpServletRequest request, String rootPath) throws FileNotFoundException {
        String filename = request.getParameter("filename");

        Pattern pattern = Pattern.compile("[\\s\\\\/:\\*\\?\\\"<>\\|]");
        Matcher matcher = pattern.matcher(filename);
        filename = matcher.replaceAll("");

        File downFile = FileUtils.getFile(filename, "dddd");
        if (!downFile.exists()) {
            throw new FileNotFoundException("File not found: " + filename);
        } else {
            // Do something with downFile
        }
    }
  • Stream漏洞
    public void pathManipulation2(HttpServletRequest request, String rootPath) throws FileNotFoundException {
        String filename = request.getParameter("filename");
        String fullFileName = rootPath + filename;
        InputStream is = new BufferedInputStream(new FileInputStream(fullFileName));
        OutputStream os = new BufferedOutputStream(new FileOutputStream(fullFileName));
    }
  • 修复方法
    public void pathManipulation2(HttpServletRequest request, HttpServletResponse response, String rootPath) throws IOException {
        String filename = request.getParameter("filename");
        String fullFileName = rootPath + filename;

        Pattern pattern = Pattern.compile("[\\s\\\\/:\\*\\?\\\"<>\\|]");
        Matcher matcher = pattern.matcher(filename);
        filename = matcher.replaceAll("");

        File f = FileUtils.getFile(filename);

        if(f != null){
            InputStream is = new BufferedInputStream(new FileInputStream(f));
            OutputStream os = new BufferedOutputStream(response.getOutputStream());
            OutputStream os2 = new BufferedOutputStream(new FileOutputStream(f));
        }
    }
  • File封装类漏洞
import java.io.File;
public class FileUtil extends File {

    static String fileFullPath;

    public FileUtil(String pathname) {
        super(pathname);
        fileFullPath = pathname;
    }

    //其他操作

}

// 使用
FileUtil fileUtil = new FileUtil(fullFileName);
  • 修复方法
FileUtil fileUtil2 = (FileUtil) FileUtils.getFile(filename);

https://www.cnblogs.com/jayus/p/11423769.html
https://blog.csdn.net/m0_71745754/article/details/128675164
https://blog.csdn.net/qq_33204709/article/details/127968923
https://blog.csdn.net/qq_41085151/article/details/113525348
https://blog.csdn.net/qq_29384639/article/details/82705421

3. 路径操作 - Zip文件条目覆盖

  • 漏洞
    public void zipEntryOverwrite(ZipEntry entry, String dstFileName) throws Exception {
        File outFile = new File(dstFileName, entry.getName());
        OutputStream outputStream = new FileOutputStream(outFile);
        // Write data to outputStream
    }

思路:判断压缩文件路径

  • 修复方法
    public void zipEntryOverwrite(ZipEntry entry, String dstFileName) throws IOException {
        String entryName = Paths.get(entry.getName()).normalize().toString();
        // Reject entries that try to escape the target directory
        if (entryName.startsWith("..")) {
            throw new IOException("Bad zip entry: " + entry.getName());
        }
        // 创建一个新的文件路径
        String newFilePath = Paths.get(dstFileName, entryName).toString();
        // 创建新文件并获取输出流
        File outFile = new File(newFilePath);
        OutputStream outputStream = new FileOutputStream(outFile);
        // Write data to outputStream
    }

https://www.cnblogs.com/jinqi520/p/9391596.html

4. SQL注入

  • 漏洞
    public void sqlInjection(String orderId,Connection conn) throws Exception {
        String sql = "From User u on where 1=1";
        if(!orderId.equals("")){
            sql = sql + " and u.id = "+ orderId;
        }
        if(!orderId.equals("")){
            sql = sql + " and u.id like '%"+ orderId + "%'";
        }
        PreparedStatement stmt = conn.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
    }

思路:用户的输入不能直接嵌套在SQL语句中,使用参数设置

  • 修复方法
    public void sqlInjection(String orderId, Connection conn) throws Exception {
        String sql;
        PreparedStatement stmt;
        ResultSet rs;
        if (!orderId.isEmpty()) {
            sql = "SELECT * FROM User u WHERE u.id = ? ORDER BY id DESC";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, orderId);
        } else {
            sql = "SELECT * FROM User u ORDER BY id DESC";
            stmt = conn.prepareStatement(sql);
        }
        rs = stmt.executeQuery();
    }
    public void safeSQLExecution(Connection conn, List<String> ids) throws Exception {
        String sql = "SELECT * FROM some_table WHERE id = ?";  // '?' 是一个参数占位符
        PreparedStatement stmt = conn.prepareStatement(sql);
        for (String id : ids) {
            stmt.setString(1, id);  // 使用用户输入替代参数占位符
            ResultSet rs = stmt.executeQuery();
            // 处理结果集...
        }
    }

5. SQL注入 - Hibernate

  • 漏洞
    @PersistenceContext
    private EntityManager entityManager;

    public void sqlInjectionHibernate(String orderId) {
        String sql = "From User u on where 1=1";
        if(!orderId.equals("")){
            sql = sql + " and u.id = "+ orderId;
        }
        sql = sql + " order by id desc";
        Session session = entityManager.unwrap(Session.class);
        Query query = session.createQuery(sql);
        // Execute the query
    }
  • 修复方法
    public void sqlInjectionHibernate(String orderId, Session session) throws Exception {
        String hql = "FROM UserEntity u WHERE 1=1";
        if (!orderId.equals("")) {
            hql = hql + " AND u.id = :orderId";
        }
        hql = hql + " ORDER BY id DESC";

        Query query = session.createQuery(hql);
        if (!orderId.equals("")) {
            // Set the parameter
            query.setParameter("orderId", Integer.parseInt(orderId));
        }
        List<UserEntity> users = query.list();
        // Process the users
    }
    public void sqlInjectionL(List<String> orderIds, Session session) throws Exception {
        String sql = "delete from UserEntity u where u.id in ("+ orderIds +")";
        Query query = session.createQuery(sql);
        query.setParameterList("orderIds", orderIds);
        // Process the result set
    }

6. XML外部实体注入,有风险的XML外部实体解析

  • 漏洞
    public void xxeInjection(String xmlFilePath) throws Exception {
        // Process the document
        String baseDir = System.getProperty("user.dir");
        File file = new File(baseDir);
        String configFile = file.getParent()+"\\conf\\server.xml";
        XmlUtil xmlut = new XmlUtil();
        String port = getMyPort(configFile);

    }

    public String getMyPort(String xmlFilePath) throws ParserConfigurationException, IOException, SAXException {
        String port = "";
        Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFilePath);
        Element root = document.getDocumentElement();
        NodeList list = root.getElementsByTagName("service");
        Node ServiceNode = list.item(0);
        list = ServiceNode.getChildNodes();
        // ...
        return port;
    }

思路:XXE 注入的主要入口点是 DTD。防止 XXE 漏洞的最简单方法是禁用应用程序的 DTD,禁用 DTD 可能并不适用于所有场景,也可以使用输入验证来防止恶意注入

  • 修复方法
    public String getMyPort(String xmlFilePath) throws ParserConfigurationException, IOException, SAXException {
        String port = "";
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        //REDHAT
        //https://www.blackhat.com/docs/us-15/materials/us-15-Wang-FileCry-The-New-Age-Of-XXE-java-wp.pdf
        dbf.setAttribute(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD,"");
        dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA,"");

        //OWASP
        //https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html
        dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
        dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
        // Disable external DTDs as well
        dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
        // and these as well, per Timothy Morgan's 2014 paper:"XML Schema, DTD, and Entity Attacks"
        dbf.setXIncludeAware(false);
        dbf.setExpandEntityReferences(false);

        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse(xmlFilePath);

        Element root = document.getDocumentElement();
        NodeList list = root.getElementsByTagName("service");
        Node ServiceNode = list.item(0);
        list = ServiceNode.getChildNodes();

        // 获取真正的port,省略
        return port;
    }

https://www.codenong.com/56777287/
https://www.jianshu.com/p/9b4e1bce8da2

7. 空加密密钥

  • 漏洞
    public void nullEncryptionKey(String key) throws Exception {
        if(key == null) key = "";
    }
  • 修复方法
    public void nullEncryptionKey(byte[] input) throws Exception {
        byte[] key = null;
        // An actual encryption key should be used here
        key = "Some real key".getBytes();
        if (key == null || key.length != 16) {
            throw new IllegalArgumentException("Key is invalid");
        }
    }

8. 系统信息泄露

  • 漏洞
    public String systemInformationLeak( String json) {
        PrintWriter w = null;
        w.write(json);

        try {
            // Do something
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
        return null;
    }
  • 修复方法
    public String systemInformationLeak() {
        try {
            // Do something
        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e);
            return "An error occurred. Please try again later.";
        }
        return null;
    }

9. 私密违反:私密信息序列化

  • 漏洞
public class UserTest implements Serializable {
    private String username;
    private String pwd;
    private String password;
}
  • 修复⽅式1,采⽤hash加密
public class UserTest implements Serializable {

    private String username;
    private String pwd;
    private String password;
    public String getPassword() {
        return passwordHash;
    }

    public void setPassword(String password) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        this.passwordHash = passwordEncoder.encode(password);
    }
}
  • 修复⽅式1,直接删除Serializable
public class User {
    private String username;
    private transient String pwd;
    private String passwordHash;
}

其他参考链接

https://blog.csdn.net/a3562323/article/details/105389651

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

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

相关文章

视频与图片检索中的多模态语义匹配模型 ——原理、启示、应用与展望

前言 三多前笔者在《万字长文漫谈视频理解》[1]一文中&#xff0c;曾经将自己对视频理解的认识进行过简单总结&#xff0c;幸而获得了朋友们的认可&#xff0c;能让读者认可是笔者最为骄傲的成就。现在看来文中观点有不少纰漏狭隘之处&#xff0c;特别是近年来多模态模型的流行…

6.5this关键字

1. 关键字&#xff1a;this 1.1 this 是什么&#xff1f; 首先。this在Java中是一个关键字&#xff0c;this 指代的是本类的引用对象 1.2 什么时候使用 this 1.2.1 实例方法或构造器中使用当前对象的成员 1、在实例方法或构造器中&#xff0c;我们在使用get和set方法中使用…

行为型设计模式06-迭代器模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 迭代器模式 1、迭代器模式介绍 迭代器模式是一种行为型设计模式&#xff0c;它提供了一种方法来访问聚…

HydroD 实用教程(九)时域水动力分析

目 录 一、前言二、前处理三、定义/提交作业3.1 创建分析作业3.2 定义输入数据3.3 设置执行指令3.4 指定输出格式3.5 提交求解计算 四、输出文件五、结果后处理5.1 绘制力/位移时程5.2 傅里叶变换与导荷5.3 播放时域结果动画 六、参考文献 一、前言 SESAM &#xff08;Super El…

扫描仪连续扫描提示有一个问题阻值扫描该文档。请重试,错误的解决办法

故障现象: 用户新安装的联想M7650DNA一体多功能激光打印机,安装完所有驱动后;打印、复印都正常,只有扫描不正常,扫描多张后就会提示:有一个问题阻值扫描该文档。请重试,或者参阅“帮助和支持”或扫描仪附带的信息,了解有关疑难解答的信息。如下图:故障。 开始怀…

基于Pytest+Allure+Excel的接口自动化测试框架

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具&#xff0c;它不仅以 Web 的方式展示了简介的测试结果&#xff0c;而且允许参与开发过程的每个人可以从日常执行的测试中&#xff0c;最大限度地提取有用信息。 Allure 是由 Java 语言开发…

Maven项目管理-随笔(入门)

目录 前言 什么是Maven Maven的优点 Maven的核心概念有哪些 POM是什么 什么是依赖管理 什么是插件 什么是仓库 概述 1、构建 2、依赖 安装与配置 1、下载 2、Windows Maven安装 1&#xff09;解压到指定目录 2&#xff09;配置环境变量 3&#xff09;目录结构 …

离散数学题目收集整理练习(期末过关进度60%)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 ✨博主的其他文章&#xff1a;点击…

基于ssm框架的数字化题库与在线考试系统设计与实现+第二稿+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于ssm框架的数字化题库与在线考试系统设计与实现第二稿文档 视频演示 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 摘 要 随着科学技术…

iOS游戏反外挂方案解析

自2007年iPhone OS发布以来&#xff0c;iOS系统已经发展了近17年&#xff0c;凭借着独家的系统环境、安全性更高的闭源生态等优势。iOS从一众手机系统中脱颖而出&#xff0c;与安卓稳坐手机系统市场两把头部交椅。 不同于安卓的开源生态&#xff0c;iOS的闭源生态中的硬件、软…

【计算机网络自顶向下】如何学好计网-第五章数据链路层

第五章 数据链路层 学习目的 目的1&#xff1a;理解链路层服务的主要功能 差错检查、纠错 共享广播信道&#xff1a;多点接入问题(multiple access) 链路层寻址(link layer addressing) 局域网技术&#xff1a;Ethernet, VLANs 目的2&#xff1a;链路层技术的实现 点到点…

Vue介绍与入门(一)

文章目录 前言一、Vue.js是什么&#xff1f;二、vue入门1. 引入vue.js2. 编写入门的简易代码&#xff08;实践&#xff09; 三、vue学习总结&#xff08;重点&#xff09; 前言 前端开发三大框架 1、Vue&#xff1a;尤雨溪主导开发 2、React&#xff1a;脸书&#xff08;Faceb…

MySQL 02:常用数据类型

<~生~信~交~流~与~合~作~请~关~注~公~众~号生信探索> 主要的数据类型&#xff0c;包括字符串、数值、日期时间 数值型 INT就是整数类型&#xff0c;根据允许的数值大小分为以下类型&#xff08;由小到大&#xff09;&#xff0c;这样做的目的是节约空间 INT类型范围&…

【Vscode 远程连接 Docker 容器】

文章目录 1. 配置docker镜像2. 安装 OpenSSH3. Vscode中安装 Remote-SSH 插件&#xff1a;4. 配置连接信息 1. 配置docker镜像 在主机目录下创建一个 Dockerfile&#xff0c;注意文件名必须保持一致&#xff01;&#xff01;&#xff01;&#xff08;默认装了docker&#xff09…

从零开始了解Redis 主从复制全部流程

主从复制 主从复制介绍 分析单个Redis 的问题 在一个项目中读的操作是比写的操作要多的 像京东&#xff0c;淘宝等等同一时刻看的人是远远多于买的人的所有单个redis既要承担写的操作又要承担读的操作效率低在高并发的情况下不稳定 所以引出了主从复制 一图胜千言 Redis …

数据库入门下篇(如何安装和登录MYSQL数据库)

在这篇文章里&#xff0c;笔者将着重讲解如何在win和Linux系统上安装自己的MySQL数据库软件&#xff0c;以及安装好数据库软件后如何启动和登录&#xff0c;忘了密码怎么办&#xff1f;如何创建一个数据库&#xff0c;如何在数据库中创建一个表等内容 目录 在windows系统上安装…

宠物行业 | 活动落地页设计指南基础版

中国是全球第二大宠物市场&#xff0c;同时也是增长最快的市场之一。随着养宠人群的扩大&#xff0c;人宠亲情关系的加深&#xff0c;客群消费意愿与消费水平的提高&#xff0c;中国宠物行业正处于消费与认知的全面升级期。 调研显示&#xff0c;2022年我国宠物产业规模达4936亿…

管理类联考——英语二——技巧篇——写作——图表作文——经典方法论

考研英语(二)的B节写作主要考查的是图表作文。笔者根据考研英源(二)大纲要求以及议论文经典的三段式写法(首段指出问题、中间段分析问题、尾段解决问题)&#xff0c;研发出一套图表作文的经典写法。下面我们来看图表作文经典的三段式写法的基本大招。 从上图可以看出&#xf…

【SpringCloud入门】-- Nacos快速入门之搭建服务与注册中心

目录 前言&#xff1a; 1.Nacos的下载与安装 2. 去MySQL建立一个名为nacos的数据库 3.介绍配置文件&#xff0c;conf目录下的 application.properties 4.nacos启动 5. nacos作为注册中心的作用 6.建立一个项目&#xff0c;实现向命名空间注册 前言&#xff1a; 上文我们已…

使用influxQL 查询influxDB 2.0以上版本

使用grafana 9.0 连接influxdb 2.0 时候,只能用FLux语言连接,就没有SQL编辑面板,通过研究搞定了,先看效果。 influxQL 格式连接 influxdb2.0 无法连接,总数报错 bad request. 那就用FLux格式连接,连接成功后,查询的地方没有可视化面板,只有编写脚本的地方,很不方便…