文章目录

  • 前言
  • CodeQL基本语法
    • 1.语法结构
    • 2.类库
    • 3.谓词
    • 4.基本数据类型及其内建函数

前言

学习利用CodeQL进行Java代码审计。包含一些概念和例子。


CodeQL基本语法

CodeQL是利用解析引擎把我们需要审计的项目解析成了数据库,注意此处的数据库是转换成CodeQL能识别的中间层数据库。因为核心的解析引擎是不开源的,所以生成一个中间数据库。然后我们可以编写相关的QL规则,然后CodeQL引擎会根据规则去数据库中找到满足条件的数据,我们再分析即可。

1.语法结构

1)QL查询的语法结构为:

from [datatype] var  /* ... 变量声明... */
where condition(var = something)   /* ... 逻辑公式 ... */
select var    /* ... 表达式 ... */

2)一个小例子作用就是在所有的整形数字i中,当i==1的时候,输出 i。

// 表示我们要引入CodeQL的类库,因为我们分析的项目是java的,所以在ql语句里,必不可少
import java// 表示我们定义一个变量i,它的类型是int,表示我们获取所有的int类型的数据
from int i
// 表示当i等于1的时候,符合条件
where i = 1
// 表示输出i
select i


     3)也可以利用官方搭建的平台练习写一些规则。LGTM查询控制台:https://lgtm.com/query

2.类库

1)CodeQL解析引擎会把我们需要审计的项目代码转换为CodeQL可识别的AST数据库,格式如下所示。可以看出来大体是两级一个是导入的包,一个是类的。类的下面是一些方法、属性等。类库实际上就是上面AST的对应关系。

     2)比如说想要获取所有类当中的方法,在AST中 Method 就表示获取当前项目中所有的方法。如下所示:

import javafrom Method method
select method



     3)升级一下,通过Method类内置的一些方法,把结果过滤一下。比如获取名字为get的方法名称。

import javafrom Method method
where method.hasName("get")
/**
method.getName() 获取的是当前方法的名称
method.getDeclaringType() 获取的是当前方法所属class的名称。
**/
select method.getName(), method.getDeclaringType()

3.谓词

1)谓词是用于描述构成 QL 程序的逻辑关系。概念上和函数有点像。个人根据官方文档理解,谓词就是一个一元数组或二元数组,一元数组的集合谓词元数就是一,二元数组的集合谓词元数就是二。通常,谓词中的所有元组都具有相同数量的元素。谓词的数量是元素的数量,不包括可能的result变量。QL中有许多内置谓词,可以参考官方文档:https://codeql.github.com/docs/ql-language-reference/ql-language-specification/#built-ins。
     2)定义一个谓词条件:

  • 需要关键字 predicate
  • 需要一个小写字母开头的标识符,例如:isCountry
  • 定义参数,多个用逗号连接,每个参数,需要指定参数类型和参数变量的标识符。
  • 谓词本身一个大的花括号 “{ }”

3)官方例子:

predicate isCountry(string country) {country = "Germany"orcountry = "Belgium"orcountry = "France"
}predicate hasCapital(string country, string capital) {country = "Belgium" and capital = "Brussels"orcountry = "Germany" and capital = "Berlin"orcountry = "France" and capital = "Paris"
}

4)上方查询get的例子还可以按照如下所示改写。

import javapredicate isGet(Method method) {exists(|method.hasName("get"))
}from Method method
where isGet(method)
select method.getName(), method.getDeclaringType()
语法解释:
predicate 表示当前方法没有返回值。
exists子查询,是CodeQL谓词语法里非常常见的语法结构,它根据内部的子查询返回true or false,
来决定筛选出哪些数据。


     5)谓词可分为带有结果的谓词和不带有结果的谓词。区别就是是否引入了特殊变量result,有result的话就可以顶替predicate了。参考官方案例:

// 无结果的谓词
predicate isSmall(int i) {i in [1 .. 9]
}
// 如果i是正整数并且小于10,则isSmall(i)成立。// 有结果的谓词
int getSuccessor(int i) {result = i + 1 andi in [1 .. 9]
}// 如果i是正整数并且小于10,则这个谓词的结果就是接替i

4.基本数据类型及其内建函数

1)QL语言中的基本数据类型,包括整型、浮点型、日期型、布尔型以及字符串类型。需要注意的是,对于QL语言来说,其支持的数据类型都带有相应的内建函数——通俗来说,就是系统已经为我们写好的函数就是谓词,我们直接拿来就能用了。
     2)举例来说,如果我们想求一个整数的绝对值,直接调用内建函数abs()即可,例如1.abs()。

     2)就是如果我们要调用某种类型的变量的通用形式为:直接在变量后面加上一个点号,然后加上要调用的内建函数即可。同时,我们还可以通过点号将多个函数串联起来,也就是对变量连续进行多种处理,例如,对于一个整型变量s,先求绝对值,再开平方,我们可以将这个处理过程表示为:s.abs().sqrt()。

     3)字符串类型,和其他语言差不多。

from string s
where s = "he\"llo"
select s



     4)整型与浮点型。

from float a, int b
where a = 5.3 and b = 2
// pow的作用就是参数的几次幂  下方例子就是5.3的2次幂
select a.pow(b)



     5)日期型。编写一个查询,来计算首个武汉疫情到现在已经过去了多少天了。

from date start, date now
// toDate()作用就是将指定的字符串转换为日期值
where start = "1/12/2019".toDate() and now = "25/10/2022".toDate()
select start.daysTo(now)


CodeQL笔记之基本语法(一)相关推荐

  1. python基本语法语句-python学习笔记:基本语法

    原标题:python学习笔记:基本语法 缩进:必须使用4个空格来表示每级缩进,支持Tab字符 if语句,经常与else, elif(相当于else if) 配合使用. for语句,迭代器,依次处理迭代 ...

  2. python3语法都相同吗_python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样...

    python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样,IDLE shell编辑器,快捷键:ALT+p,上一个历史输入内容,ALT+n 下一个历史输入 ...

  3. java基本语法心得_Java学习笔记(一)——基础语法(上)

    Java学习笔记(一)--基础语法(上) 软件构造 写在前面 编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的 ...

  4. Programming Languages PartA Week2学习笔记——SML基本语法

    Programming Languages PartA Week2学习笔记--SML基本语法 首先简单介绍使用的SML语言,参考维基百科和百度百科: ML(Meta Language:元语言)是由爱丁 ...

  5. 《PHP学习笔记——PHP基本语法》

    <PHP学习笔记--PHP基本语法> 前言: PHP是一门服务端脚本语言,像JavaScript一样,也是一门弱类型语言.弱类型语言最大的特点是允许变量隐式转换.这样,相对于Java这种强 ...

  6. JNI开发笔记(五)--JNI语法总结

    JNI语法总结 引 前言 1. 传参类型为变量/变量指针 1.1 变量 1.2 变量指针 2. 传参类型为数组指针 3. 传参类型为结构体指针 引 JNI开发笔记(一)–Android Studio安 ...

  7. 鸟哥的私房菜Linux 学习笔记之 Bash语法

    学习笔记备忘 case的语法 PATH=${PATH}:~/binexport PATHread -p "please input:" wordcase $word in &quo ...

  8. ANTLR笔记2 - 简单语法说明

    ANTLR的语法文件使用扩展巴科斯范式EBNF描述,记得编译原理的用起来非常简单,需要进一步了解的是怎么构造自己的recognizer和translator.很多的语法不需要从头写,一方面很多语言标准 ...

  9. 【编译原理笔记10】语法制导翻译:在递归预测过程中进行翻译,L属性定义的自底向上翻译

    本次笔记内容: 5-7 在递归预测过程中进行翻译 5-8 L属性定义的自底向上翻译 本节课幻灯片,见于我的 GitHub 仓库:第10讲 语法制导翻译_3 文章目录 在递归的预测分析过程中进行翻译 算 ...

最新文章

  1. java 实例对象拷贝,实例详解java对象拷贝
  2. 【实战练习】通过docker部署jenkins
  3. 【SpringBoot 2】(五)自动配置简析源码 开发中小技巧
  4. Linux 系统创建.sh文件以及赋权、执行
  5. 数据分析20大基本分析方法技术总结【分析目的、分析案例、分析方法与思路】
  6. SpringBoot2.0应用(五):SpringBoot2.0整合MyBatis
  7. Python编写API接口
  8. 日本著名数学游戏专家中村义作教授提出这样一个问题:将2520个桔子分给六个儿子
  9. Python飞机大战项目终篇(一步一步实现---最全笔记)
  10. 黑马python5.0课件_2020整理的黑马python 5.0新课程体系零基础到就业大实战
  11. 关于原型设计的工具——AXURE
  12. 在项目中如何做图片优化
  13. 切片器可以设置日期格式?_如何分秒必争浅淡时间切片器
  14. android界面侧滑,Android 开发之Android Material Design NavigationView侧滑界面自定义
  15. Acer传奇Go电脑开机自动安装软件卡死怎么重装系统?
  16. Ping过程的完全解析
  17. 临近2022年末: Android 开发者的出路在哪?转行还是进阶?
  18. 数据库实验报告【学会使用企业管理器和查询分析器管理工具】
  19. c函数 postgres_C-语言函数
  20. ant-design vue input通过那个事件可以获得输入框变化的值_VUE使用百度地图教程

热门文章

  1. auto.js 快手自动评论脚本 引流操作
  2. git使用进阶(一)
  3. 从豆瓣看《长安十二时辰》如何成为爆款IP?
  4. 两分钟教你学会视频添加滚动字幕并调整色调
  5. 无法打开Win10计算机管理,Win10右键管理打不开|此电脑管理打不开解决方法
  6. TransCad导入Excel中的OD矩阵和PA数据
  7. 深度学习GPU选购指南:哪款显卡配得上我的炼丹炉?
  8. 计算机网络复习笔记 之协议相关
  9. react 中 ref 管理列表
  10. Unity中雾效的开启