前言
在我们使用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"
- 更一般的查询
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
这部分剩下还有一个javascript
和java
的案例就不再赘述了
END
建了一个微信的安全交流群,欢迎添加我微信备注进群
,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注