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查询?