0%

Java Gadgets 搜索工具是如何工作的(Gadget Inspector)

Gadget Inspector 由 Ian Haken 于 2018 年 8 月在 DEF CON 上发布,其发布开创了Gadget 自动化挖掘的先河。Gadget Inspector 依靠Java ASM
技术,通过静态模拟 Java 程序运行过程中操作数栈以及局部变量表的动态变化来进行数据流跟踪从而实现污点分析进而进行Gadgets探测。

检测原理

Gadget Inspector 的核心逻辑包含5个步骤,分别是类信息分析、数据传播分析、调用图构造、入口探测以及Gadgets串联。
在第一步中 Gadget Inspector 利用 MethodDiscovery 类对 当前环境中所有类的方法、成员、继承结构进行解析并集中存储在特定的数据结构中以便后续进行
数据传播分析以及调用图构造。
在第二步中 Gadget Inspector 利用 PassthroughDiscovery 类运用 深度优先算法、逆拓扑排序等方式进行数据流分析从而确认方法入参与返回值的关系,
即入参是否能够污染到返回值,其根本目的在于确认关键参数是否可以被攻击者控制。
在第三步中 Gadget Inspector 通过 Java ASM 技术构造方法调用图,其目的在于确认主调方法与被调用方法参数之间的关系。
第四步中 Gadget Inspector 通过 SourceDiscovery 针对不同的夫序列化类型进行分发,通过对比第一步中形成的methodMap中存储的方法信息与预定义
的反序列化 Gadget Source点进行比较,从而确定当前项目中可被使用的反序列化入口方法。
在第五步中 Gadget Inspector 开始从Source点开始遍历调用图,直到找到一个方法与预定义的sink点相匹配则说明Gadget Inspector 找到了一条可以
使用的反序列化调用链。

阅读全文 »

Scala代码审计从入门到入坟

引言

Scala 是一门多范式的编程语言,集成了面向对象编程和函数式编程的多种特性。函数式编程抽象的理论基础也让这门语言变得抽象起来,初学者需要花更多的时间去理解其特有概念以及众多的语法糖。Scala是一门运行在JVM平台上的语言,其源码编译结果符合Java字节码规范,所以可以被反编译为Java代码。在进行Scala代码审计的过程中,审计者很少有机会直面其源码,大多数时候都是被反编译为Java的代码所支配。ScalaJava毕竟是两门语言,反编译成Java代码的后果便是丧失了动态调试的能力(这为审计者带来了不小的麻烦),反编译后产生的中间代码、临时变量等辅助结构更是极大得降低了代码的可读性。本文将带领诸位抽丝剥茧逐步梳理出Scala各语法结构与Java语法结构对应关系,然后以两个漏洞的分析结尾。

阅读全文 »

Spring Kafka消息头反序列化漏洞(CVE-2023-34040)

产品介绍

Spring for Apache Kafka (Spring - Kafka)项目将Spring的核心概念应用于基于Kafka的消息传递解决方案的开发。它提供了一个“template”作为发送消息的高级抽象。它还支持带有@KafkaListener注解和“listener container”的消息驱动POJOs 。这些库提倡使用依赖注入和声明式的使用方式。所有这些例子都与Spring框架的JMS支持和Spring AMQP对RabbitMQ的支持有相似之处。

漏洞概述

当Kafka应用服务器允许一个不受信任的源的生产消息的时候,若其能够控制消息的headers,则可能导致一个反序列化漏洞的发生。

阅读全文 »

线程池复用TreadLocal

静态变量未同步

缓存处理不当

tomcat rce

异步操作处理不当

nacos rce

找到安装的hexo-next-title hexo-next-share hexo-next-exif hexo-next-utteranc等插件的安装目录 在其目录下找到node_modules目录
观察是否存在 next-util 目录,若存在打开该目录中的index.js进行修改
注释调添加的before_generate过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
'use strict';

const yaml = require('js-yaml');
const fs = require('fs');
const path = require('path');
const { merge } = require('lodash');

module.exports = function(hexo, pluginDir) {
hexo.extend.filter.register('before_generate', function err() {
//hexo.log.warn(`The upstream repository of theme NexT has been changed.`);
//hexo.log.warn(`For more information: https://github.com/next-theme/hexo-theme-next`);
//hexo.log.warn(`Documentation: https://theme-next.js.org`);
});
this.hexo = hexo;
this.pluginDir = pluginDir;
this.getFilePath = function(file) {
return this.pluginDir ? path.resolve(this.pluginDir, file) : file;
};
this.getFileContent = function(file) {
return fs.readFileSync(this.getFilePath(file), 'utf8');
};
this.defaultConfigFile = function(key, file) {
const defaultConfig = file ? yaml.safeLoad(this.getFileContent(file)) : {};
this.hexo.config[key] = merge(defaultConfig[key], this.hexo.theme.config[key], this.hexo.config[key]);
return this.hexo.config[key];
};
};