0%

过滤器初始化

Struts2 的访问从配置的org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter过滤器开始。
过滤器在程序加载过程中首先被执行的是init方法

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
public void init(FilterConfig filterConfig) throws ServletException {
// 创建 InitOperations 对象 负责各个关键组件的初始化操作
InitOperations init = createInitOperations();
Dispatcher dispatcher = null;
try {
// 简单的包装了一下 filterConfig
FilterHostConfig config = new FilterHostConfig(filterConfig);
// 初始化日志记录器 不是重点
init.initLogging(config);
// 初始化dispatcher 重点
dispatcher = init.initDispatcher(config);
// 初始化静态类容加载器
init.initStaticContentLoader(config, dispatcher);

prepare = createPrepareOperations(dispatcher);
execute = createExecuteOperations(dispatcher);
// 设置将哪些path排除到strutsd的filter之外 这些请求将不会被struts处理 而交给之后的filter或者servlet处理
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
// 用户可以继承该过滤器 重写该方法 做一些额外的初始化操作
postInit(dispatcher, filterConfig);
} finally {
if (dispatcher != null) {
dispatcher.cleanUpAfterInit();
}
init.cleanup();
}
}
阅读全文 »

漏洞成因

crushftp.server.ServerSessionHTTP.handle_http_requests方法中对用户名有特殊处理。
当用户名中不包含~的时候 lookup_user_pass的值为true

1
2
3
4
5
6
boolean lookup_user_pass = true;
if (s3_username.indexOf("~") >= 0) {
user_pass = s3_username.substring(s3_username.indexOf("~") + 1);
user_name = s3_username.substring(0, s3_username.indexOf("~"));
lookup_user_pass = false;
}

后面在调用 login_user_pass 方法的时候传入的第一个参数就是lookup_user_pass

1
this.thisSession.login_user_pass(lookup_user_pass, false, user_name, user_pass))
阅读全文 »

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语法结构对应关系,然后以两个漏洞的分析结尾。

阅读全文 »