0x00 前言
- 毕业的师兄推荐我来学习一下一款名叫codeql的代码审计工具,作为目前刚问世不久的代码审计工具拥有着巨大的优势,它在github上作为一款免费工具供安全审计人员使用,同时还可以利用其特性创造属于自己的编译语言规则。
0x01 安装步骤及环境配置
-
首先需要在官网下载并安装Visual Studio Code
-
在此处搜索codeql插件并安装
1,安装插件(已完成)
2,检查CodeQL CLI即核心程序
3,克隆工作车间Codeql starter
(直接下载https://github.com/Semmle/ql(更多的编写例子)https://github.com/github/vscode-codeql-starter(单一的编写例子作用不大)https://github.com/XiaoMi/galaxy-sdk-java.git也可以在cmd内利用 git clone +链接下载)
-
注:下载完后设置一个codeql-home文件夹,将两个下载好的压缩包解压进此文件夹
-
快速启用
1,在LGTM导入一个包
2,开启查询
-
打开扩展设置
-
修改执行路径,填写codeql cli的内的codeql.exe路径
-
在工作区打开下载好的Codeql ql
- 然后是在环境变量内的path加入codeql命令(C:\Users\Administrator\Desktop\codeql-home2\codeql-win64\codeql)
- 下一步就是建立数据库了(或导入数据库)
0x02 相关命令
- 在codeql执行程序根目录打开dos界面使用
codeql database create java-database -l=java -c="javac xxx.java"
codeql database create java-database | (利用codeql 创建名为java-database的java数据库) |
---|---|
-l=java | (编译语言为java) |
-c="mvn clean install -file pom.xml" | (利用命令进行编译,不知道为什么用这个会报错) |
-c="javac xxx.java" | (将xxx.java编译成xxx.class并生成codeql数据库) |
--source-root=./xxx/xxx | (设置路径,若未设置则默认在codeql执行程序目录下建库) |
codeql database upgrade java-database | (更新数据库) |
codeql database analyze ./xx/x1 --format=csv --output=xx/x2.csv | (利用xx/x1路径库对目标进行分析,并以csv的格式在xx/x2路径输出) |
0x03 关于建库
- 在这里做个失败案例
-
结果就是无法创建成功,也试过利用webgoat构建,但也是同样的问题,可谓是无所不用其极,但都是以失败告终,而在阅读了相关文档以及github,csdn社区后也是一无所获,对于像Java这类需要进行编译才能创建ql库的语言,目前能搜索到的相关资料是非常稀缺的,以上就是笔者目前遇到的问题,即无法正常创建一个java的ql库。
-
c/c++也无法正常建库,而例如javascript与python语言则可以顺利建库。
- 而开发人员的解释,则是他们还在解决这个问题,所以暂时还是不能正常建java库的,虽然说的是MacOS的,可是我的win11貌似也不行。
不过最终我还是找到了解决方法,使用-c="javac xxx.java"对目标java文件进行编译即可.
-
参考[7].3
-
但是要确保文件名和代码的主函数名一致,否则也会报错。(如果出现乱码情况,请把windows的显示语言转换成English即可解决,就可以成功建立数据库啦)
-
可以用命令利用BreakInSwitchCase.qlref生成csv报告
-
将建好的库导入vscode
-
在该路径增加一个demo.ql
-
即可开始编写ql查询语句,右键run query就能看到结果
- 下面再说明一下如何在LGTM中导入一个包的步骤
-
点击这个小头像
-
输入URL例如
https://lgtm.com/projects/g/apache/kafka
.再选择需要的语言即可。 -
最快速的开启方法是直接到lgtm网站进行编写查询:https://lgtm.com/query/6454096835092279761/
0x04 codeql审计代码原理图
-
可以参考绿盟这篇理解:https://cloud.tencent.com/developer/article/1645870
-
原理:编写查询语句找出代码中的漏洞,codeql内的编译器调用extractor将java代码编译成可查询的数据流,并以数据库的形式搭配ql库与编写的查询语句进行查询,得出结果并生成报告
0x05 漏洞分析
- 这里用试一下sql注入漏洞作为例子,由于无法正常建库,所以这里用网站进行演示
源码及查询语句
/**
* @name Query built from user-controlled sources
* @description Building a SQL or Java Persistence query from user-controlled sources is vulnerable to insertion of
* malicious code by the user.
* @kind path-problem
* @problem.severity error
* @security-severity 8.8
* @precision high
* @id java/sql-injection
* @tags security
* external/cwe/cwe-089
* external/cwe/cwe-564
*/
import java
import semmle.code.java.dataflow.FlowSources
import SqlInjectionLib
import DataFlow::PathGraph
from QueryInjectionSink query, DataFlow::PathNode source, DataFlow::PathNode sink
where queryTaintedBy(query, source, sink)
select query, source, sink, "Query might include code from $@.", source.getNode(), "this user input"
- 在网站可以看到报告有两处漏洞:
* 也可切换视图为alert更为直观地追踪
0x06 总结
我目前还在学习codeql阶段,有不少的纰漏还请大佬们多多包涵,写这篇文章的目的主要是想为安全小白分享一下codeql这款工具,希望读者看完后能有所收获以及避开我踩过的坑,我会继续学习新的安全知识,努力提升自己,将更多更优质的技术文章分享给大家,也请大佬们在评论区给小弟提些建议,后期我会在评论区及时回复您并且修改疏漏。
0x07 Reference
[1].官方文档
1,https://codeql.github.com/docs/
2,https://lgtm.com/help/lgtm/generate-database
[3].微软的codeql文档
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/devtest/static-tools-and-codeql
[4].关于codeql一系列的学习笔记
http://www.myhack58.com/Article/html/3/8/2020/96814.htm
[5].codeql官方练习题
1,https://www.jianshu.com/p/f141c6c85c1d #新手练习
2,https://lab.github.com/githubtraining/codeql-u-boot-challenge-(cc++) #课程
[6].CodeQL Java 全网最全的中文学习资料及相关教学视频
https://github.com/SummerSec/learning-codeql
[7].有关建立java库的解释
1,https://www.freebuf.com/articles/web/283795.html
2,https://paper.seebug.org/1324/ #转载自Seebug Paper
[8].codeql建java库成功的案例
[9].利用webgoat建立java库 #转自angelwhu_blog
[10].github上关于codeql的问答模块
https://github.com/github/codeql-cli-binaries/issues
[11].CodeQL跟踪java数据流。
https://www.jianshu.com/p/338d14e723c0
[12].生成的报告形式
https://www.cnblogs.com/goodhacker/p/13544871.html
下一期我将分享关于语法规则的相关知识