QL教程1-QL介紹


前言

在我們使用codeql進行代碼審計之前,不妨先學習一些QL的基礎語法,磨刀不誤砍柴工。

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

在這個教程中我們作為一個偵探,為了解決遇到的問題使用QL進行相應的調查

QL介紹

通過一些簡單的練習和例子來幫助我們了解QLCodeQL的基礎知識

任何使用過 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*xy*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


這部分剩下還有一個javascriptjava的案例就不再贅述了

END

建了一個微信的安全交流群,歡迎添加我微信備注進群,一起來聊天吹水哇,以及一個會發布安全相關內容的公眾號,歡迎關注 😃

GIF GIF


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM