Path: blob/dev/pkg/protocols/common/generators/generators_test.go
2072 views
package generators12import (3"strings"4"testing"56"github.com/stretchr/testify/require"7"gopkg.in/yaml.v2"89"github.com/projectdiscovery/nuclei/v3/pkg/catalog/disk"10"github.com/projectdiscovery/nuclei/v3/pkg/types"11)1213func TestBatteringRamGenerator(t *testing.T) {14usernames := []string{"admin", "password"}1516catalogInstance := disk.NewCatalog("")17generator, err := New(map[string]interface{}{"username": usernames}, BatteringRamAttack, "", catalogInstance, "", getOptions(false))18require.Nil(t, err, "could not create generator")1920iterator := generator.NewIterator()21count := 022for {23_, ok := iterator.Value()24if !ok {25break26}27count++28}29require.Equal(t, len(usernames), count, "could not get correct batteringram counts")30}3132func TestPitchforkGenerator(t *testing.T) {33usernames := []string{"admin", "token"}34passwords := []string{"password1", "password2", "password3"}3536catalogInstance := disk.NewCatalog("")37generator, err := New(map[string]interface{}{"username": usernames, "password": passwords}, PitchForkAttack, "", catalogInstance, "", getOptions(false))38require.Nil(t, err, "could not create generator")3940iterator := generator.NewIterator()41count := 042for {43value, ok := iterator.Value()44if !ok {45break46}47count++48require.Contains(t, usernames, value["username"], "Could not get correct pitchfork username")49require.Contains(t, passwords, value["password"], "Could not get correct pitchfork password")50}51require.Equal(t, len(usernames), count, "could not get correct pitchfork counts")52}5354func TestClusterbombGenerator(t *testing.T) {55usernames := []string{"admin"}56passwords := []string{"admin", "password", "token"}5758catalogInstance := disk.NewCatalog("")59generator, err := New(map[string]interface{}{"username": usernames, "password": passwords}, ClusterBombAttack, "", catalogInstance, "", getOptions(false))60require.Nil(t, err, "could not create generator")6162iterator := generator.NewIterator()63count := 064for {65value, ok := iterator.Value()66if !ok {67break68}69count++70require.Contains(t, usernames, value["username"], "Could not get correct clusterbomb username")71require.Contains(t, passwords, value["password"], "Could not get correct clusterbomb password")72}73require.Equal(t, 3, count, "could not get correct clusterbomb counts")7475iterator.Reset()76count = 077for {78value, ok := iterator.Value()79if !ok {80break81}82count++83require.Contains(t, usernames, value["username"], "Could not get correct clusterbomb username")84require.Contains(t, passwords, value["password"], "Could not get correct clusterbomb password")85}86require.Equal(t, 3, count, "could not get correct clusterbomb counts")87}8889func getOptions(allowLocalFileAccess bool) *types.Options {90opts := types.DefaultOptions()91opts.AllowLocalFileAccess = allowLocalFileAccess92return opts93}9495func TestParsePayloadsWithAggression(t *testing.T) {96testPayload := `linux_path:97low:98- /etc/passwd99medium:100- ../etc/passwd101- ../../etc/passwd102high:103- ../../../etc/passwd104- ../../../../etc/passwd105- ../../../../../etc/passwd`106107var payloads map[string]interface{}108err := yaml.NewDecoder(strings.NewReader(testPayload)).Decode(&payloads)109require.Nil(t, err, "could not unmarshal yaml")110111aggressionsToValues := map[string][]string{112"low": {113"/etc/passwd",114},115"medium": {116"/etc/passwd",117"../etc/passwd",118"../../etc/passwd",119},120"high": {121"/etc/passwd",122"../etc/passwd",123"../../etc/passwd",124"../../../etc/passwd",125"../../../../etc/passwd",126"../../../../../etc/passwd",127},128}129130for k, v := range payloads {131for aggression, values := range aggressionsToValues {132parsed, err := parsePayloadsWithAggression(k, v.(map[interface{}]interface{}), aggression)133require.Nil(t, err, "could not parse payloads with aggression")134135gotValues := parsed[k].([]interface{})136require.Equal(t, len(values), len(gotValues), "could not get correct number of values")137}138}139}140141142