codeql白盒代码审计工具初体验

admin 2022年7月17日21:21:40评论1,204 views字数 3775阅读12分35秒阅读模式

Codeql作为一款半自动化代码审计工具,据说被称为0day挖掘神器。本文作为codeql的扫盲篇,带大家了解一下该工具的基本使用。主要内容包含有codeql工具的安装,然后通过java-sec-code靶场,编写SQL注入的检测语句,在这个过程中初步了解codeql的工作流程以及查询语法结构。

Codeql安装
基础环境:
mac
Java8
Visual studio code

Maven

安装codeql一共有3个部分需要安装,首先是codeql-cli,这是codeql的命令行执行工具。然后是codeql-lib,这是后续用于写codeql查询语句所需要的部分依赖库。最后是安装并配置Visual studio code中的codeql插件,用于后续SQL注入漏洞挖掘的调试。

 01 
安装codeql-cli

下载地址为

https://github.com/github/codeql/tree/codeql-cli/v2.6.0

在我本地的保存路径为

/Users/sojrs/Documents/research/SDL/CodeQL/codeql-cli

codeql白盒代码审计工具初体验

后续我会把下载的codeql-lib也放在/Users/sojrs/Documents/research/SDL/CodeQL/目录中

然后将/Users/sojrs/Documents/research/SDL/CodeQL/添加到环境变量中

codeql白盒代码审计工具初体验

终端中执行codeql version,即表示codeql-cli已经安装成功并添加在环境变量里

codeql白盒代码审计工具初体验

 02 
安装codeql-lib

我这里下载的是v1.26.0版本的库,下载地址:

https://github.com/github/codeql/tree/v1.26.0

下载完成后保存到/Users/sojrs/Documents/research/SDL/CodeQL/codeql-lib-v2.6.0路径中

codeql白盒代码审计工具初体验

完成以上两步后,我们的codeql就已经安装成功了,但是要在visual studio code中调试的话,还需要安装visual studio code的插件codeql。

 03 
vs插件codeql安装

在vs的拓展商店中搜索并安装

codeql白盒代码审计工具初体验

安装完成后,点击codeql插件设置处,在这里需要配置执行的codeql程序的路径。我本地的路径为/Users/sojrs/Documents/research/SDL/CodeQL/codeql-cli/codeql

codeql白盒代码审计工具初体验

到这里我们的codeql调试环境就已经配置好了。

Java-sec-code 数据库配置

接下来我们以java-sec-code库做演示,利用codeql写一个查询SQL注入漏洞的查询语句。

 01 
Java-sec-code 数据库编译

首先下载java-sec-code库,下载地址为:

https://github.com/JoyChou93/java-sec-code

Java-sec-code库是一个简单的java漏洞靶场,对于我们理解常见java漏洞很方便,同时由于漏洞利用过程中的调用链很简单,也便于我们初学codeql的同学熟悉codeql的查询语法。

下载后保存到/Users/sojrs/Documents/research/SDL/CodeQL/java-sec-code-master。

在终端中切换到该路径,并执行

codeql database create qldb-test --language=java

这里命令的意思是,在终端的当前目录对源代码进行编译,指定编译目标代码为java,编译完成后生成的文件保存在qldb-test目录中。注意这里codeql默认会通过maven进行编译,所以环境中要安装好maven。我这里的maven版本v3.8.6,java 1.8.0

codeql白盒代码审计工具初体验

执行完成后,提示成功创建qldb-test库

codeql白盒代码审计工具初体验

qldb-test库可以理解成是一个数据库。Codeql在这里做的一个工作就是将java-sec-code源代码库以一定的规律,生成qldb-test数据库。后续我们所写的codeql查询语句,都最终会在qldb-test数据库中执行。

 02 
vs导入 codeql-lib 库

当我们写codeql查询语句,需要对应的依赖库,因此我们需要在vs工作区中导入之前下载的codeql-lib库。文件-》将文件夹添加到工作区

codeql白盒代码审计工具初体验

选择我们下载的vodeql-lib-v2.6.0文件的对应目录,即可

codeql白盒代码审计工具初体验

 03 
vs导入数据库

接下来我们在vs中导入qldb-test数据库

codeql白盒代码审计工具初体验

选择from a folder,选择我们刚创建的qldb-test目录

codeql白盒代码审计工具初体验

回到vs的工作区,如图所示,到这里qldb-test数据库以及codeql-lib依赖库都已经配置完成

codeql白盒代码审计工具初体验

通过 codeql 挖掘 SQL 注入漏洞

在工作区新建example-query文件夹,用于编写codeql查询语句,在该文件夹中新建qlpack.yml和javaseccode-sqlinjectquery.ql文件。其中qlpack.yml是codeql的配置文件,用于指定查询语句的所在库、版本、依赖等基本信息。

我们这里的qlpack.yml配置文件内容如下所示

name: example-queryversion: 0.0.0libraryPathDependencies: codeql-java

codeql白盒代码审计工具初体验

javaseccode-sqlinjectquery.ql文件中保存我们所编写的查询语句。我这里给一段已经写好的用于查询java-sec-code中SQL注入漏洞的查询语句

import javaimport semmle.code.java.dataflow.DataFlowimport semmle.code.java.dataflow.FlowSources
class SqlinjectConfiguration extends TaintTracking::Configuration{ SqlinjectConfiguration() { this = "java-sec-code SqlinjectConfiguration" }
override predicate isSource(DataFlow::Node source){ source instanceof RemoteFlowSource }
override predicate isSink(DataFlow::Node sink){ exists(Call call | sink.asExpr() = call.getArgument(0) and call.getCallee().getQualifiedName() = ["UserMapper.findByUserNameVuln01","UserMapper.findByUserNameVuln02","UserMapper.findByUserNameVuln03"] ) } override predicate isSanitizer(DataFlow::Node sink){ exists(Call call | sink.asExpr() = call.getArgument(0) and call.getCallee().toString() = "sqlFilter" ) }
}
from SqlinjectConfiguration dataflow, DataFlow::Node source, DataFlow::Node sinkwhere dataflow.hasFlow(source, sink)select source,sink

这段查询语句的基本内容就是获取远程输入的参数作为输入源source,获取本地执行函数为findByUserNameVuln01、findByUserNameVuln02、findByUserNameVuln03的作为漏洞执行点sink。从source到sink的路径中,如果存在被函数sqlFilter调用的情况,则不标记。最终执行的结果如图所示

codeql白盒代码审计工具初体验

从结果看,精确地检测出了java-sec-code中的三个注入点,且没有误报。

我们再通过codeql-lib库中自带的sql注入检测语句查询,查询语句位于

/Users/sojrs/Documents/research/SDL/CodeQL/codeql-lib-v2.6.0/java/ql/src/Security/CWE/CWE-089/SqlTainted.ql

右键点击codeql::run query

codeql白盒代码审计工具初体验

执行结果如下

codeql白盒代码审计工具初体验

自带的sql注入查询语句检测出1个漏洞,漏报了2个注入漏洞

    总  结    

从目前的使用情况看,codeql是一款半自动化的漏洞检测工具,其中自带有部分检测规则,从检测结果看,虽然存在检测漏报的情况,但是精确度较高,没有误报。我个人觉得这款工具非常适合用于0day漏洞的挖掘,尤其是一些已知漏洞的绕过利用方式的挖掘,想想看,当你已经明确知道代码中最后的漏洞执行点却无法找到远程触发的方式的时候,通过codeql可以很方便的解决这个问题。如果作为企业的自动化白盒扫描工具,fortify会更有优势,毕竟误报可以通过人工排查的方式解决,而漏报是不能接受的。


codeql白盒代码审计工具初体验


codeql白盒代码审计工具初体验

原文始发于微信公众号(第59号):codeql白盒代码审计工具初体验

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月17日21:21:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   codeql白盒代码审计工具初体验https://cn-sec.com/archives/1178862.html

发表评论

匿名网友 填写信息