codeqlphp,Codeql⼊门教程
Codeql ⼊门教程
codeql是⼀个可以对代码进⾏分析的引擎, 安全⼈员可以⽤它作为挖洞的辅助或者直接进⾏挖掘漏洞,节省进⾏重复操作的精⼒
安装
虽然官⽅提供了可以进⾏查询的⽹站 但是由于速度不快和⼀些c/c++项⽬ 需要⾃定义编译命令来编译 实际上在⽹站是不能查询的
⾸先⼀个放codeql的⽬录 作者⽤的是/opt/codeql
然后从这⾥下载后解压到⽬录 然后下载semmle的库
完成后 ⽬录下应该有两个⽬录 codeql ql
接下来安装vscode插件 在插件市场直接搜索codeql即可 编写时安装量只有3k多 说明⽤codeql的体暂时还不多.
创建数据库
使⽤codeql database create 来创建⼀个⽤于查询的数据库 --language=python指定语⾔是python
例⼦
codeql database create ./codeql -s . --language=python
在这种解释性语⾔上并不困难 问题在于对于c编译语⾔ 需要⽤--command=xxx提供编译命令 虽然codeql会⾃动检测编译系统 但是在⼀些项⽬上不⾏ 这也导致你编译不了的项⽬就⽤不了codeql
在vscode把创建的codeql⽬录添加为数据库 就可以正式准备开始查询了
hello world
codeql语⾔的查询格式如下from int i where i = 3 select i
和sql⽐较像 from定义变量 where 声明限制条件 select 选择要输出的数据
可以使⽤的定义只有类和函数 例⼦代码// 函数
predicate Name(int i) {
i >5
}
// 类声明
class Name extend int {
// 类变量声明
int i
// 覆盖⽗类函数
override string func(){
}
}
导⼊包语法和python⼀致 也是import 名字
作为每个语⾔都有的惯例 运⾏⼀下以下代码吧
select "hello world"
审计使⽤
在这⾥你应该有了⾃⼰的数据库了 作者选取的是python的⼀个django项⽬ (很遗憾的是由于动态语⾔的特性 python的污点跟踪效果不怎么好)
codeql ⽀持的语⾔有python java JavaScript c/c++ c# go
并没有安全⼈员最喜欢⽬标⽤的语⾔ php, 也不⽤对以后抱太⼤期望 以php的动态特性和开发⼈员动不动就全局变量或者动态字符串导⼊⽂件的做法 污点跟踪和变量分析也没法⽤
进⾏代码查询 ⾸先要导⼊对应的编程语⾔包import python
需要注意的是不同语⾔包的使⽤⽅法不⼀样 ⽽且⽬前的⽂档不是很好 也没有全⾯的教程
codeql的python库把对象分为了⼏种类型分别是
Scope 作⽤域 像函数或者类
Expr 表达式 像 1+1
Stmt 语句 例如 if(xxx)
Variable 变量
作为代码审计的开始 让我们先看看这个库调⽤的危险函数 在这⾥查了 django的重定向函数redirectimport python
from Call c ,Name n Func() = n Id() = "redirect"
select c,"redirect"
我们选择了call和name变量, call是⼀个函数调⽤
然后调⽤ c.getFunc() 来获取调⽤的函数, 为什么函数是⼀个Name呢
在python中 test() 实际上是对test这个变量进⾏调⽤ ⽽在语法树上test是⼀个变量名
最后我们要求n.getId() 获得的名字是redirect
可以发现这⾥能查到的都是redirect() ⽽不是xx.redirect
如果我们想要寻(xxx)的调⽤ 必须使⽤Attribute
from Attribute a,Attribute b
Name() = "get" Object() =b
and (b.getName() = "GET" Name() = "post")
select a,"get request var"
可以发现随着查询复杂度的增加 代码⾏数在不断增加 这个时候就应该使⽤函数来解耦
假设我们查询⼀个Expr 像上⾯的例⼦ 但是不想查到test 或者debug 开头的⽂件 在Expr或者Stmt都可以通过getLocation()来获取当前位置 可以写⼀个函数predicate isNoTest(Expr e){
Location().getFile().getBaseName().matches("debug%") and
Location().getFile().getBaseName().matches("test%")
}
通过不断添加限制条件 在代码审计中可以锁定⾃⼰想要看到的函数调⽤. codeql不仅如此,还可以通过结合判断条件来寻⾃⼰⽬标中的代码
例如我们希望到⼀个函数中有获取请求数据并赋值的语句 还进⾏了重定向
⾸先作为⼀个赋值语句的终点 .get(xx) 是⼀个调⽤ 添加select Call c
// 省略
Func() = a
然后添加⼀个赋值语句 要求右端是上⾯的调⽤select Assign assign
// 省略
Value() = c
再要求它们的作⽤范围是同⼀个函数from Function fphp语言零基础入门
// 省略
and (Scope() = f Scope() =f)
最后代码import python
from Attribute a,Attribute b,Call c,
Function f, Assign assign, Name n,
Call redirectCall,Name n1
Name() = "get" Object() =b
and (b.getName() = "GET" Name() = "post")
AStmt() = assign
Func() = a
Value() = c
Func() = n1 Id() = "redirect"
and (Scope() = f Scope() =f)
select f
也可以查询变量是否直接进⾏危险函数,但是由于赋值和各种字符串操作之类的关系 应该属于污点分析的内容了
后⾔
这篇教程讲了如何去⽤codeql去做代码审计辅助.在拥有思路后去编写这种查询的最⼤难点 就是⽂档差了 使⽤⼈数少 你⽆法⾕歌到xxx如何去查询 只能⾃⼰去查⽂档去查那些函数到底怎么⽤.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。