Clojure 反序列化
依赖
<dependency>
<groupId>org.clojure</groupId>
<artifactId>clojure</artifactId>
<version>1.8.0</version>
</dependency>
Gadget
/*
* Gadget:
* HashMap#readObject
* AbstractTableModel$ff19274a#hashCode
* core$comp$fn__4727#invoke
* core$constantly$fn__4614#invoke
* main$eval_opt#invoke
* */
main$eval_opt#invoke
方法可以执行命令,传递需要执行的命令字符串即可,命令字符串可以这样构造 (use '[clojure.java.shell :only [sh]]) (sh "calc")
HashMap.readObject
调用任意一个类的 hashCode
方法,这里调用 AbstractTableModel$ff19274a#hashCode
方法,根据 RT#get
方法的逻辑,可以控制 var10000
的值,只需要让 __clojureFnMap
属性为 PersistentArrayMap
对象,并且加入一个 hashCode
键的元素进去即可
然后调用 invoke
方法,这里调用的是 core$comp$fn__4727#invoke
方法,通过构造可以让 var10001.invoke(var10002)
返回命令字符串
然后 var10000.invoke
调用的是 main$eval_opt#invoke
方法,此方法可以调用命令字符串执行命令