SpringBoot 整合mybatis SQL注入漏洞实践
SpringBoot 整合mybatis 请看
https://www.cnblogs.com/fczlm/p/14272917.html
这里主要记录mybatis的sql注入漏洞的实践测试。
首先在该项目下再创建一个数据库操作接口
1 2 3 4 | @Mapper public interface FindUserByIdMapper { public List<User> findUser( int id); } |
resource创建mybatis/FindUserByIdMapper.xml,这里注意看到的是使用了${userName}来拼接sql语句,这将造成sql注入的问题,正确的做法是#{userName}.既然知道${id}这种做法是不对的,那为什么mybatis为啥不干掉它?
在这里找到答案,有兴趣的自己去看看https://blog.csdn.net/weixin_42765975/article/details/103209330
<?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.example.mybaits.mapper.FindUserMapper">
<select id="findUser" resultType="User">
SELECT * FROM tbuser where userName='${username}'
</select>
</mapper>
然后是services相关类
1 2 3 4 5 6 7 8 9 | package com.example.mybaits.service; import com.example.mybaits.entity.User; import java.util.List; public interface FindUserService { public List<User> findUser(String usrname); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package com.example.mybaits.service.impl; import com.example.mybaits.entity.User; import com.example.mybaits.mapper.FindUserMapper; import com.example.mybaits.service.FindUserService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; @Service public class FindUserServiceImpl implements FindUserService { @Resource private FindUserMapper findUserMapper; @Override public List<User> findUser(String username) { return findUserMapper.findUser(username); } } |
controller类:
@RestController
public class UserController {
@Autowired
private UserService userService;
@Autowired
private FindUserService findUserService;
@RequestMapping("/test")
public List<User> allUser(){
return userService.allUser();
}
@RequestMapping("/test2")
public List<User> findUder(@RequestParam String username){
return findUserService.findUser(username);
}
}
所以在代码审计时,先看看mybatis里面的xml的sql语句哪些用到了${},之后追踪到service,controller有没有对参数做过滤,参数值是否可控,来验证sql注入是否存在。
另外尝试了一下类似这样的语句SELECT * FROM tbuser where id=${id},但是测试的时候接口可以正常返回,但发现无法注入,应该是不支持整数类型注入,那么代码审计时也可以主要关注字符串型
项目代码:
https://github.com/testwc/SpringBootMyBatisSQLinjectionTest
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」