Mining an SQL Injection Vulnerability Using CodeQL

昨天学习了基本的 CodeQL,并且在 Github Lab 上完成了 CPP 的 CodeQL 课程,今天打算找个源码练习一下。我选择的项目是 java-sec-code

准备

完成有关 Java 的 CodeQL 数据库生成,同时配置好项目的数据库信息,启动项目即可在浏览器中看到这个页面:

编写

我使用的是以下语句来查询 SQL 注入

import java
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.security.QueryInjection

class Config extends TaintTracking::Configuration {
    Config () {
        this = "Sql Injection Config"
    }
    
    override predicate isSource(DataFlow::Node source) {
        source instanceof RemoteFlowSource
    }
    
    override predicate isSink(DataFlow::Node sink) {
        sink instanceof QueryInjectionSink
    }
}
from Config conf, DataFlow::PathNode source, DataFlow::PathNode sink
where conf.hasFlowPath(source, sink)
select sink, source, "user input maybe cause sqli"

运行结果如下

构造 SQL 注入语句

/sqli/jdbc/vuln?username=admin'+and+1=2%23 无回显

/sqli/jdbc/vuln?username=admin'+and+1=1%23 有回显

测试 SQL 注入成功

思考

这个项目存在 SQL 注入的位置并不只是/jdbc/vuln,但是通过 CodeQL 扫描出来的结果只有这一处,不满足静态分析的 Sound 要求。

问题好像是出在了 Mybatis,要怎么解决才能够解析 Mybatis 的 SQL查询?