Table of Contents
- -1. Develop the query bottom-up
--
-
-Identify the source part of the -
--System.console().readLine(); -
- --expression, the
bufargument. -Start from afrom..where..select, then convert to a predicate. -
-
--Identify the sink part of the -
--conn.createStatement().executeUpdate(query); -
- --expression, the
queryargument. Again start fromfrom..where..select, -then convert to a predicate. -
-
--Fill in the taintflow configuration boilerplate -
--class SqliFlowConfig extends TaintTracking::Configuration { - SqliFlowConfig() { this = "SqliFlow" } - - override predicate isSource(DataFlow::Node node) { - none() - } - - override predicate isSink(DataFlow::Node node) { - none() - } -} -
-
-
-The final query (without isAdditionalTaintStep) is
-
/** - * @name SQLI Vulnerability - * @description Using untrusted strings in a sql query allows sql injection attacks. - * @kind path-problem - * @id java/SQLIVulnerable - * @problem.severity warning - */ - -import java -import semmle.code.java.dataflow.TaintTracking -import DataFlow::PathGraph - -class SqliFlowConfig extends TaintTracking::Configuration { - SqliFlowConfig() { this = "SqliFlow" } - - override predicate isSource(DataFlow::Node source) { - // System.console().readLine(); - exists(Call read | - read.getCallee().getName() = "readLine" and - read = source.asExpr() - ) - } - - override predicate isSink(DataFlow::Node sink) { - // conn.createStatement().executeUpdate(query); - exists(Call exec | - exec.getCallee().getName() = "executeUpdate" and - exec.getArgument(0) = sink.asExpr() - ) - } -} - -from SqliFlowConfig conf, DataFlow::PathNode source, DataFlow::PathNode sink -where conf.hasFlowPath(source, sink) -select sink, source, sink, "Possible SQL injection" --
2. Optional: sarif file review of the results
--Query results are available in several output formats using the cli. The -following produces the sarif format, a json-based result description. -
- -# The setup information from before -export PATH=$HOME/local/vmsync/codeql250:"$PATH" -SRCDIR=$HOME/local/codeql-training-material.java-sqli/java/codeql-dataflow-sql-injection -DB=$SRCDIR/java-sqli-$(cd $SRCDIR && git rev-parse --short HEAD) - -# Check paths -echo $DB -echo $SRCDIR - -# To see the help -codeql database analyze -h - -# Run a query -codeql database analyze \ - -v \ - --ram=14000 \ - -j12 \ - --rerun \ - --search-path ~/local/vmsync/ql \ - --format=sarif-latest \ - --output java-sqli.sarif \ - -- \ - $DB \ - $SRCDIR/SqlInjection.ql - -# Examine the file in an editor -edit java-sqli.sarif --
-An example of using the sarif data is in the the jq script ./sarif-summary.jq. -When run against the sarif input via -
-jq --raw-output --join-output -f sarif-summary.jq < java-sqli.sarif > java-sqli.txt --
-it produces output in a form close to that of compiler error messages: -
-query-id: message line - Path - ... - Path - ... --