Skip to content

Commit 59a624f

Browse files
add more nil checks and create default map (#4896)
* add more nil checks and create default map * fix more panic in interactsh * early exit
1 parent 3ee1bfa commit 59a624f

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

pkg/protocols/http/request.go

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,35 @@ var errStopExecution = errors.New("stop execution due to unresolved variables")
488488

489489
// executeRequest executes the actual generated request and returns error if occurred
490490
func (request *Request) executeRequest(input *contextargs.Context, generatedRequest *generatedRequest, previousEvent output.InternalEvent, hasInteractMatchers bool, callback protocols.OutputEventCallback, requestCount int) error {
491+
outputEvent := output.InternalEvent{}
492+
var event *output.InternalWrappedEvent
493+
// event should never be nil as per existing logic
494+
defer func() {
495+
if event == nil {
496+
event := &output.InternalWrappedEvent{
497+
InternalEvent: map[string]interface{}{
498+
"template-id": request.options.TemplateID,
499+
"host": input.MetaInput.Input,
500+
},
501+
}
502+
if request.CompiledOperators != nil && request.CompiledOperators.HasDSL() {
503+
event.InternalEvent = outputEvent
504+
}
505+
callback(event)
506+
return
507+
}
508+
if event.InternalEvent == nil {
509+
event.InternalEvent = outputEvent
510+
}
511+
// make sure templateId is never nil
512+
if event.InternalEvent["template-id"] == nil {
513+
event.InternalEvent["template-id"] = request.options.TemplateID
514+
}
515+
if event.InternalEvent["host"] == nil {
516+
event.InternalEvent["host"] = input.MetaInput.Input
517+
}
518+
}()
519+
491520
request.setCustomHeaders(generatedRequest)
492521

493522
// Try to evaluate any payloads before replacement
@@ -688,7 +717,7 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ
688717
// In case of interactsh markers and request times out, still send
689718
// a callback event so in case we receive an interaction, correlation is possible.
690719
// Also, to log failed use-cases.
691-
outputEvent := request.responseToDSLMap(&http.Response{}, input.MetaInput.Input, formedURL, convUtil.String(dumpedRequest), "", "", "", 0, generatedRequest.meta)
720+
outputEvent = request.responseToDSLMap(&http.Response{}, input.MetaInput.Input, formedURL, convUtil.String(dumpedRequest), "", "", "", 0, generatedRequest.meta)
692721
if i := strings.LastIndex(hostname, ":"); i != -1 {
693722
hostname = hostname[:i]
694723
}
@@ -698,12 +727,6 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ
698727
} else {
699728
outputEvent["ip"] = httpclientpool.Dialer.GetDialedIP(hostname)
700729
}
701-
702-
event := &output.InternalWrappedEvent{}
703-
if request.CompiledOperators != nil && request.CompiledOperators.HasDSL() {
704-
event.InternalEvent = outputEvent
705-
}
706-
callback(event)
707730
return err
708731
}
709732

@@ -775,7 +798,7 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ
775798
}
776799
finalEvent := make(output.InternalEvent)
777800

778-
outputEvent := request.responseToDSLMap(respChain.Response(), input.MetaInput.Input, matchedURL, convUtil.String(dumpedRequest), respChain.FullResponse().String(), respChain.Body().String(), respChain.Headers().String(), duration, generatedRequest.meta)
801+
outputEvent = request.responseToDSLMap(respChain.Response(), input.MetaInput.Input, matchedURL, convUtil.String(dumpedRequest), respChain.FullResponse().String(), respChain.Body().String(), respChain.Headers().String(), duration, generatedRequest.meta)
779802
// add response fields to template context and merge templatectx variables to output event
780803
request.options.AddTemplateVars(input.MetaInput, request.Type(), request.ID, outputEvent)
781804
if request.options.HasTemplateCtx(input.MetaInput) {
@@ -813,7 +836,7 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ
813836
// prune signature internal values if any
814837
request.pruneSignatureInternalValues(generatedRequest.meta)
815838

816-
event := eventcreator.CreateEventWithAdditionalOptions(request, generators.MergeMaps(generatedRequest.dynamicValues, finalEvent), request.options.Options.Debug || request.options.Options.DebugResponse, func(internalWrappedEvent *output.InternalWrappedEvent) {
839+
event = eventcreator.CreateEventWithAdditionalOptions(request, generators.MergeMaps(generatedRequest.dynamicValues, finalEvent), request.options.Options.Debug || request.options.Options.DebugResponse, func(internalWrappedEvent *output.InternalWrappedEvent) {
817840
internalWrappedEvent.OperatorsResult.PayloadValues = generatedRequest.meta
818841
})
819842
if hasInteractMatchers {

pkg/templates/cluster.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,13 @@ func (e *ClusterExecuter) Execute(ctx *scan.ScanContext) (bool, error) {
252252
previous := make(map[string]interface{})
253253
dynamicValues := make(map[string]interface{})
254254
err := e.requests.ExecuteWithResults(inputItem, dynamicValues, previous, func(event *output.InternalWrappedEvent) {
255+
if event == nil {
256+
// unlikely but just in case
257+
return
258+
}
259+
if event.InternalEvent == nil {
260+
event.InternalEvent = make(map[string]interface{})
261+
}
255262
for _, operator := range e.operators {
256263
result, matched := operator.operator.Execute(event.InternalEvent, e.requests.Match, e.requests.Extract, e.options.Options.Debug || e.options.Options.DebugResponse)
257264
event.InternalEvent["template-id"] = operator.templateID

0 commit comments

Comments
 (0)