前言
在我們使用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
建了一個微信的安全交流群,歡迎添加我微信備注進群
,一起來聊天吹水哇,以及一個會發布安全相關內容的公眾號,歡迎關注 😃

