diff --git a/README.md b/README.md
index 7a9d1503..6c3b46bb 100644
--- a/README.md
+++ b/README.md
@@ -34,12 +34,20 @@ for the development of effective defensive techniques, and is not intended to be
used to attack systems except where explicitly authorized. Project maintainers
are not responsible or liable for misuse of the software. Use responsibly.
+## Dependencies issues
+
+As stated in [BishopFox's fork](https://github.com/BishopFox/ysoserial-bf?tab=readme-ov-file#missing-javaxinterceptor-api-library),
+javax.interceptor-api library version 3.1 was a bump version typo and was removed from central repositories.
+As a result, artifacts cannot be downloaded anymore.
+
+You can find this library and a workaround to fix this issue [here](https://github.com/BishopFox/ysoserial-bf?tab=readme-ov-file#missing-javaxinterceptor-api-library).
+
## Usage
```shell
$ java -jar ysoserial.jar
Y SO SERIAL?
-Usage: java -jar ysoserial.jar [payload] '[command]'
+Usage: java -jar ysoserial-[version]-all.jar [payload] [arguments ...]
Available payload types:
Payload Authors Dependencies
------- ------- ------------
@@ -79,6 +87,16 @@ Usage: java -jar ysoserial.jar [payload] '[command]'
Wicket1 @jacob-baines wicket-util:6.23.0, slf4j-api:1.6.4
```
+A few arguments were added to customize gadget chains relying on Translets or CommonsCollections Transformers:
+
+```shell
+$ java -jar ysoserial.jar CommonsCollections1 --inline 'System.out.println("Hello world");'
+[...]
+
+$ java -jar ysoserial.jar CommonsBeanutils1 --jar-file /path/to/app.jar --jar-main org.random.Main -- arg0 arg1 arg2
+[...]
+```
+
## Examples
```shell
diff --git a/pom.xml b/pom.xml
index 69bb2a5f..7833b849 100644
--- a/pom.xml
+++ b/pom.xml
@@ -177,6 +177,11 @@
remoting-jmx
2.0.1.Final
+
+ commons-cli
+ commons-cli
+ 1.6.0
+
@@ -444,5 +449,5 @@
GitHub Packages
https://maven.pkg.github.com/frohoff/ysoserial
-
+
diff --git a/src/main/java/ysoserial/GeneratePayload.java b/src/main/java/ysoserial/GeneratePayload.java
index 88776f34..ca9f7403 100644
--- a/src/main/java/ysoserial/GeneratePayload.java
+++ b/src/main/java/ysoserial/GeneratePayload.java
@@ -3,8 +3,10 @@
import java.io.PrintStream;
import java.util.*;
+import org.apache.commons.cli.ParseException;
import ysoserial.payloads.ObjectPayload;
import ysoserial.payloads.ObjectPayload.Utils;
+import ysoserial.payloads.ParameterizedObjectPayload;
import ysoserial.payloads.annotation.Authors;
import ysoserial.payloads.annotation.Dependencies;
@@ -14,12 +16,12 @@ public class GeneratePayload {
private static final int USAGE_CODE = 64;
public static void main(final String[] args) {
- if (args.length != 2) {
+ if (args.length == 0) {
printUsage();
System.exit(USAGE_CODE);
}
final String payloadType = args[0];
- final String command = args[1];
+ final String[] payloadArgs = Arrays.copyOfRange(args, 1, args.length);
final Class extends ObjectPayload> payloadClass = Utils.getPayloadClass(payloadType);
if (payloadClass == null) {
@@ -31,7 +33,42 @@ public static void main(final String[] args) {
try {
final ObjectPayload payload = payloadClass.newInstance();
- final Object object = payload.getObject(command);
+ if(payloadArgs.length == 0) {
+ if (payload instanceof ParameterizedObjectPayload) {
+ System.err.println(((ParameterizedObjectPayload) payload).getHelp());
+ } else {
+ System.err.println("Usage: java -jar ysoserial-[version]-all.jar "+ payloadType +" '[command]'");
+ }
+ System.exit(USAGE_CODE);
+ return;
+ }
+ final Object object;
+ if (payload instanceof ParameterizedObjectPayload) {
+ ParameterizedObjectPayload parameterizedPayload = (ParameterizedObjectPayload)payload;
+ try {
+ object = parameterizedPayload.getObject(payloadArgs);
+ } catch (ParseException e) {
+ System.err.println("Error: " + e.getMessage());
+ System.err.println(parameterizedPayload.getHelp());
+ System.exit(USAGE_CODE);
+ return;
+ } catch (IllegalArgumentException e) {
+ if (e.getMessage() != null) {
+ System.err.println("Error: " + e.getMessage());
+ }
+ System.err.println(parameterizedPayload.getHelp());
+ System.exit(USAGE_CODE);
+ return;
+ }
+ } else {
+ if (payloadArgs.length > 1) {
+ System.err.println("Error: the payload '" + payloadType + "' does not support multiple arguments");
+ printUsage();
+ System.exit(USAGE_CODE);
+ return;
+ }
+ object = payload.getObject(payloadArgs[0]);
+ }
PrintStream out = System.out;
Serializer.serialize(object, out);
ObjectPayload.Utils.releasePayload(payload, object);
@@ -45,7 +82,7 @@ public static void main(final String[] args) {
private static void printUsage() {
System.err.println("Y SO SERIAL?");
- System.err.println("Usage: java -jar ysoserial-[version]-all.jar [payload] '[command]'");
+ System.err.println("Usage: java -jar ysoserial-[version]-all.jar [payload] [arguments ...]");
System.err.println(" Available payload types:");
final List> payloadClasses =
diff --git a/src/main/java/ysoserial/Strings.java b/src/main/java/ysoserial/Strings.java
index 84c21971..1289d5e6 100644
--- a/src/main/java/ysoserial/Strings.java
+++ b/src/main/java/ysoserial/Strings.java
@@ -21,6 +21,10 @@ public static String join(Iterable strings, String sep, String prefix, S
return sb.toString();
}
+ public static String join(Iterable strings, String sep) {
+ return Strings.join(strings, sep, null, null);
+ }
+
public static String repeat(String str, int num) {
final String[] strs = new String[num];
Arrays.fill(strs, str);
@@ -49,6 +53,19 @@ public static List formatTable(List rows) {
return lines;
}
+ public static String escapeJavaString(String str) {
+ return str.replace("\\", "\\\\")
+ .replace("\"", "\\\"");
+ }
+
+ public static String[] escapeJavaStrings(String[] strs) {
+ String[] res = new String[strs.length];
+ for(int i = 0; i < res.length; ++i) {
+ res[i] = escapeJavaString(strs[i]);
+ }
+ return res;
+ }
+
public static class ToStringComparator implements Comparator