[安全性] 数据库维护端点中的攻击者控制的 JDBC URL 导致 SSRF
| 来源(存储) | createDatabase/updateDatabase 绑定 @RequestBody Database.jdbcUrl 并将其保存下来 | eladmin-system/.../maint/rest/DatabaseController.java:72-86 |
| 触发(存储) | uploadDatabase 读取保存的 jdbcUrl 并调用 SqlUtils.executeFile | DatabaseController.java:107-118 |
| 来源(直接) | testConnect 绑定 @RequestBody Database.jdbcUrl 并调用 testConnection | DatabaseController.java:99-103 |
| 目标 | SqlUtils.getDataSource: DriverManager.getDriver(url) 然后 DruidDataSource.setUrl(url).init() (出站 TCP) | eladmin-system/.../maint/util/SqlUtils.java:49-90 |
Database 实体将 jdbcUrl 存储为一个自由形式的 String,没有 @Pattern 或方案/主机验证。DatabaseServiceImpl.testConnection 将 resources.getJdbcUrl() 直接传递给 SqlUtils.testConnection,而 uploadDatabase 将保存的 database.getJdbcUrl() 传递给 SqlUtils.executeFile。这两者都会到达 SqlUtils.getDataSource,该方法首先调用 DriverManager.getDriver(jdbcUrl.trim()),然后调用 DruidDataSource.setUrl + init(),从而导致向 URL 所指定的任何主机建立一个出站 TCP 连接。sanitizeJdbcUrl 仅在 getDriver 调用之后才被应用,并且仅对一小部分 =true 参数进行中和,而不影响目标 host:port。
内容来源: elunez/eladmin