nuclei/v2/pkg/executer/output_http.go

147 lines
3.6 KiB
Go
Raw Normal View History

2020-07-16 10:57:28 +02:00
package executer
2020-04-26 05:50:33 +05:30
import (
"net/http"
"net/http/httputil"
2020-04-26 05:50:33 +05:30
"strings"
2020-06-27 20:19:43 +05:30
jsoniter "github.com/json-iterator/go"
"github.com/projectdiscovery/gologger"
2020-07-01 16:17:24 +05:30
"github.com/projectdiscovery/nuclei/v2/pkg/matchers"
"github.com/projectdiscovery/nuclei/v2/pkg/requests"
2020-04-26 05:50:33 +05:30
)
// writeOutputHTTP writes http output to streams
2020-10-11 21:18:10 +02:00
func (e *HTTPExecuter) writeOutputHTTP(req *requests.HTTPRequest, resp *http.Response, body string, matcher *matchers.Matcher, extractorResults []string, meta map[string]interface{}) {
2020-09-29 00:24:38 +02:00
var URL string
if req.RawRequest != nil {
URL = req.RawRequest.FullURL
}
if req.Request != nil {
URL = req.Request.URL.String()
}
2020-06-27 20:19:43 +05:30
if e.jsonOutput {
output := make(jsonOutput)
2020-10-20 01:57:38 +05:30
output["matched"] = URL
if !e.noMeta {
output["template"] = e.template.ID
output["type"] = "http"
if len(meta) > 0 {
output["meta"] = meta
}
for k, v := range e.template.Info {
output[k] = v
}
if matcher != nil && len(matcher.Name) > 0 {
output["matcher_name"] = matcher.Name
}
if len(extractorResults) > 0 {
output["extracted_results"] = extractorResults
}
2020-10-20 01:57:38 +05:30
// TODO: URL should be an argument
if e.jsonRequest {
dumpedRequest, err := requests.Dump(req, URL)
if err != nil {
gologger.Warningf("could not dump request: %s\n", err)
} else {
output["request"] = string(dumpedRequest)
}
dumpedResponse, err := httputil.DumpResponse(resp, false)
if err != nil {
gologger.Warningf("could not dump response: %s\n", err)
} else {
output["response"] = string(dumpedResponse) + body
}
}
}
2020-06-27 20:19:43 +05:30
data, err := jsoniter.Marshal(output)
if err != nil {
gologger.Warningf("Could not marshal json output: %s\n", err)
}
gologger.Silentf("%s", string(data))
if e.writer != nil {
2020-09-10 16:32:01 +05:30
if err := e.writer.Write(data); err != nil {
gologger.Errorf("Could not write output data: %s\n", err)
return
}
2020-06-27 20:19:43 +05:30
}
return
}
2020-04-26 05:50:33 +05:30
builder := &strings.Builder{}
colorizer := e.colorizer
2020-04-26 05:50:33 +05:30
2020-10-20 01:57:38 +05:30
if !e.noMeta {
builder.WriteRune('[')
builder.WriteString(colorizer.Colorizer.BrightGreen(e.template.ID).String())
2020-10-20 01:57:38 +05:30
if matcher != nil && len(matcher.Name) > 0 {
builder.WriteString(":")
builder.WriteString(colorizer.Colorizer.BrightGreen(matcher.Name).Bold().String())
}
2020-04-26 05:50:33 +05:30
2020-10-20 01:57:38 +05:30
builder.WriteString("] [")
builder.WriteString(colorizer.Colorizer.BrightBlue("http").String())
builder.WriteString("] ")
2020-10-20 01:57:38 +05:30
if e.template.Info["severity"] != "" {
builder.WriteString("[")
builder.WriteString(colorizer.GetColorizedSeverity(e.template.Info["severity"]))
builder.WriteString("] ")
}
}
builder.WriteString(URL)
2020-04-26 05:50:33 +05:30
// If any extractors, write the results
2020-10-20 01:57:38 +05:30
if len(extractorResults) > 0 && !e.noMeta {
2020-04-26 05:50:33 +05:30
builder.WriteString(" [")
2020-04-26 05:50:33 +05:30
for i, result := range extractorResults {
builder.WriteString(colorizer.Colorizer.BrightCyan(result).String())
2020-04-26 05:50:33 +05:30
if i != len(extractorResults)-1 {
builder.WriteRune(',')
}
}
2020-04-26 05:50:33 +05:30
builder.WriteString("]")
}
2020-05-14 18:09:36 +02:00
// write meta if any
2020-10-20 01:57:38 +05:30
if len(req.Meta) > 0 && !e.noMeta {
2020-05-14 18:09:36 +02:00
builder.WriteString(" [")
2020-05-14 18:09:36 +02:00
var metas []string
2020-05-14 18:09:36 +02:00
for name, value := range req.Meta {
metas = append(metas, colorizer.Colorizer.BrightYellow(name).Bold().String()+"="+colorizer.Colorizer.BrightYellow(value.(string)).String())
2020-05-14 18:09:36 +02:00
}
2020-05-14 18:09:36 +02:00
builder.WriteString(strings.Join(metas, ","))
builder.WriteString("]")
}
2020-04-26 05:50:33 +05:30
builder.WriteRune('\n')
// Write output to screen as well as any output file
message := builder.String()
gologger.Silentf("%s", message)
if e.writer != nil {
if e.coloredOutput {
message = e.decolorizer.ReplaceAllString(message, "")
}
2020-09-10 16:32:01 +05:30
if err := e.writer.WriteString(message); err != nil {
gologger.Errorf("Could not write output data: %s\n", err)
return
}
}
2020-04-26 05:50:33 +05:30
}