环境搭建
解析引擎:github.com/github/codeql-cli-binaries/releases
SDK:https://github.com/github/codeql
VS Code Workspace :https://github.com/github/vscode-codeql-starter
首先将D:\nettools\CodeQL_tools\codeql-win64\codeql解析引擎添加到环境变量中,
vscode安装codeql插件,
设置解析引擎,
然后打开vscode-codeql-starter,将SDK拖到工作组的ql中,
闭源项目创建数据库,可以使用该工具:https://github.com/ice-doom/codeql_compile,
D:\yingyong\javaidea\IntelliJ IDEA 2022.3.3\plugins\java-decompiler\lib\java-decompiler.jar,
然后使用codeql新建数据库,这里是编译后的文件,
python codeql_compile.py -a D:\nettools\CodeQL_tools\works\hsqldb_2_7_3\source -d D:\nettools\CodeQL_tools\works\hsqldb_2_7_3\lib
开源使用以下方法,
使用codeql编译生成数据库,
首先新建目录hsqldb_2_7_3_analyze_client\src\main\java,
然后将org.hsqldb...放入其中,
mvn clean package,成功运行jar包后,就可以生成数据库了,
开始生成数据库,
codeql database create D:\nettools\CodeQL_tools\works\hsqldb_2_7_3\hsqldb_database -l=java --command="mvn clean install --file pom.xml" --source-root=D:\nettools\java_shiyan\dabao_mvm
--command="mvn clean compile --file pom.xml -Dmaven.test.skip=true"
安装java扩展,
然后就可以运行相应的ql文件进行查询了,
查看历史记录,
规则编写
查找函数调用,只能在相关函数中查找,
import java
import semmle.code.java.frameworks.spring.SpringController
import semmle.code.java.dataflow.TaintTracking
from Call call,Callable callable,Method method
where
//查找调用getObject的地方
call.getCallee() = callable and
//给getObject函数设置类属性,方便准确查找,
callable.getDeclaringType().hasQualifiedName("org.hsqldb.types", "OtherType") and
callable.hasName("convertSQLToJava")
//设置source,设置sink为调用
//TaintTracking::localTaint(DataFlow::parameterNode(method.hasName("compileCallStatement")),DataFlow::exprNode())
select call,callable
函数调用链查询,
开头的注释会将调用链展示出来,
/**
@kind path-problem
*/
import java
class StartMethod extends Method {
//指定方法,因此是以方法的定义开始,
StartMethod() {
this.getName() = "compilePart"
}
}
class TargetMethod extends Method {
TargetMethod() {
this.getName() = "getObject" and
this.getDeclaringType().hasQualifiedName("org.hsqldb.types", "JavaObjectData")
}
}
//从这里开始,就是查询谁调用了getObject
class TargetMethod_callable extends Callable {
TargetMethod_callable() {
exists(Callable a| this.polyCalls(a) and
a instanceof TargetMethod
)
}
}
//b调用了a,polyCalls函数为找到接口实现类中的方法,
query predicate edges(Method a, Method b) { a.polyCalls(b) }
from StartMethod start, TargetMethod_callable end
where edges+(start, end)
select start, start, end, "$@ $@ to $@ $@" ,
start.getDeclaringType(),start.getDeclaringType().getName(),
start,start.getName(),
end.getDeclaringType(),end.getDeclaringType().getName(),
end,end.getName()
扫描结果,
最终分析了一波,第二条链子最有可能成功,
其他三条链都是通过e.dataType.convertSQLToJava来调用的,
只有第二条链不是调用的dataType的convertSQLToJava,不过我没有调出来,交给大佬们了,
还有tabby静态代码分析工具,后面再来学习了。
参考:
环境搭建:https://moonsec.top/articles/128
规则学习:
https://github.com/safe6Sec/CodeqlNote?tab=readme-ov-file
https://tttang.com/archive/1415/
https://tttang.com/archive/1511/