Path: blob/dev/pkg/protocols/common/generators/load_test.go
2072 views
package generators12import (3"os"4"os/exec"5"path/filepath"6"testing"78"github.com/projectdiscovery/nuclei/v3/pkg/catalog/config"9"github.com/projectdiscovery/nuclei/v3/pkg/catalog/disk"10osutils "github.com/projectdiscovery/utils/os"11"github.com/stretchr/testify/require"12)1314func TestLoadPayloads(t *testing.T) {15// since we are changing value of global variable i.e templates directory16// run this test as subprocess17if os.Getenv("LOAD_PAYLOAD_NO_ACCESS") != "1" {18cmd := exec.Command(os.Args[0], "-test.run=TestLoadPayloadsWithAccess")19cmd.Env = append(os.Environ(), "LOAD_PAYLOAD_NO_ACCESS=1")20err := cmd.Run()21if e, ok := err.(*exec.ExitError); ok && !e.Success() {22return23}24if err != nil {25t.Fatalf("process ran with err %v, want exit status 1", err)26}27}28templateDir := getTemplatesDir(t)29config.DefaultConfig.SetTemplatesDir(templateDir)3031generator := &PayloadGenerator{catalog: disk.NewCatalog(templateDir), options: getOptions(false)}32fullpath := filepath.Join(templateDir, "payloads.txt")3334// Test sandbox35t.Run("templates-directory", func(t *testing.T) {36// testcase when loading file from template directory and template file is in root37// expected to succeed38values, err := generator.loadPayloads(map[string]interface{}{39"new": fullpath,40}, "/test")41require.NoError(t, err, "could not load payloads")42require.Equal(t, map[string][]string{"new": {"test", "another"}}, values, "could not get values")43})44t.Run("templates-path-relative", func(t *testing.T) {45// testcase when loading file from template directory and template file is current working directory46// expected to fail since this is LFI47_, err := generator.loadPayloads(map[string]interface{}{48"new": "../../../../../../../../../etc/passwd",49}, ".")50require.Error(t, err, "could load payloads")51})52t.Run("template-directory", func(t *testing.T) {53// testcase when loading file from template directory and template file is inside template directory54// expected to succeed55values, err := generator.loadPayloads(map[string]interface{}{56"new": fullpath,57}, filepath.Join(templateDir, "test.yaml"))58require.NoError(t, err, "could not load payloads")59require.Equal(t, map[string][]string{"new": {"test", "another"}}, values, "could not get values")60})6162t.Run("invalid", func(t *testing.T) {63// testcase when loading file from /etc/passwd and template file is at root i.e /64// expected to fail since this is LFI65values, err := generator.loadPayloads(map[string]interface{}{66"new": "/etc/passwd",67}, "/random")68require.Error(t, err, "could load payloads got %v", values)69require.Equal(t, 0, len(values), "could get values")7071// testcase when loading file from template directory and template file is at root i.e /72// expected to succeed73values, err = generator.loadPayloads(map[string]interface{}{74"new": fullpath,75}, "/random")76require.NoError(t, err, "could load payloads %v", values)77require.Equal(t, 1, len(values), "could get values")78require.Equal(t, []string{"test", "another"}, values["new"], "could get values")79})80}8182func TestLoadPayloadsWithAccess(t *testing.T) {83// since we are changing value of global variable i.e templates directory84// run this test as subprocess85if os.Getenv("LOAD_PAYLOAD_WITH_ACCESS") != "1" {86cmd := exec.Command(os.Args[0], "-test.run=TestLoadPayloadsWithAccess")87cmd.Env = append(os.Environ(), "LOAD_PAYLOAD_WITH_ACCESS=1")88err := cmd.Run()89if e, ok := err.(*exec.ExitError); ok && !e.Success() {90return91}92if err != nil {93t.Fatalf("process ran with err %v, want exit status 1", err)94}95}96templateDir := getTemplatesDir(t)97config.DefaultConfig.SetTemplatesDir(templateDir)9899generator := &PayloadGenerator{catalog: disk.NewCatalog(templateDir), options: getOptions(true)}100101t.Run("no-sandbox-unix", func(t *testing.T) {102if osutils.IsWindows() {103return104}105_, err := generator.loadPayloads(map[string]interface{}{106"new": "/etc/passwd",107}, "/random")108require.NoError(t, err, "could load payloads")109})110}111112func getTemplatesDir(t *testing.T) string {113tempdir, err := os.MkdirTemp("", "templates-*")114require.NoError(t, err, "could not create temp dir")115fullpath := filepath.Join(tempdir, "payloads.txt")116err = os.WriteFile(fullpath, []byte("test\nanother"), 0777)117require.NoError(t, err, "could not write payload")118return tempdir119}120121122