利用codeql查找hsqldb2.7.3最新反序列化链
tj 发表于 四川 漏洞分析 3205浏览 · 2024-06-11 15:01

环境搭建

解析引擎:github.com/github/codeql-cli-binaries/releases
SDK:https://github.com/github/codeql
VS Code Workspace :https://github.com/github/vscode-codeql-starter

首先将D:\nettools\CodeQL_tools\codeql-win64\codeql解析引擎添加到环境变量中,

vscode安装codeql插件,

设置解析引擎,

然后打开vscode-codeql-starter,将SDK拖到工作组的ql中,

闭源项目创建数据库,可以使用该工具:https://github.com/ice-doom/codeql_compile,
D:\yingyong\javaidea\IntelliJ IDEA 2022.3.3\plugins\java-decompiler\lib\java-decompiler.jar,
然后使用codeql新建数据库,这里是编译后的文件,
python codeql_compile.py -a D:\nettools\CodeQL_tools\works\hsqldb_2_7_3\source -d D:\nettools\CodeQL_tools\works\hsqldb_2_7_3\lib

开源使用以下方法,
使用codeql编译生成数据库,
首先新建目录hsqldb_2_7_3_analyze_client\src\main\java,
然后将org.hsqldb...放入其中,
mvn clean package,成功运行jar包后,就可以生成数据库了,

开始生成数据库,

codeql database create D:\nettools\CodeQL_tools\works\hsqldb_2_7_3\hsqldb_database  -l=java --command="mvn clean install --file pom.xml" --source-root=D:\nettools\java_shiyan\dabao_mvm
--command="mvn clean compile --file pom.xml -Dmaven.test.skip=true"

安装java扩展,

然后就可以运行相应的ql文件进行查询了,

查看历史记录,

规则编写

查找函数调用,只能在相关函数中查找,

import java
import semmle.code.java.frameworks.spring.SpringController
import semmle.code.java.dataflow.TaintTracking
from Call call,Callable callable,Method method
where

    //查找调用getObject的地方
    call.getCallee() = callable and 
    //给getObject函数设置类属性,方便准确查找,
    callable.getDeclaringType().hasQualifiedName("org.hsqldb.types", "OtherType") and
    callable.hasName("convertSQLToJava")
    //设置source,设置sink为调用
   //TaintTracking::localTaint(DataFlow::parameterNode(method.hasName("compileCallStatement")),DataFlow::exprNode()) 
select call,callable

函数调用链查询,
开头的注释会将调用链展示出来,

/**
@kind path-problem
*/

import java

class StartMethod extends Method {
  //指定方法,因此是以方法的定义开始,
  StartMethod() {
    this.getName() = "compilePart"

  }
}

class TargetMethod extends Method {
  TargetMethod() {
    this.getName() = "getObject" and
    this.getDeclaringType().hasQualifiedName("org.hsqldb.types", "JavaObjectData")
  }

}

//从这里开始,就是查询谁调用了getObject
class TargetMethod_callable extends Callable {
  TargetMethod_callable() {

    exists(Callable a| this.polyCalls(a) and
    a instanceof TargetMethod

    )
  }
}

//b调用了a,polyCalls函数为找到接口实现类中的方法,
query predicate edges(Method a, Method b) { a.polyCalls(b) }

from StartMethod start, TargetMethod_callable end
where edges+(start, end)
select start, start, end, "$@ $@ to $@ $@" ,
start.getDeclaringType(),start.getDeclaringType().getName(),
start,start.getName(),
end.getDeclaringType(),end.getDeclaringType().getName(),
end,end.getName()

扫描结果,
最终分析了一波,第二条链子最有可能成功,
其他三条链都是通过e.dataType.convertSQLToJava来调用的,

只有第二条链不是调用的dataType的convertSQLToJava,不过我没有调出来,交给大佬们了,

还有tabby静态代码分析工具,后面再来学习了。

参考:
环境搭建:https://moonsec.top/articles/128
规则学习:
https://github.com/safe6Sec/CodeqlNote?tab=readme-ov-file
https://tttang.com/archive/1415/
https://tttang.com/archive/1511/

0 条评论
某人
表情
可输入 255
目录