Java反序列化工具利用篇02-codeql

0x00 前言

搭建CodeQL的过程还是比较困扰的,翻了好多篇文章才找到一个讲明白的,所以我不想写一篇读者看不明白的文章。

0x01 CodeQL概念

CodeQL是一个免费开源的代码语义分析引擎,其利用QL语言对代码、执行流程等进行“查询”,以此实现对代码的安全性白盒审计,进行漏洞挖掘。

简单来说,CodeQL是一个把需要审计的项目先转化成类似数据库的形式,并基于该database进行分析的工具。

0x02 CodeQL搭建

1.下载CodeQL引擎:

https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip

先把该引擎配到环境变量,方便执行CodeQL语句。至于怎么配环境变量,我认为就无需多说了,结果如下即可:

image-20250416133528225

2.下载SDK:

https://codeload.github.com/github/codeql/zip/refs/heads/main

我们之后要在该SDK下面写ql语句并执行。

3.vscode下载CodeQL插件:

image-20250416133059478

然后会在vscode左边的侧边栏发现”QL”图标,即是CodeQL图标。

打开设置,把CodeQL引擎的路径写上去:

image-20250416133157628

有些师傅只写到CodeQL.exe所在目录,我试过不太行,可能是个人问题。如果这个路径不对,vscode右下角有弹窗,也有日志输出。

4.Maven项目建库

如果需要审计的是一个Maven项目,一些人喜欢用这个指令:

1
codeql database create name_1 --language=java --command="maven clean install --file=pom.xml" --source-root path_1
  • path_1是当前需要审计的项目路径,name_1是CodeQL将要建立数据库的名称。

这个命令,就是个屁。

有些Maven项目是没有构建过的,一些插件是需要人为添加上去的,直接一个maven clean install --file=pom.xml有啥用?

要自己打开Maven项目,把项目构建好;除此之外,还需要添加一个插件,本人是先下对应依赖再添加:

1
2
3
4
5
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
</dependency>
1
2
3
4
5
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
</plugin>

然后先执行:

1
maven clean install --file=pom.xml

成功构建了,再执行:

1
codeql databse create name_1 --language=java  --source-root path_1

分步执行,才方便解决错误。

5.vscode执行查询

以下操作都在vscode执行,先打开CodeQL选项卡。

先把SDK目录放入下图,并放入工作区:

image-20250416201352806

然后添加数据库,我的name_1位置的参数(生成的数据库名)命名为codeql:

image-20250416203405651

然后在工作区找到SDK(第一个,codeql-main):

image-20250416203534003

在codeql-main打开路径/java/ql/src,写一个demo.ql:

1
2
3
4
5
import java

from Method method
where method.hasName("getValue")
select method.getName(), method.getDeclaringType()

image-20250416203741079

确保Java库正确导入

然后运行:

image-20250416203927868

image-20250416204045280

至此,CodeQL的构建就完成了,之后就是学习语法,不断实践了。