Java
  • About This Book
  • 🍖Prerequisites
    • 反射
      • 反射基本使用
      • 高版本JDK反射绕过
      • 反射调用命令执行
      • 反射构造HashMap
      • 方法句柄
    • 类加载
      • 动态加载字节码
      • 双亲委派模型
      • BCEL
      • SPI
    • RMI & JNDI
      • RPC Intro
      • RMI
      • JEP 290
      • JNDI
    • Misc
      • Unsafe
      • 代理模式
      • JMX
      • JDWP
      • JPDA
      • JVMTI
      • JNA
      • Java Security Manager
  • 👻Serial Journey
    • URLDNS
    • SerialVersionUID
    • Commons Collection 🥏
      • CC1-TransformedMap
      • CC1-LazyMap
      • CC6
      • CC3
      • CC2
    • FastJson 🪁
      • FastJson-Basic Usage
      • FastJson-TemplatesImpl
      • FastJson-JdbcRowSetImpl
      • FastJson-BasicDataSource
      • FastJson-ByPass
      • FastJson与原生反序列化(一)
      • FastJson与原生反序列化(二)
      • Jackson的原生反序列化利用
    • Other Components
      • SnakeYaml
      • C3P0
      • AspectJWeaver
      • Rome
      • Spring
      • Hessian
      • Hessian_Only_JDK
      • Kryo
      • Dubbo
  • 🌵RASP
    • JavaAgent
    • JVM
    • ByteCode
    • JNI
    • ASM 🪡
      • ASM Intro
      • Class Generation
      • Class Transformation
    • Rasp防御命令执行
    • OpenRASP
  • 🐎Memory Shell
    • Tomcat-Architecture
    • Servlet API
      • Listener
      • Filter
      • Servlet
    • Tomcat-Middlewares
      • Tomcat-Valve
      • Tomcat-Executor
      • Tomcat-Upgrade
    • Agent MemShell
    • WebSocket
    • 内存马查杀
    • IDEA本地调试Tomcat
  • ✂️JDBC Attack
    • MySQL JDBC Attack
    • H2 JDBC Attack
  • 🎨Templates
    • FreeMarker
    • Thymeleaf
    • Enjoy
  • 🎏MessageQueue
    • ActiveMQ CNVD-2023-69477
    • AMQP CVE-2023-34050
    • Spring-Kafka CVE-2023-34040
    • RocketMQ CVE-2023-33246
  • 🛡️Shiro
    • Shiro Intro
    • Request URI ByPass
    • Context Path ByPass
    • Remember Me反序列化 CC-Shiro
    • CB1与无CC依赖的反序列化链
  • 🍺Others
    • Deserialization Twice
    • A New Blazer 4 getter RCE
    • Apache Commons Jxpath
    • El Attack
    • Spel Attack
    • C3P0原生反序列化的JNDI打法
    • Log4j
    • Echo Tech
      • SpringBoot Under Tomcat
    • CTF 🚩
      • 长城杯-b4bycoffee (ROME反序列化)
      • MTCTF2022(CB+Shiro绕过)
      • CISCN 2023 西南赛区半决赛 (Hessian原生JDK+Kryo反序列化)
      • CISCN 2023 初赛 (高版本Commons Collections下其他依赖的利用)
      • CISCN 2021 总决赛 ezj4va (AspectJWeaver写字节码文件到classpath)
      • D^3CTF2023 (新的getter+高版本JNDI不出网+Hessian异常toString)
      • WMCTF2023(CC链花式玩法+盲读文件)
      • 第六届安洵杯网络安全挑战赛(CB PriorityQueue替代+Postgresql JDBC Attack+FreeMarker)
  • 🔍Code Inspector
    • CodeQL 🧶
      • Tutorial
        • Intro
        • Module
        • Predicate
        • Query
        • Type
      • CodeQL 4 Java
        • Basics
        • DFA
        • Example
    • SootUp ✨
      • Intro
      • Jimple
      • DFA
      • CG
    • Tabby 🔦
      • install
    • Theory
      • Static Analysis
        • Intro
        • IR & CFG
        • DFA
        • DFA-Foundation
        • Interprocedural Analysis
        • Pointer Analysis
        • Pointer Analysis Foundation
        • PTA-Context Sensitivity
        • Taint Anlysis
        • Datalog
Powered by GitBook
On this page
  • Program Elements
  • Types
  • Generics
  • Variables
  • AST
  • Metadata
  • Call graph

Was this helpful?

  1. 🔍Code Inspector
  2. CodeQL 🧶
  3. CodeQL 4 Java

Basics

Program Elements

Types

下面是Type的几个子类

  • PrimitiveType: 表示Java中的原始类

    • boolean、byte、char、double、float、int、long、short

    • QL中把void和null也作为原始类

  • RefType: 表示引用类型(reference | non-primitive), 有如下子类

    • Class

    • Interface

    • EnumType

    • Array

  • TopLevelType: 表示声明在一个编译单元最上层的引用类型(不太懂。。。)

  • NestedType: 声明在另一个类型中的类型

    • LocalClass: 声明在一个方法或构造函数中的类

    • AnonymousClass: 匿名类

此外还有一些常用的类,顾名思义

TypeObject、TypeCloneable、TypeRuntime、TypeSerializable、TypeString、TypeSystem、TypeClass

examples:

  • 查找所有double变量

import java

from Variable v, PrimitiveType pt
where pt = v.getType() and pt.hasName("double")
select v
  • 查找所有直接继承自Object的内部类

import java

from InnerClass ic
where ic.getASupertype() instanceof TypeObject
select ic

Generics

GenericType表示泛型,分为 GenericInterface 或 GenericClass

比如java.util.Map这个接口

package java.util.;

public interface Map<K, V> {
    int size();
    // ...
}

参数K、V用TypeVariable表示

泛型的参数化实例(如Map<String, File>)提供了一个具体类型(这里的String、File)来实例化类型参数,比

这里的参数化实例用ParameterizedType表示

通过getSourceDeclaration获取ParameterizedType对应的GenericType

通常,泛型可能会限制类型参数可以绑定到哪些类型,比如下面限制了一个从String到Number的map

class StringToNumMap<N extends Number> implements Map<String, N> {
    // ...
}

StringToNumberMap的参数化实例只能是Number或其子类

使用getATypeBound和getType来得到TypeVariable类型绑定

RawType用于处理泛型的原生类型,如下m1

Map m1 = new HashMap();
Map<String, String> m2 = new HashMap<String, String>();

examples:

  • 查找java.util.Map的所有参数化实例

import java

from GenericInterface map, ParameterizedType pt
where
    map.hasQualifiedName("java.util", "Map") and
    pt.getSourceDeclaration() = map
select pt
  • 查找java.util.Map的原生类型

import java

from Variable v, RawType rt
where rt = v.getType() and
    rt.getSourceDeclaration().hasQualifiedName("java.util", "Map")
select v
  • 查找绑定到java.lang.Object的所有泛型的类型变量

import java

from TypeVariable tv, TypeBound tb
where tb = tv.getATypeBound() and
    tb.getType().hasQualifiedName("java.lang", "Object")
select tv

Variables

Variable表示Java中的变量

  • Field

  • LocalVariableDecl

  • Parameter

AST

抽象语法树中的节点

  • statement(Stmt)

  • expression(Expr)

  • Expr.getAChildExpr 返回子表达式

  • Stmt.getAChild 返回语句的下一条语句

  • Expr.getParent、Stmt.getParent 返回父节点

import java

from Expr e
where e.getParent() instanceof ReturnStmt
select e

返回跟在return语句后面的表达式

比如 return x+y 返回 x+y

import java

from Stmt s
where s.getParent() instanceof IfStmt
select s

返回所有if语句的then分支和else分支

import java

from Stmt s
where s.getParent() instanceof Method
select s

返回所有方法体

可见Expr和Stmt的父节点不一定是Expr或Stmt,可以使用ExprParent 或 StmtParent表示Expr和Stmt可能的父节点

Metadata

元数据包括注解(annotation)和文档(javadoc)

对于packages, reference types, fields, methods, constructors, local variable declarations

这些都可以被注解,Annotatable是其父类,getAnAnnotation获取注解

寻找所有Callable(包括Method和Constructor)的注解

import java

from Callable c
select c.getAnAnnotation()

寻找所有构造器中注解的@Deprecated

import java

from Constructor c, Annotation ann, AnnotationType anntp
where ann = c.getAnAnnotation() and
    anntp = ann.getType() and
    anntp.hasQualifiedName("java.lang", "Deprecated")
select ann

寻找私有字段的文档

import java

from Field f, Javadoc jdoc
where f.isPrivate() and
    jdoc = f.getDoc().getJavadoc()
select jdoc

Call graph

CodeQL根据Java代码生成的数据库包含了预计算的程序调用图

Callable包括方法和构造器,Call表示调用表达式(包括方法调用、new对象、用this或super的构造器调用)

下面找出println的调用点

import java

from Call c, Method m
where m = c.getCallee() and
    m.hasName("println")
select c

Callable.getAReference返回Call调用表达式的引用点

下面找出没被调用过的方法

import java

from Callable c
where not exists(c.getAReference())
select c
PreviousCodeQL 4 JavaNextDFA

Last updated 11 months ago

Was this helpful?