• QL教程1QL介绍


    前言

    在我们使用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
  • 相关阅读:
    HDU 1051
    HDU 1236
    递归求gcd(a,b)
    HDU 1372
    HDU 1312
    HDU 1253
    HDU 1072
    ...别人的推荐、
    搜索总结、
    TortoiseHg简单的入门使用说明
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/15807860.html
Copyright © 2020-2023  润新知