java 框架注入漏洞修复_Mybatis框架下易产生SQL注入漏洞的场景和修复方法

一、Mybatis框架下易产生SQL注入漏洞的场景

在基于Mybatis框架的Java白盒代码审计工作中,通常将着手点定位在Mybatis的配置文件中。通过查看这些与数据库交互的配置文件来确定SQL语句中是否存在拼接情况,进而确立跟踪点。

通过总结,Mybatis框架下易产生SQL注入漏洞的情况有以下三种:

1. 模糊查询 like

以新闻详情页面为例,按照新闻标题对新闻进行模糊查询,如果考虑安全编码规范问题,其对应的SQL语句如下:

select * from `news` where `title` like ‘%#{title}%‘

但这样写是不对的,于是研发人员将SQL语句修改为:

select * from `news` where `title` like ‘%${title}%‘

这种情况程序不再报错,但是此时产生了SQL语句拼接问题,容易产生SQL注入漏洞。

2. 多值查询 in

对新闻进行同条件多值查询的时候,用户输入 1001,1002,1003 时,如果考虑安全编码规范,对应的SQL语句为:

select * from `news` where `id` in(#{id})

这样的SQL语句虽然能执行但得不到预期结果,于是研发人员将SQL语句修改为:

select * from `news` where `id` in (${id})

修改SQL语句之后达到了预期效果,但却引入了SQL语句拼接的问题。

3. order by 之后

根据时间、点击量等进行排序时,如果考虑安全编码规范问题,SQL语句为:

select * from `news` where `title`=‘iphone‘ order by #{time} asc

由于 time 不是查询参数无法使用预编译,SQL语句虽然执行了但得不到预期结果,于是研发人员将SQL语句修改为:

select * from `news` where `title`=‘iphone‘ order by ${time} asc

修改之后虽然成功得到预期结果,但产生了SQL语句拼接问题,极有可能引发SQL注入漏洞。

二、修复方法

1. 模糊查询 like

按照标题进行模糊查询,可将SQL语句设计如下:

select * from `news` where `tile` like concat(‘%‘,#{title}, ‘%‘)

采用预编译避免了SQL语句拼接的问题,从根源上防止SQL注入漏洞。

2. 多值查询 in

对新闻进行多值查询时,可使用Mybatis自带的循环指令解决SQL语句动态拼接的问题:

select * from `news` where `id` in #{item}

3. order by 之后

预编译机制只能处理查询参数,其他地方还需要研发人员根据具体情况来解决。例如 order by 排序查询:

select * from `news` where `title`=‘iphone‘ order by #{time} asc

这里 time 不是查询参数,无法使用预编译机制,只能拼接SQL语句:

select * from `news` where `title`=‘iphone‘ order by ${time} asc

这种情况下研发人员可以在java层面做映射来解决。例如:当排序字段为时间(time)或点击量(click)时,我们可以限制用户只能输入 1 或 2。

当输入 1 时,我们在代码层用 switch 语句将其映射为 time,当输入 2 时,将其映射为 click。输入其他内容时将其转换为默认排序字段 time。这样就能避免SQL注入漏洞。

参考链接

https://mp.weixin.qq.com/s?src=3&timestamp=1591321089&ver=1&signature=aort5C46VjBc1nw781Wc8WUSE8n3ErlNwWwH94BBZVSJ--3bdFc5yDWx2qD0Bs-ydAPLNqAcH01Jkncw28TLJxymWKhZAnRucnkLZHRkiQZAA89cHB0QJBKJt2TE5JCD2nrrP5MHKAtrHbMg49zhxzLGtAJhktLtQsruVERIJa0=

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久层框架,它提供了一种将SQL语句与Java代码解耦的方式。尽管MyBatis是一个相对安全的框架,但在使用过程中,仍存在可能发生SQL注入攻击的风险。 要防止MyBatis SQL注入攻击,可以采取以下几种方法: 1. 使用参数化查询(Prepared Statement):确保所有的用户输入参数都通过参数占位符的方式传递到SQL语句中,而不是直接拼接到SQL语句中。这样可以避免恶意用户输入特殊字符来破坏SQL语句结构。 2. 输入验证和过滤:在接收用户输入之前,对输入进行合法性验证和过滤。可以使用正则表达式、白名单或黑名单等方式来限制输入内容的合法范围,并过滤掉可能造成SQL注入的特殊字符。 3. 使用MyBatis的动态SQL功能:MyBatis提供了动态SQL功能,可以根据不同的条件动态拼接SQL语句。在使用动态SQL时,应该使用MyBatis提供的安全方法来拼接字符串,而不是直接拼接用户输入。 4. 限制数据库权限:为数据库用户设置合适的权限,最小化其对数据库的操作权限。这样即使发生注入攻击,攻击者也只能对具有限制权限的数据进行操作。 5. 定期更新MyBatis版本:及时关注MyBatis的更新和安全公告,及时更新到最新版本,以获取最新的安全修复和功能改进。 总之,为了防止MyBatis SQL注入攻击,需要使用参数化查询、输入验证和过滤、动态SQL、限制数据库权限以及定期更新MyBatis版本等多种手段来综合保护系统安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值