前言

在我们使用​​codeql​​​进行代码审计之前,不妨先学习一些​​QL​​的基础语法,磨刀不误砍柴工。

官方教程链接:​​https://codeql.github.com/docs/writing-codeql-queries/ql-tutorials/​

在这个教程中我们作为一个侦探,为了解决遇到的问题使用​​QL​​进行相应的调查

QL介绍

通过一些简单的练习和例子来帮助我们了解​​QL​​​和​​CodeQL​​的基础知识

任何使用过 SQL 的人都会对 QL 的基本语法看起来很熟悉,但它的使用方式略有不同。

QL 是一种逻辑编程语言,因此它是由逻辑公式构成的。QL 使用常见的逻辑连接词(例如and,or和not)、量词(例如foralland exists)和其他重要的逻辑概念(例如谓词)。

QL 还支持递归和聚合。这允许您使用简单的 QL 语法编写复杂的递归查询,并直接使用聚合,例如count、sum和average。

以下的例子都在配置好环境的​​VScode​​上运行

  • 输出hello world
import python
select "hello world"

QL教程1-QL介绍_微信

  • 更一般的查询
import <language> /* 导入对应的语言包 */

/* 可能存在的 一些谓词 类的设置 */

from /* 声明变量等 */
where /* 设置逻辑表达式 */
select /* 打印结果 */
  • 进行一个乘法
import python
from int i,int j
where i=6 and j=8
select i*j

需要注意的是,codeql中存在5种类型: int date float boolean string, 每个类型有对应的谓词(也可以先理解为函数)可以被调用,当我们需要输入函数的时候,在vscode中会像以前我们编写java或者python一样进行提示。

  • 进行字符串长度查询
import python
select "springbird".length()
  • 编写一个查询,返回3^5和245.6这两个数中小的那一个的正弦值。
import python
from float x,float y
where x=3.pow(5) and y=245.6
select x.minimum(y).sin()
  • 返回​​false​​相反的值
import python
from boolean x
where x=false
select x.booleanNot()
  • 编写一个查询,计算 2017 年 6 月 10 日到 9 月 28 日之间的天数
from date start, date end
where start = "10/06/2017".toDate() and end = "28/09/2017".toDate()
select start.daysTo(end)

在上面的查询中我们都值select出了一个结果,我们也可以使用select 输出多个结果,就像是

select 1,2,3
  • 计算1 到 10 之间的所有毕达哥拉斯三元组
from int x,int y,int z
where x in [1,2,3,4,5,6,7,8,9,10] and y in [1,2,3,4,5,6,7,8,9,10] and z in [1,2,3,4,5,6,7,8,9,10] and x*x+y*y=z*z
select x,y,z

可以看到上面的代码中[1,2,....10]这里是重复的,以及​​x*x​​​,​​y*y​​这里也是重复的,所以我们可以考虑将其定义为一个类方便代码的复用

class SmallInt extends int{
SmallInt(){
this in [1,2,3,4,5,6,7,8,9,10]
}
int square(){
result=this*this
}
}
from SmallInt x, SmallInt y, SmallInt z
where x.square() + y.square() = z.square()
select x, y, z

到这里​​ql​​​中的内置原始类型我们就学习的差不多了,但我们其实是想要分析代码中的漏洞,所以现在需要进一步了解如何使用​​CodeQL​​分析项目代码

这里我们使用的是​​python-flask​​的一个项目

  • 查询项目中有哪些函数参数数量大于7

这里的from子句定义了一个ftemp表示python函数的变量,该where部分限制参数数量为我们所要求的,最后select查询出了结果

import python
from Function tempf
where count(tempf.getAnArg())>7
select tempf

QL教程1-QL介绍_java_02


这部分剩下还有一个​​javascript​​​和​​java​​的案例就不再赘述了

END

公众号,欢迎关注 😃


QL教程1-QL介绍_微信_03