codeql

article/2025/9/26 5:18:06

title: codeql
categories:

  • java
  • codeql
    date: YYYY-MM-DD HH:mm:ss
    tags:
  • java
  • codeql
  • 代码审计

codeql

下一个靶场来测试

https://github.com/l4yn3/micro_service_seclab/

引擎安装(codeql)

https://github.com/github/codeql-cli-binaries/releases

SDK安装(ql)

https://github.com/github/codeql

image-20220807130536849

image-20220807120258776

image-20220807125424790

codeql database create D:\Data\secquan\Audit\CodeQl\databases\micro_service_seclab_database --language="java" --command="mvn clean install --file pom.xml" --source-root=D:\Download\micro_service_seclab-main --overwrite
D:\Data\secquan\Audit\CodeQl\databases\micro_service_seclab_database 这个是要生成数据库的路径
D:\Download\micro_service_seclab-main 这个是要生成的项目路径

如果直接执行百分之八十会报错,原因是maven没有编译成功,因此我们先去idea成功编译再去创建数据库

image-20220807130149099

第一个错误 jdk版本不对

image-20220807125942546

image-20220807130006540

第二个错误,测试时出现问题

image-20220807130054320

添加这个插件

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><testFailureIgnore>true</testFailureIgnore></configuration></plugin>

image-20220807130131201

成功构建

image-20220807130217626

我们接着构建数据库

codeql database create D:\Data\secquan\Audit\CodeQl\databases\micro_service_seclab_database --language="java" --command="mvn clean install --file pom.xml" --source-root=D:\Download\micro_service_seclab-main --overwrite

成功Successfully

image-20220807130447738

生成好的数据库

image-20220807130619920

打开ql文件夹

image-20220807131120309

导入数据库

image-20220807130738969

image-20220807130903043

注意目录创建demo.ql文件

image-20220807132827083

运行

image-20220807132914307

没运行成功就重写导入一下数据库吧

image-20220807132931426

image-20220807133800569

查找所有方法

import java
from Method method
select method

image-20220807153840266

查看ast

image-20220807153901224

import java
from Method method
// 获取所有方法
where method.hasName("getStudent")
// 获取名称为getStudent的方法
select method.getName() , method.getDeclaringType()
// method.getName() 获取当前方法名称 method.getDeclaringType()获取当前方法的类名

image-20220807155052842

谓词

import javapredicate isStudent(Method method) {// predicate表示当前方法没有返回值exists( | method.hasName("getStudent") )// 子查询 根据内部的子查询返回ture or false,来决定筛选出哪些数据
}
from Method method
where isStudent(method)
select method.getName(),method.getDeclaringType()

image-20220807161923425

起始点

import javaoverride predicate isSource(DataFlow::Node src) {src instanceof RemoteFlowSource
}
// 固定语法 规定起始位置为远程用户输入参数

终点

import javaoverride predicate isSource(DataFlow::Node src) {src instanceof RemoteFlowSource
}
// 固定语法 规定起始位置为远程用户输入参数override predicate isSink(DataFlow::Node sink){exists(Method method,MethodAccess call | // 前一个方法 后一个调用的方法method.hasName("query")// 如果method的名字是queryand call.getMethod() = method// 调用的方法与method一直andsink.asExpr() = call.getArgument(0)// sink作为调用方法的第一个参数)
}

在代码中的寻找点就是

jdbcTemplate.query(sql, ROW_MAPPER);

确定是否连通

import javafrom VulConfig config ,DataFlow::PathNode source,DataFlow::PathNode sink
where config.hasFlowPath(source,sink)
// 这里这个方法来判断是否连通
select source.getNode(),source,sink,"source"

CodeQL语法和java类似,extends代表继承父类TaintTracking::Configuration 这个类是官方提供用来做数据流分析的通用类,提供了很多数据流分析相关的方法,比如isSource(定义source),isSink(定义sink) src instanceof RemoteFlowSource表示src必须是RemoteFlowSource类型.在RemoteFlowSource里,官方提供了非常全的source定义,我们本次用的Springboot的Source就已经覆盖了.

import java
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.security.QueryInjection
import DataFlow::PathGraphclass VulConfig extends TaintTracking::Configuration{VulConfig() {this = "SqlIjectionConfig"}override predicate isSource(DataFlow::Node src) {src instanceof RemoteFlowSource}override predicate  isSink(DataFlow::Node sink) {exists(Method method , MethodAccess call | method.hasName("query")and call.getMethod() = method and sink.asExpr() = call.getArgument(0))}
}from VulConfig config,DataFlow::PathNode soucre,DataFlow::PathNode sink
where config.hasFlowPath(soucre, sink)
select soucre.getNode(),soucre,sink,"source"

image-20220807203656628

这里已经检测到sql注入了,但是还存在误报 这里是一个long的参数,所以并不存在注入

image-20220807204252088

override predicate isSanitizer(DataFlow::Node node) {node.getType() instanceof PrimitiveType ornode.getType() instanceof BoxedType or node.getType() instanceof NumberType}

如果当前节点是上面提到的基础类型,那么污染链将被截断

import java
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.security.QueryInjection
import DataFlow::PathGraphclass VulConfig extends TaintTracking::Configuration{VulConfig() {this = "SqlIjectionConfig"}override predicate isSource(DataFlow::Node src) {src instanceof RemoteFlowSource}override predicate  isSink(DataFlow::Node sink) {exists(Method method , MethodAccess call | method.hasName("query")and call.getMethod() = method and sink.asExpr() = call.getArgument(0))}override predicate isSanitizer(DataFlow::Node node) {node.getType() instanceof PrimitiveType ornode.getType() instanceof BoxedType or node.getType() instanceof NumberTypeorexists( ParameterizedType pt | node.getType() = pt and pt.getTypeArgument(0) instanceof NumberType)}// 如果当前的节点的类型为基础类型,数字类型和泛型数字类型(比如list),就切断数据流,认为数据流断掉
}from VulConfig config,DataFlow::PathNode soucre,DataFlow::PathNode sink
where config.hasFlowPath(soucre, sink)
select soucre.getNode(),soucre,sink,"source"

image-20220807210514378

连接

isAdditionalTaintStep方法是CodeQl的类TaintTracking::Configuration提供的方法,它的原型是

override predicate isAdditionalTaintStep(DataFlow::Node node1,DataFlow::Node node2){}

他的作用是将一个可控节点A强制传递给另外一个节点B,那么节点B也就成了可控节点

这里漏了一个sql注入 原因可能是Optional这种类型的使用没有在codeql的语法库里

image-20220807212324363


http://chatgpt.dhexx.cn/article/9ef147kV.shtml

相关文章

VScode连接SQL Server数据库执行语句

VScode的下载地址&#xff1a;VScode官网 推荐插件&#xff1a;VScode实现HTML的编写、运行和调试&推荐插件 sql文件中文乱码&#xff1a;解决VScode打开文件后中文显示为乱码 安装SQL Server (mssql)拓展 连接到SQL Server 按Ctrl Shift P或F1以打开命令面板输入sql…

【DB2报错】创建存储过程报SQLSTATE:-104 SQLCODE:42601

今天创建存储过程的时候碰到这个报错&#xff1a; AN unexpected tkoen "END-OF-STATEMENT" was found following "COMMIT",Expected tokens may include:"END IF"..SQLSTATE:-104 SQLCODE:42601 翻译&#xff1a;在“COMMIT”之后发现了一个异…

TinyXML2下载与编译

最近有使用到用XML格式来封装UDP报文&#xff0c;所以研究下TinyXML。 TinyXML下载地址&#xff1a; https://github.com/leethomason/tinyxml2 进入到tinyxml2文件目录下&#xff0c;找到.sln文件&#xff08;解决方案文件&#xff09; 直接用VS2010以上版本打开&#xff0…

C++ 使用 tinyxml2 解析创建 xml

目录 1. github 地址 2. 使用 3. 解析xml demo 4. 注意点 5. 解析效果展示 6.创建xml 7.创建xml效果展示 8. 完整的示例&#xff0c;添加Vector 9. 参考 1. github 地址 GitHub - leethomason/tinyxml2: TinyXML2 is a simple, small, efficient, C XML parser that …

TinyXML2 学习

换cocos2d-x版本到2.1.3之后&#xff0c;自己的文件读写也用了引擎CCUserDefault使用的TinyXML2&#xff0c;在这汇总了一下TinyXML2的使用&#xff0c;希望大家看这一篇文章就可以解决自己的问题&#xff0c;省得到处查阅…… 注意&#xff0c;文章一次解释了写操作->读操…

Tiny-XML

Tiny-XML 2023-01-15:基于C语言实现的小型XML解析器 解析代码实现仅600余行大部分数据结构使用链表实现&#xff0c;malloc、free、realloc、strdup函数已在文件开头使用宏定义设置&#xff0c;方便移植于别的平台项目注释内容丰富&#xff0c;数据结构和常用函数方法已于文件…

xml开发笔记(一):tinyXml2库介绍、编译和工程模板

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/111828450 长期持续带来更多项目与技术分享&#xff0c;咨询请加QQ:21497936、微信&#xff1a;yangsir198808 红胖子(红模仿)的博文大全&#x…

tinyxml2的安装使用及示例总结

TinyXml2 库使用方法 安装 下载地址 https://github.com/leethomason/tinyxml2 使用 git 下载 &#xff08;1&#xff09;下载 tinyxml2 git clone https://github.com/leethomason/tinyxml2.git &#xff08;2&#xff09;进入相应目录并编译 cd tinyxml2/ cmake . make &…

C++使用TinyXml2解析Xml

1. TinyXml2 简介 TinyXml 一直是一个非常好用的 Xml 解析工具 , 最新的开源版本 TinyXml2 相对于旧版本的 TinyXml 使用更少的内存 , 更快 , 并且使用更少的内存分配 , 现在是所有开发的重点 , 经过良好的测试 , 是您的最佳选择 , 除非您有维护TinyXML-1代码的要求 ; TinyX…

使用tinyxml2库解析xml

tinyxml2简介 tinyxml2是c编写的轻量级的xml解析器&#xff0c;而且是开放源代码的&#xff0c;在一些开源的游戏引擎中用的比较多。源码托管在github上。 源码地址&#xff1a;https://github.com/leethomason/tinyxml2 tinyxml2使用起来非常简单&#xff0c;下载源码后无需…

TinyXml学习笔记

TinyXml学习笔记 张弛<> 注:本文的最新版本可以在下面的地址找到 http://amidiot.512j.com/article/tinyxml/tinyxml_note.htm 一、 TinyXml的特点 TinyXml是一个基于DOM模型的、非验证的轻量级C解释器。 1. SAX和DOM 目前XML的解析主要有两大模型&#…

TinyXml使用详解

本文用一个详细的例子说明了TinyXml的使用方法。如写、查找、插入、替换、加载、遍历等常见操作。 首先简单介绍一下TinyXml,要看详细的在网上搜搜了^_^: 1、TinyXml源代码只有4个cpp文件和2个头文件。 2、首先要理解TinyXml中的各个基本类型之间的关系,看看这个继承图大家…

TinyXML2使用教程

TinyXML2使用教程 原文转自 http://blog.csdn.net/K346K346/article/details/48750417 1.TinyXML2概述 TinyXML2是simple、small、efficient开源的C XML文件解析库&#xff0c;可以很方便的应用到现有的项目之中。非常适合存储简单数据&#xff0c;配置文件&#xff0c;对象…

TinyXML使用方法

TinyXML 使用说明 TinyXML是一个C的XML解析库&#xff0c;网上的评价都不错&#xff0c;是一个轻量级的XML解析库。关于TinyXML使用的文章有很多&#xff0c;而且官方也有完整的文档&#xff0c;这里只是简单把自己使用记录写下来&#xff0c;方便以后查阅。 一个XML文档例子&…

C++ 本地使用tinyxml2解析Xml文件

1、基本介绍 TinyXML2是一个开源、简单、小巧、高效的C XML解析器&#xff0c;它只有一个.h文件和一个.cpp文件组成&#xff0c;可以轻松集成到其它程序中。非常方便我们使用c对xml进行处理。 可以读取、修改和保存的文档对象模型(Document Object Model, DOM)。它不能解析DTD…

快速上手 TinyXML-2 不完全教程

TinyXML-2 不完全教程 XML 作为程序开发中非常常用的数据文档之一&#xff0c;各个语言或是开发环境都有对应的用于处理 XML 文件的库。在 C 语言中&#xff0c;TinyXML-2 就是这样的一个库。 TinyXML-2 是一个简单&#xff0c;小巧&#xff0c;高性能的 C 的 XML 解析器&…

开源库TinyXML2简介及使用

TinyXML2是一个开源、简单、小巧、高效的C XML解析器&#xff0c;它只有一个.h文件和一个.cpp文件组成&#xff0c;可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(Document Object Model, DOM)。它不能解析DTD(Document Type Definiti…

c/c++操作xml库-Tinyxml2入门及高级用法

一、概念 TinyXML2是一个开源、简单、小巧、高效的C XML解析器&#xff0c;它只有一个.h文件和一个.cpp文件组成&#xff0c;可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(Document Object Model, DOM)。它不能解析DTD(Document Typ…

关于Anaconda卸载干净的问题【已解决】

在卸载anaconda时&#xff0c;为了卸载干净&#xff0c;一般会在win10自带的 应用与功能中选择anaconda 进行卸载。 &#xff0c;也可以用anaconda文件中卸载程序Uninstall-Anaconda3.exe进行卸载。 然后再把相应路径下的剩余文件删掉。 但是&#xff01; 这还不够&#xff0c…

anaconda卸载后重装问题

记录一下anaconda卸载后&#xff0c;重新安装后缺少很多文件&#xff0c;重装后打开Anaconda Navigator&#xff0c;发现内容一片空白&#xff0c;软件也不见了&#xff0c;库也不见了&#xff0c;开始菜单也没有anaconda和anaconda prompt&#xff0c;只有如下很少的文件。网上…