mirror of
https://github.com/projectdiscovery/nuclei.git
synced 2025-12-22 17:35:26 +00:00
RES-120 Added functional testing implementation
This commit is contained in:
parent
571a4c3c33
commit
8d0b5d6203
3
.gitignore
vendored
3
.gitignore
vendored
@ -8,3 +8,6 @@ bin
|
|||||||
v2/pkg/protocols/common/helpers/deserialization/testdata/Deserialize.class
|
v2/pkg/protocols/common/helpers/deserialization/testdata/Deserialize.class
|
||||||
v2/pkg/protocols/common/helpers/deserialization/testdata/ValueObject.class
|
v2/pkg/protocols/common/helpers/deserialization/testdata/ValueObject.class
|
||||||
v2/pkg/protocols/common/helpers/deserialization/testdata/ValueObject2.ser
|
v2/pkg/protocols/common/helpers/deserialization/testdata/ValueObject2.ser
|
||||||
|
v2/cmd/functional-test/nuclei_dev
|
||||||
|
v2/cmd/functional-test/nuclei_main
|
||||||
|
v2/cmd/functional-test/functional-test
|
||||||
79
v2/cmd/functional-test/main.go
Normal file
79
v2/cmd/functional-test/main.go
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/logrusorgru/aurora"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/projectdiscovery/nuclei/v2/internal/testutils"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
success = aurora.Green("[✓]").String()
|
||||||
|
failed = aurora.Red("[✘]").String()
|
||||||
|
errored = false
|
||||||
|
|
||||||
|
mainNucleiBinary = flag.String("main", "", "Main Branch Nuclei Binary")
|
||||||
|
devNucleiBinary = flag.String("dev", "", "Dev Branch Nuclei Binary")
|
||||||
|
testcases = flag.String("testcases", "", "Test cases file for nuclei functional tests")
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if err := runFunctionalTests(); err != nil {
|
||||||
|
log.Fatalf("Could not run functional tests: %s\n", err)
|
||||||
|
}
|
||||||
|
if errored {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func runFunctionalTests() error {
|
||||||
|
file, err := os.Open(*testcases)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "could not open test cases")
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
for scanner.Scan() {
|
||||||
|
text := strings.TrimSpace(scanner.Text())
|
||||||
|
if text == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := runIndividualTestCase(text); err != nil {
|
||||||
|
errored = true
|
||||||
|
fmt.Fprintf(os.Stderr, "%s Test \"%s\" failed: %s\n", failed, text, err)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("%s Test \"%s\" passed!\n", success, text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func runIndividualTestCase(testcase string) error {
|
||||||
|
parts := strings.Fields(testcase)
|
||||||
|
|
||||||
|
var finalArgs []string
|
||||||
|
if len(parts) > 1 {
|
||||||
|
finalArgs = parts[1:]
|
||||||
|
}
|
||||||
|
mainOutput, err := testutils.RunNucleiBinaryAndGetLoadedTemplates(*mainNucleiBinary, finalArgs)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "could not run nuclei main test")
|
||||||
|
}
|
||||||
|
devOutput, err := testutils.RunNucleiBinaryAndGetLoadedTemplates(*devNucleiBinary, finalArgs)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "could not run nuclei dev test")
|
||||||
|
}
|
||||||
|
if mainOutput == devOutput {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt.Errorf("%s main is not equal to %s dev", mainOutput, devOutput)
|
||||||
|
}
|
||||||
11
v2/cmd/functional-test/run.sh
Normal file
11
v2/cmd/functional-test/run.sh
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
git checkout master
|
||||||
|
cd ../nuclei/
|
||||||
|
go build
|
||||||
|
cp nuclei ../functional-test/nuclei_main
|
||||||
|
git checkout dev
|
||||||
|
go build
|
||||||
|
cp nuclei ../functional-test/nuclei_dev
|
||||||
|
cd ../functional-test
|
||||||
|
./functional-test -main ./nuclei_main -dev ./nuclei_dev -testcases testcases.txt
|
||||||
51
v2/cmd/functional-test/testcases.txt
Normal file
51
v2/cmd/functional-test/testcases.txt
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{{binary}}
|
||||||
|
{{binary}} -tags cve
|
||||||
|
{{binary}} -tags cve,exposure
|
||||||
|
{{binary}} -tags cve,exposure -tags token
|
||||||
|
{{binary}} -tags cve,exposure -tags token,logs
|
||||||
|
{{binary}} -tags "cve","exposure" -tags "token","logs"
|
||||||
|
{{binary}} -tags 'cve','exposure' -tags 'token','logs'
|
||||||
|
{{binary}} -tags cve -severity high
|
||||||
|
{{binary}} -tags cve,exposure -severity high,critical
|
||||||
|
{{binary}} -tags cve,exposure -severity "high,critical,medium"
|
||||||
|
{{binary}} -tags cve -author geeknik
|
||||||
|
{{binary}} -tags cve -author geeknik,pdteam
|
||||||
|
{{binary}} -tags cve -author geeknik -severity high
|
||||||
|
{{binary}} -tags cve
|
||||||
|
{{binary}} -tags cve,exposure
|
||||||
|
{{binary}} -tags cve,exposure -tags token
|
||||||
|
{{binary}} -tags cve,exposure -tags token,logs
|
||||||
|
{{binary}} -tags "cve","exposure" -tags "token","logs"
|
||||||
|
{{binary}} -tags 'cve','exposure' -tags 'token','logs'
|
||||||
|
{{binary}} -tags cve -severity high
|
||||||
|
{{binary}} -tags cve,exposure -severity high,critical
|
||||||
|
{{binary}} -tags cve,exposure -severity "high,critical,medium"
|
||||||
|
{{binary}} -tags cve -author geeknik
|
||||||
|
{{binary}} -tags cve -author geeknik,pdteam
|
||||||
|
{{binary}} -tags cve -author geeknik -severity high
|
||||||
|
{{binary}} -tags cve,exposure -author geeknik,pdteam -severity high,critical
|
||||||
|
{{binary}} -tags "cve,exposure" -author "geeknik,pdteam" -severity "high,critical"
|
||||||
|
{{binary}} -tags cve -etags ssrf
|
||||||
|
{{binary}} -tags cve,exposure -etags ssrf,config
|
||||||
|
{{binary}} -tags cve,exposure -etags ssrf,config -severity high
|
||||||
|
{{binary}} -tags cve,exposure -etags ssrf,config -severity high -author geeknik
|
||||||
|
{{binary}} -tags cve,dos,fuzz
|
||||||
|
{{binary}} -tags cve -include-tags dos,fuzz
|
||||||
|
{{binary}} -tags cve -exclude-tags cve2020
|
||||||
|
{{binary}} -tags cve -exclude-templates cves/2020/
|
||||||
|
{{binary}} -tags cve -exclude-templates cves/2020/CVE-2020-9757.yaml
|
||||||
|
{{binary}} -tags cve -exclude-templates cves/2020/CVE-2020-9757.yaml -exclude-templates cves/2021/
|
||||||
|
{{binary}} -t cves/
|
||||||
|
{{binary}} -t cves/ -t exposures/
|
||||||
|
{{binary}} -t cves/ -t exposures/ -tags config
|
||||||
|
{{binary}} -t cves/ -t exposures/ -tags config,ssrf
|
||||||
|
{{binary}} -t cves/ -t exposures/ -tags config -severity high,critical
|
||||||
|
{{binary}} -t cves/ -t exposures/ -tags config -severity high,critical -author geeknik,pdteam
|
||||||
|
{{binary}} -t cves/ -t exposures/ -tags config -severity high,critical -author geeknik,pdteam -etags sqli
|
||||||
|
{{binary}} -t cves/ -t exposures/ -tags config -severity high,critical -author geeknik,pdteam -etags sqli -exclude-templates cves/2021/
|
||||||
|
{{binary}} -t cves/ -t exposures/ -tags config -severity high,critical -author geeknik,pdteam -etags sqli -exclude-templates cves/2017/CVE-2017-7269.yaml
|
||||||
|
{{binary}} -t cves/ -t exposures/ -tags config -severity high,critical -author geeknik,pdteam -etags sqli -include-templates cves/2017/CVE-2017-7269.yaml
|
||||||
|
{{binary}} -w workflows
|
||||||
|
{{binary}} -w workflows -author geeknik,pdteam
|
||||||
|
{{binary}} -w workflows -severity high,critical
|
||||||
|
{{binary}} -w workflows -author geeknik,pdteam -severity high,critical
|
||||||
@ -13,6 +13,8 @@ var (
|
|||||||
debug = os.Getenv("DEBUG") == "true"
|
debug = os.Getenv("DEBUG") == "true"
|
||||||
customTest = os.Getenv("TEST")
|
customTest = os.Getenv("TEST")
|
||||||
protocol = os.Getenv("PROTO")
|
protocol = os.Getenv("PROTO")
|
||||||
|
|
||||||
|
errored = false
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -36,13 +38,16 @@ func main() {
|
|||||||
err := test.Execute(file)
|
err := test.Execute(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "%s Test \"%s\" failed: %s\n", failed, file, err)
|
fmt.Fprintf(os.Stderr, "%s Test \"%s\" failed: %s\n", failed, file, err)
|
||||||
os.Exit(1)
|
errored = true
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("%s Test \"%s\" passed!\n", success, file)
|
fmt.Printf("%s Test \"%s\" passed!\n", success, file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if errored {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func errIncorrectResultsCount(results []string) error {
|
func errIncorrectResultsCount(results []string) error {
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
package testutils
|
package testutils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,6 +32,23 @@ func RunNucleiAndGetResults(template, url string, debug bool, extra ...string) (
|
|||||||
return parts, nil
|
return parts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var templateLoaded = regexp.MustCompile(`(?:Templates|Workflows) loaded: ([0-9]+)`)
|
||||||
|
|
||||||
|
// RunNucleiAndGetResults returns a list of results for a template
|
||||||
|
func RunNucleiBinaryAndGetLoadedTemplates(nucleiBinary string, args []string) (string, error) {
|
||||||
|
cmd := exec.Command(nucleiBinary, args...)
|
||||||
|
|
||||||
|
data, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
matches := templateLoaded.FindAllStringSubmatch(string(data), -1)
|
||||||
|
if len(matches) == 0 {
|
||||||
|
return "", errors.New("no matches found")
|
||||||
|
}
|
||||||
|
return matches[0][1], nil
|
||||||
|
}
|
||||||
|
|
||||||
// RunNucleiWorkflowAndGetResults returns a list of results for a workflow
|
// RunNucleiWorkflowAndGetResults returns a list of results for a workflow
|
||||||
func RunNucleiWorkflowAndGetResults(template, url string, debug bool, extra ...string) ([]string, error) {
|
func RunNucleiWorkflowAndGetResults(template, url string, debug bool, extra ...string) ([]string, error) {
|
||||||
cmd := exec.Command("./nuclei", "-w", template, "-target", url, "-silent")
|
cmd := exec.Command("./nuclei", "-w", template, "-target", url, "-silent")
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
class Deserialize{
|
class Deserialize {
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
FileInputStream fileIn = null;
|
FileInputStream fileIn = null;
|
||||||
ObjectInputStream in = null;
|
ObjectInputStream in = null;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user