mirror of
https://github.com/BishopFox/sj.git
synced 2026-11-09 09:59:37 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bdea5822e8 | ||
|
|
7bb228d81c | ||
|
|
3258ca341f | ||
|
|
58d4e91760 | ||
|
|
1f5a946011 |
No files matched your search
@@ -166,6 +166,9 @@ func findDefinitionFile(urls []string, client http.Client) (bool, *openapi3.T) {
|
||||
regexPattern := regexp.MustCompile(`(?s)let\s+(\w+)\s*=\s*({.*?});`)
|
||||
matches := regexPattern.FindAllStringSubmatch(bodyString, -1)
|
||||
for _, match := range matches {
|
||||
if len(match) < 3 {
|
||||
continue
|
||||
}
|
||||
jsonContent := match[2]
|
||||
checkSpec := UnmarshalSpec([]byte(jsonContent))
|
||||
if strings.HasPrefix(checkSpec.OpenAPI, "2") || strings.HasPrefix(checkSpec.OpenAPI, "3") {
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ This list contains the raw endpoints (parameter values will not be appended or m
|
||||
log.Infof("Gathering endpoints.\n\n")
|
||||
|
||||
if swaggerURL != "" {
|
||||
bodyBytes, _, _ := MakeRequest(client, "GET", swaggerURL, timeout, nil)
|
||||
bodyBytes, _, _ = MakeRequest(client, "GET", swaggerURL, timeout, nil)
|
||||
GenerateRequests(bodyBytes, client)
|
||||
} else {
|
||||
specFile, err := os.Open(localFile)
|
||||
|
||||
+44
-41
@@ -34,12 +34,14 @@ func writeLog(sc int, target, method, errorMsg, response string) {
|
||||
}
|
||||
|
||||
if outfile != "" {
|
||||
file, err := os.OpenFile(outfile, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0644)
|
||||
var err error
|
||||
file, err = os.OpenFile(outfile, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0644)
|
||||
if err != nil {
|
||||
fmt.Println("Output file does not exist or cannot be created")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
defer file.Close()
|
||||
tempLogger.SetOutput(file)
|
||||
}
|
||||
|
||||
@@ -54,52 +56,53 @@ func writeLog(sc int, target, method, errorMsg, response string) {
|
||||
}
|
||||
|
||||
if verbose {
|
||||
if sc != 200 {
|
||||
if sc == 401 || sc == 403 {
|
||||
logVerboseUnauth(sc, target, method, errorMsg, response, tempLogger)
|
||||
} else if sc == 301 || sc == 302 {
|
||||
logVerboseRedirect(sc, target, method, response, tempLogger)
|
||||
} else if sc == 0 {
|
||||
logVerboseBad(sc, target, method, response, tempLogger)
|
||||
} else if sc == 404 {
|
||||
logNotFound(sc, target, method, errorMsg, tempLogger)
|
||||
} else if sc == 1 {
|
||||
logDangerous(target, method, tempLogger)
|
||||
} else if sc == 8899 {
|
||||
logVerboseJSON(specTitle, specDescription)
|
||||
} else {
|
||||
logVerboseManual(sc, target, method, errorMsg, response, tempLogger)
|
||||
}
|
||||
} else {
|
||||
switch sc {
|
||||
case 0:
|
||||
logVerboseBad(sc, target, method, response, tempLogger)
|
||||
case 1:
|
||||
logDangerous(target, method, tempLogger)
|
||||
case 200:
|
||||
logVerboseAccessible(sc, target, method, response, tempLogger)
|
||||
case 301:
|
||||
logVerboseRedirect(sc, target, method, response, tempLogger)
|
||||
case 302:
|
||||
logVerboseRedirect(sc, target, method, response, tempLogger)
|
||||
case 401:
|
||||
logVerboseUnauth(sc, target, method, errorMsg, response, tempLogger)
|
||||
case 403:
|
||||
logVerboseUnauth(sc, target, method, errorMsg, response, tempLogger)
|
||||
case 404:
|
||||
logNotFound(sc, target, method, errorMsg, tempLogger)
|
||||
case 8899:
|
||||
logVerboseJSON(specTitle, specDescription)
|
||||
default:
|
||||
logVerboseManual(sc, target, method, errorMsg, response, tempLogger)
|
||||
}
|
||||
} else {
|
||||
if sc != 200 {
|
||||
if sc == 401 || sc == 403 {
|
||||
logUnauth(sc, target, method, errorMsg, tempLogger)
|
||||
} else if sc == 301 || sc == 302 {
|
||||
logRedirect(sc, target, method, tempLogger)
|
||||
} else if sc == 0 {
|
||||
logBad(sc, target, method, tempLogger)
|
||||
} else if sc == 404 {
|
||||
logNotFound(sc, target, method, errorMsg, tempLogger)
|
||||
} else if sc == 1 {
|
||||
logDangerous(target, method, tempLogger)
|
||||
} else if sc == 8899 {
|
||||
logJSON(specTitle, specDescription)
|
||||
} else {
|
||||
logManual(sc, target, method, errorMsg, tempLogger)
|
||||
}
|
||||
} else {
|
||||
if sc == 8899 {
|
||||
logJSON(specTitle, specDescription)
|
||||
} else {
|
||||
logAccessible(sc, target, method, tempLogger)
|
||||
}
|
||||
switch sc {
|
||||
case 0:
|
||||
logBad(sc, target, method, tempLogger)
|
||||
case 1:
|
||||
logDangerous(target, method, tempLogger)
|
||||
case 200:
|
||||
logAccessible(sc, target, method, tempLogger)
|
||||
case 301:
|
||||
logRedirect(sc, target, method, tempLogger)
|
||||
case 302:
|
||||
logRedirect(sc, target, method, tempLogger)
|
||||
case 401:
|
||||
logUnauth(sc, target, method, errorMsg, tempLogger)
|
||||
case 403:
|
||||
logUnauth(sc, target, method, errorMsg, tempLogger)
|
||||
case 404:
|
||||
logNotFound(sc, target, method, errorMsg, tempLogger)
|
||||
case 8899:
|
||||
logJSON(specTitle, specDescription)
|
||||
default:
|
||||
logManual(sc, target, method, errorMsg, tempLogger)
|
||||
}
|
||||
}
|
||||
responsePreviewLength = tempResponsePreviewLength
|
||||
file.Close()
|
||||
}
|
||||
|
||||
func logAccessible(status int, target, method string, logger *log.Logger) {
|
||||
|
||||
+4
-1
@@ -20,6 +20,7 @@ var (
|
||||
avoidDangerousRequests string
|
||||
contentType string
|
||||
dangerousStrings []string = []string{"add", "block", "build", "buy", "change", "clear", "create", "delete", "deploy", "destroy", "drop", "edit", "emergency", "erase", "execute", "insert", "modify", "order", "overwrite", "pause", "purchase", "rebuild", "remove", "replace", "reset", "restart", "revoke", "run", "sell", "send", "set", "start", "stop", "update", "upload", "write"}
|
||||
depth int = 0
|
||||
Headers []string
|
||||
requestStatus int
|
||||
riskSurveyed bool = false
|
||||
@@ -163,13 +164,15 @@ func MakeRequest(client http.Client, method, target string, timeout int64, reqDa
|
||||
bodyBytes, _ := io.ReadAll(resp.Body)
|
||||
bodyString := string(bodyBytes)
|
||||
|
||||
if (resp.StatusCode == 301 || resp.StatusCode == 302) && strings.Contains(bodyString, "<html>") {
|
||||
if (resp.StatusCode == 301 || resp.StatusCode == 302) && strings.Contains(bodyString, "<html>") && depth < 10 {
|
||||
depth += 1
|
||||
redirect, _ := resp.Location()
|
||||
bodyBytes, bodyString, requestStatus = MakeRequest(client, method, redirect.Scheme+"://"+redirect.Host+redirect.Path, timeout, reqData)
|
||||
return bodyBytes, bodyString, requestStatus
|
||||
}
|
||||
|
||||
requestStatus = resp.StatusCode
|
||||
depth = 0
|
||||
|
||||
return bodyBytes, bodyString, requestStatus
|
||||
}
|
||||
|
||||
+1
-1
@@ -52,7 +52,7 @@ $ sj convert -u https://petstore.swagger.io/v2/swagger.json -o openapi.json`,
|
||||
log.Error("Command not specified. See the --help flag for usage.")
|
||||
}
|
||||
},
|
||||
Version: "2.3.1",
|
||||
Version: "2.3.2",
|
||||
}
|
||||
|
||||
func Execute() {
|
||||
|
||||
Reference in new issue
Block a user