浅谈利用codeql进行java代码审计分析(1)

YQ 2021-11-15 09:57:00

0x00 前言

  • 毕业的师兄推荐我来学习一下一款名叫codeql的代码审计工具,作为目前刚问世不久的代码审计工具拥有着巨大的优势,它在github上作为一款免费工具供安全审计人员使用,同时还可以利用其特性创造属于自己的编译语言规则。

0x01 安装步骤及环境配置

  • 首先需要在官网下载并安装Visual Studio Code
    图片.png

  • 在此处搜索codeql插件并安装

图片.png
1,安装插件(已完成)

2,检查CodeQL CLI即核心程序

(直接在下载[https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip](https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip)

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,开启查询

图片.png

  • 打开扩展设置
    图片.png

  • 修改执行路径,填写codeql cli的内的codeql.exe路径

  • 在工作区打开下载好的Codeql ql

图片.png

  • 然后是在环境变量内的path加入codeql命令(C:\Users\Administrator\Desktop\codeql-home2\codeql-win64\codeql)

图片.png

  • 下一步就是建立数据库了(或导入数据库)

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 关于建库

  • 在这里做个失败案例

图片.png

  • 结果就是无法创建成功,也试过利用webgoat构建,但也是同样的问题,可谓是无所不用其极,但都是以失败告终,而在阅读了相关文档以及github,csdn社区后也是一无所获,对于像Java这类需要进行编译才能创建ql库的语言,目前能搜索到的相关资料是非常稀缺的,以上就是笔者目前遇到的问题,即无法正常创建一个java的ql库。
    图片.png

  • c/c++也无法正常建库,而例如javascript与python语言则可以顺利建库。

图片.png

  • 而开发人员的解释,则是他们还在解决这个问题,所以暂时还是不能正常建java库的,虽然说的是MacOS的,可是我的win11貌似也不行。

不过最终我还是找到了解决方法,使用-c="javac xxx.java"对目标java文件进行编译即可.

  • 参考[7].3
    图片.png

  • 但是要确保文件名和代码的主函数名一致,否则也会报错。(如果出现乱码情况,请把windows的显示语言转换成English即可解决,就可以成功建立数据库啦)
    图片.png

  • 可以用命令利用BreakInSwitchCase.qlref生成csv报告
    图片.png

  • 将建好的库导入vscode
    图片.png

  • 在该路径增加一个demo.ql

  • 即可开始编写ql查询语句,右键run query就能看到结果

图片.png

  • 下面再说明一下如何在LGTM中导入一个包的步骤

图片.png

  • 点击这个小头像
    图片.png
    图片.png

  • 输入URL例如https://lgtm.com/projects/g/apache/kafka.再选择需要的语言即可。

  • 最快速的开启方法是直接到lgtm网站进行编写查询:https://lgtm.com/query/6454096835092279761/

图片.png

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"
  • 在网站可以看到报告有两处漏洞:

图片.png * 也可切换视图为alert更为直观地追踪

图片.png

0x06 总结

​ 我目前还在学习codeql阶段,有不少的纰漏还请大佬们多多包涵,写这篇文章的目的主要是想为安全小白分享一下codeql这款工具,希望读者看完后能有所收获以及避开我踩过的坑,我会继续学习新的安全知识,努力提升自己,将更多更优质的技术文章分享给大家,也请大佬们在评论区给小弟提些建议,后期我会在评论区及时回复您并且修改疏漏。

0x07 Reference

[1].官方文档

1,https://codeql.github.com/docs/

2,https://lgtm.com/help/lgtm/generate-database

[2].利用codeql挖掘各类java漏洞
https://blog.csdn.net/haoren_xhf/article/details/115064677?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.no_search_link

[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

3,https://blog.csdn.net/qq_38049062/article/details/116865812?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link

[8].codeql建java库成功的案例

https://blog.csdn.net/qq_38049062/article/details/116865812?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link

[9].利用webgoat建立java库 #转自angelwhu_blog

https://www.angelwhu.com/paper/2019/12/30/CodeQL-introduction/#0x00-%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA

[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

下一期我将分享关于语法规则的相关知识

评论

YQ

一ming网络安全专业在校生

twitter weibo github wechat

随机分类

事件分析 文章:223 篇
安全开发 文章:83 篇
其他 文章:95 篇
后门 文章:39 篇
APT 文章:6 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

0

0x0dee

标题写错了,是ASX to MP3 3.1.3.7 - '.m3u' Local

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

目录