常见基本SQL语句#
|
|
Mybatis框架#
- #{} 用于预编译的 SQL 语句中,是预编译处理(安全)。
- ${} 则用于动态 SQL 语句中,是直接字符串替换(危险),字符串拼接。
Mybatis Plus框架#
审计MyBatis Plus框架中的SQL注入问题,核心在于识别动态SQL拼接的场景。
在 MyBatis/MyBatis Plus 中,MyBatis Plus 完全兼容 MyBatis的语法:
- #{} 用于预编译的 SQL 语句中,是预编译处理(安全)。
- ${} 则用于动态 SQL 语句中,是直接字符串替换(危险),字符串拼接。
语法:
|
|
JeecgBoot 3.9.0 /sys/dict/loadTreeData tableName参数SQL 注入#
- SysDictController.java , loadTreeData 接口直接接收了前端传来的 tableName 参数。
|
|
-
处理 (Service 层) 在 SysDictServiceImpl.java 的 queryTreeList 方法中
有一段逻辑专门用来分隔 tableName :
String[] arr = table.split(" (?i)where ");由于一系列操作导致注入语句可以被赋值给filterSql:
filterSql = oConvertUtils.getString(arr[1], null);然后会进行SQL检测:
SqlInjectionUtil.specialFilterContentForDictSql(filterSql);private static String specialDictSqlXssStr = "exec |peformance_schema|information_schema|extractvalue|updatexml|geohash|gtid_subset|gtid_subtract|insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|+|--";这个filterSql又被放入:queryParams Map中
queryParams.put("_tableFilterSql", filterSql);
|
|
-
最后在 XML 中,MyBatis 使用 ${} 直接执行了_tableFilterSql
1 2 3<when test="key == '_tableFilterSql'"> and ${value} <!-- 这里执行的就是 filterSql 的内容 --> </when>
|
|
POC
|
|