java中的接口是类吗
329
2022-10-03
Mybatis在Java代码审计中的审计方法及修复方法
Java代码审计系列课程
前置知识:了解Mybatis框架映射关系mapper定位java代码
id定位方法
List
Mybatis中两种数据库拼接方法${}是直接拼接#{}预处理后拼接mybatis有两种写法,一种是使用@Param 注解:
@Mapperpublic interface CategoryMapper { @Select("select * from category_ where name= '${name}' ") public CategoryM getByName(@Param("name") String name);}
1、${}直接拼接,类似jdbc中的直接拼接审计方法
* or '1'='1 */ @GetMapping("/mybatis/vuln01")public List
注入语句:
or '1'='1
${}修复方法
采用#{},也就是预处理的形式
* from users where username = #{username}")User findByUserName(@Param("username") String username);
2、Mybatis中like审计方法
访问路径:
username);来进行查询,来看一下UserMapper.xml,也就是他的XML映射文件。
List
这里传入未过滤的username后,插入到SQL语句中,就成了:select * from users where username like '%username%',${}直接拼接字符串,而且这里在like的后面不能使用#{}预编译,不然就会产生报错。注入语句:
or '1'='1' %23
修复建议:
可以使用like concat('%',#{username}, '%')就可以避免注入了。
findByUserNameVsec02(String username);Mybatis配置:
验证:
or '1'='1' %23
同理不同数据库的修复代码快:Mysql数据库:
SELECT * FROM user WHERE name like CONCAT('%',#{name},'%')
Oracle数据库:
SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或SELECT * FROM user WHERE name like '%'||#{name}||'%'
Sqlserver数据库:
SELECT * FROM user WHERE name like '%'+#{name}+'%'
DB2数据库:
SELECT * FROM user WHERE name like '%'+#{name}+'%' 或SELECT * FROM user WHERE name like '%'||#{name}||'%'
3、Mybatis中order by审计方法
访问链接:
String order)来进行查询,同样也是去看UserMapper.xml。
可以看到我们输入的参数在order by之后,也是${order}直接拼接起来了,与like相同,在这也是无法使用预编译,只能使用${}。由于没有过滤就直接拼接,很显然存在注入。注入语句:
and (updatexml(1,concat(0x7e,(select version()),0x7e),1))
修复代码:
1、当order排序能不让用户输入就不让用户输入,后台直接写死,不传递参数到后端:
OrderByUsername();Mysql配置:
2、当order必须要从外界获取参数到后端代码进行拼接时候,那就先对参数进行过滤,过滤后再使用:
List
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~