[Java安全]—Mybatis注入

这篇具有很好参考价值的文章主要介绍了[Java安全]—Mybatis注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Mybatis注入留在了Spring后,因为感觉用Spring搭建web端后再进行注入比较贴合实际一些。

测试环境

Mysql:5.7

Springboot:2.1

mybatis:3.5

数据库

创建了一个测试用的数据库Mybatis

CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `mybatis`;

-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
  `uid` int(10) NOT NULL AUTO_INCREMENT,
  `uname` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `uage` int(10) NULL DEFAULT NULL,
  PRIMARY KEY (`uid`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES (1, 'Sentiment', 20);
INSERT INTO `users` VALUES (2, 'Shelter', 20);
INSERT INTO `users` VALUES (3, 'Tana', 18);

[Java安全]—Mybatis注入

SQL注入的四种方式

这里用的Springboot环境,配置文件较多,先放出关键文件,最终项目放在后边

#{}和${}

接口

List<User> selectOne(@Param("uname") String uname);

配置

<select id="selectOne" resultType="user">
    select * from users where uname = '${uname}'
</select>

测试

@GetMapping("/inject/1")
@ResponseBody
public List<User> selectOne(@RequestParam("uname") String uname) {
    return userService.selectOne(uname);
}

执行语句是select * from users where uname = '${uname}',所以这里就可以直接联想到单引号闭合即可,所以用万能密码1’ or ‘1’='1进行测试

http://127.0.0.1:8080/inject/1?uname=1' or '1'='1

[Java安全]—Mybatis注入

发现成功注入,但是如果将${}换成#{}后则会报错无法执行,原因在于:#{}相当于是进行了预编译的方式,所以就有效的避免了sql注入问题

模糊查询

这里在前篇提到过模糊查询的三种方式

select * from t_user where username like '%${mohu}%'
select * from t_user where username like "%"#{mohu}"%"
select * from t_user where username like concat('%',#{mohu},'%')

可以看到第二条中,"%"#{mohu}"%"预编译前后的%是独立出来的,而写成'%#{mohu}%'这种形式,预编译时就会将%当做字符来处理从而报错,此时若经验不足将#改成了$即:'%${mohu}%',就会导致SQL注入问题

接口

String selectTwo(@Param("uname") String uname);

配置

<select id="selectTwo" resultType="user">
    select * from users where uname like '%${uname}%'
</select>

测试

这里由于换了查询方式就无法在使用万能密码获取数据,所以这里将返回类型改为了String,这样就可以通过报错信息来获取我们注入的内容

@GetMapping("/inject/2")
@ResponseBody
public String selectTwo(@RequestParam("uname") String uname) {
    try {
        return userService.selectTwo(uname);
    }catch (Throwable e){
        return e.toString();
    }
}
http://127.0.0.1:8080/inject/2?uname=1' or updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

[Java安全]—Mybatis注入


In查询

当查询语句有in是,只需要将in后的内容进行闭合即可绕过

配置

<select id="selectThree" resultType="user">
    select * from users where uid in (${uid})
</select>

其他内容都跟模糊查询一样就不贴了

http://127.0.0.1:8080/inject/3?uid=1)  or updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

[Java安全]—Mybatis注入

order by注入

和in查询原理基本相同

<select id="selectFour" resultType="user">
    select * from users order by ${uid}
</select>
http://127.0.0.1:8080/inject/4?uid=1 and(updatexml(1,concat(0x7e,(select database())),0));

[Java安全]—Mybatis注入

综上情况来看,要避免mybatis的注入问题,其实最好的方式就是使用预编译方式

项目文件

链接:https://pan.baidu.com/s/1B3Ui-KeGL001JVgFjs9l5g?pwd=1axd 
提取码:1axd

java -jar mybatis.jar 运行即可

[Java安全]—Mybatis注入文章来源地址https://www.toymoban.com/news/detail-460766.html

到了这里,关于[Java安全]—Mybatis注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】mybatis中#{}和${}导致sql注入问题及解决办法

    使用mybatis的时候遇到了#{}和${}可能导致sql注入的问题 #{} 底层通过prepareStatement对当前传入的sql进行了预编译,一个 #{ } 被解析为一个参数占位符 ?; #{} 解析之后会将String类型的数据自动加上引号,其他数据类型不会 #{} 很大程度上可以防止sql注入(sql注入是发生在编译的过程

    2024年01月17日
    浏览(29)
  • 【java安全】JNDI注入概述

    什么是JNDI? JNDI(Java Naming and Directory Interface) 是 Java 提供的 Java 命名和目录接口。通过调用 JNDI 的 API 可以定位资源和其他程序对象。 命名服务将名称和对象联系起来,使得我们可以用名称访问对象 JDNI的结构 jndi的作用主要在于\\\"定位\\\"。比如定位rmi中注册的对象,访问ldap的目录

    2024年02月11日
    浏览(28)
  • Java Spring和Spring集成Mybatis

    1.Spring 2.Spring 集成Mybatis 1.Spring 特性 IOC :控制反转 AOP :面向切面 Spring 组成部分 在SMM中起到的作用(粘合剂) Spring 理念 OOP 核心思想【万物皆对象】 Spring 核心思想【万物皆Bean组件】 Spring 优势 低侵入式 独立于应用服务器 低耦合度 面向切面(集中式处理) 与第三方框架

    2024年02月16日
    浏览(34)
  • Java mybatis spring习题

    1、MyBatis 和 Spring 整合需要引入的 jar 包是( )。 A.spring -context B.mybatis-spring C.spring -jdbc D.spring -webmvc 答案:B 解析:MyBatis 与 Spring 整合包是 mybatis -spring 2、用户通过浏览器向服务器发送请求时,负责拦截用户请求的是 ()。 A.处理器 B.处理器映射器 C.前端控制器 D.处理器适配器

    2024年02月11日
    浏览(31)
  • Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发

      掌握纯注解开发依赖注入(DI)模式 学习使用纯注解进行第三方Bean注入 问题导入 思考:如何使用注解方式将Bean对象注入到类中 1.1 使用@Autowired注解开启自动装配模式(按类型) 说明:不管是使用配置文件还是配置类,都必须进行对应的Spring注解包扫描才可以使用。@Autowired默

    2024年02月14日
    浏览(46)
  • spring框架,以及和spring框架相关的Java面试题和spring ioc的注入方式

    目录 一.spring来源,以及介绍 1.spring诞生的背景 2.spring框架 介绍 3.spring框架在使用中的优点以及不足 3.1优点  3.2不足 3.3总结 4.为什么要使用spring  二.将spring框架部署在IDEA中  1.替换pom.xml  2.构建spring所需要的xml文件 三.spring的三种注入方式 0.定义需要的类,方法 1.方法注入

    2024年02月12日
    浏览(36)
  • [Java安全]—Shiro回显内存马注入

    文章首发于先知社区:Shiro回显内存马注入 接上篇[Java安全]—Tomcat反序列化注入回显内存马_,在上篇提到师傅们找到了一种Tomcat注入回显内存马的方法, 但他其实有个不足之处:由于shiro中自定义了一个filter,因此无法在shiro中注入内存马。 所以在后边师傅们又找到了一个

    2024年02月06日
    浏览(32)
  • JAVA 安全-JWT 安全及预编译 CASE 注入等(40)

    在各种语言脚本的环境下,也会产生一些新的漏洞,如果是java又能产生那些漏洞,思维导图里面常规漏洞之前都有; java的访问控制,jwt令牌(php几乎没有)组件安全,这些都是java特有的 #综合漏洞,sql注入 防御sql注入,接受session,参数绑定,存储过程中这样注入; 接受

    2024年02月12日
    浏览(22)
  • 40 JAVA安全-JWT安全及预编译CASE注入等

    jwt加解密:https://jwt.io/#debugger-io 通过前期的WEB漏洞的学习,掌握了大部分的安全漏洞的原理及利用,但在各种脚本语言开发环境的差异下,会存在新的安全问题,其中脚本语言类型PHP、Java、Python等主流开发框架会有所差异。 每个脚本程序语言在开发它web程序这块的时候,不

    2024年02月03日
    浏览(22)
  • Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

    前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,以及详细讲解IOC,今天详细介绍一些DI(依赖注入) 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 思考:向一个类中传递数据的方式有几种?(给类

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包