mirror of
https://github.com/projectdiscovery/nuclei.git
synced 2025-12-17 22:05:27 +00:00
97 lines
2.9 KiB
Go
97 lines
2.9 KiB
Go
|
|
package format
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"fmt"
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
"github.com/projectdiscovery/nuclei/v2/pkg/output"
|
||
|
|
"github.com/projectdiscovery/nuclei/v2/pkg/types"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Summary returns a formatted built one line summary of the event
|
||
|
|
func Summary(output *output.ResultEvent) string {
|
||
|
|
template := GetMatchedTemplate(output)
|
||
|
|
|
||
|
|
builder := &strings.Builder{}
|
||
|
|
builder.WriteString("[")
|
||
|
|
builder.WriteString(template)
|
||
|
|
builder.WriteString("] [")
|
||
|
|
builder.WriteString(output.Info["severity"])
|
||
|
|
builder.WriteString("] ")
|
||
|
|
builder.WriteString(output.Info["name"])
|
||
|
|
builder.WriteString(" found on ")
|
||
|
|
builder.WriteString(output.Host)
|
||
|
|
data := builder.String()
|
||
|
|
return data
|
||
|
|
}
|
||
|
|
|
||
|
|
// MarkdownDescription formats a short description of the generated
|
||
|
|
// event by the nuclei scanner in Markdown format.
|
||
|
|
func MarkdownDescription(output *output.ResultEvent) string {
|
||
|
|
template := GetMatchedTemplate(output)
|
||
|
|
builder := &bytes.Buffer{}
|
||
|
|
builder.WriteString("**Details**: **")
|
||
|
|
builder.WriteString(template)
|
||
|
|
builder.WriteString("** ")
|
||
|
|
builder.WriteString(" matched at ")
|
||
|
|
builder.WriteString(output.Host)
|
||
|
|
builder.WriteString("\n\n**Protocol**: ")
|
||
|
|
builder.WriteString(strings.ToUpper(output.Type))
|
||
|
|
builder.WriteString("\n\n**Full URL**: ")
|
||
|
|
builder.WriteString(output.Matched)
|
||
|
|
builder.WriteString("\n\n**Timestamp**: ")
|
||
|
|
builder.WriteString(output.Timestamp.Format("Mon Jan 2 15:04:05 -0700 MST 2006"))
|
||
|
|
builder.WriteString("\n\n**Template Information**\n\n| Key | Value |\n|---|---|\n")
|
||
|
|
for k, v := range output.Info {
|
||
|
|
builder.WriteString(fmt.Sprintf("| %s | %s |\n", k, v))
|
||
|
|
}
|
||
|
|
builder.WriteString("\n**Request**\n\n```\n")
|
||
|
|
builder.WriteString(output.Request)
|
||
|
|
builder.WriteString("\n```\n\n**Response**\n\n```\n")
|
||
|
|
builder.WriteString(output.Response)
|
||
|
|
builder.WriteString("\n```\n\n")
|
||
|
|
|
||
|
|
if len(output.ExtractedResults) > 0 || len(output.Metadata) > 0 {
|
||
|
|
builder.WriteString("**Extra Information**\n\n")
|
||
|
|
if len(output.ExtractedResults) > 0 {
|
||
|
|
builder.WriteString("**Extracted results**:\n\n")
|
||
|
|
for _, v := range output.ExtractedResults {
|
||
|
|
builder.WriteString("- ")
|
||
|
|
builder.WriteString(v)
|
||
|
|
builder.WriteString("\n")
|
||
|
|
}
|
||
|
|
builder.WriteString("\n")
|
||
|
|
}
|
||
|
|
if len(output.Metadata) > 0 {
|
||
|
|
builder.WriteString("**Metadata**:\n\n")
|
||
|
|
for k, v := range output.Metadata {
|
||
|
|
builder.WriteString("- ")
|
||
|
|
builder.WriteString(k)
|
||
|
|
builder.WriteString(": ")
|
||
|
|
builder.WriteString(types.ToString(v))
|
||
|
|
builder.WriteString("\n")
|
||
|
|
}
|
||
|
|
builder.WriteString("\n")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
data := builder.String()
|
||
|
|
return data
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetMatchedTemplate returns the matched template from a result event
|
||
|
|
func GetMatchedTemplate(output *output.ResultEvent) string {
|
||
|
|
builder := &strings.Builder{}
|
||
|
|
builder.WriteString(output.TemplateID)
|
||
|
|
if output.MatcherName != "" {
|
||
|
|
builder.WriteString(":")
|
||
|
|
builder.WriteString(output.MatcherName)
|
||
|
|
}
|
||
|
|
if output.ExtractorName != "" {
|
||
|
|
builder.WriteString(":")
|
||
|
|
builder.WriteString(output.ExtractorName)
|
||
|
|
}
|
||
|
|
template := builder.String()
|
||
|
|
return template
|
||
|
|
}
|