114 lines
4.4 KiB
Go
114 lines
4.4 KiB
Go
package payload
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
)
|
||
|
||
// Preset — фабрика встроенного генератора по короткому имени, чтобы
|
||
// в CLI/TUI можно было писать "preset:numbers-small" вместо ручного
|
||
// wordlist-файла — но не вместо него: preset — это ещё один вариант
|
||
// spec наравне с wordlist:/range:, а не замена. Свои словари как
|
||
// работали через wordlist:<путь>, так и продолжают работать.
|
||
type Preset struct {
|
||
Name string
|
||
Description string
|
||
New func() Generator
|
||
}
|
||
|
||
var presets = []Preset{
|
||
{"numbers-small", "Числа 0-100", func() Generator {
|
||
return NewNumericRangeGenerator(0, 100, 1)
|
||
}},
|
||
{"numbers-large", "Числа 0-9999", func() Generator {
|
||
return NewNumericRangeGenerator(0, 9999, 1)
|
||
}},
|
||
{"alpha-lower", "Строчные буквы a-z, длина 1-2", func() Generator {
|
||
return NewBruteForceGenerator("abcdefghijklmnopqrstuvwxyz", 1, 2)
|
||
}},
|
||
{"alpha-upper", "Заглавные буквы A-Z, длина 1-2", func() Generator {
|
||
return NewBruteForceGenerator("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 1, 2)
|
||
}},
|
||
{"alpha-mixed", "Буквы обоих регистров, длина 1-2", func() Generator {
|
||
return NewBruteForceGenerator("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 1, 2)
|
||
}},
|
||
{"alnum", "Буквы + цифры, длина 1-2", func() Generator {
|
||
return NewBruteForceGenerator("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 1, 2)
|
||
}},
|
||
{"common-usernames", "Частые имена пользователей", func() Generator {
|
||
return NewWordlistGenerator(commonUsernames)
|
||
}},
|
||
{"common-passwords", "Частые пароли", func() Generator {
|
||
return NewWordlistGenerator(commonPasswords)
|
||
}},
|
||
{"sqli-probes", "Базовые SQLi-пробники", func() Generator {
|
||
return NewWordlistGenerator(sqliProbes)
|
||
}},
|
||
{"xss-probes", "Базовые XSS-пробники", func() Generator {
|
||
return NewWordlistGenerator(xssProbes)
|
||
}},
|
||
{"path-traversal", "Path traversal пробники", func() Generator {
|
||
return NewWordlistGenerator(pathTraversalProbes)
|
||
}},
|
||
}
|
||
|
||
// PresetNames возвращает имена всех встроенных заготовок в порядке
|
||
// объявления — используется и для валидации, и для циклического обзора
|
||
// в TUI (ctrl+l).
|
||
func PresetNames() []string {
|
||
names := make([]string, len(presets))
|
||
for i, p := range presets {
|
||
names[i] = p.Name
|
||
}
|
||
return names
|
||
}
|
||
|
||
// PresetDescription возвращает человекочитаемое описание заготовки,
|
||
// пустую строку — если имя неизвестно.
|
||
func PresetDescription(name string) string {
|
||
for _, p := range presets {
|
||
if p.Name == name {
|
||
return p.Description
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// NewFromPreset создаёт генератор по имени встроенной заготовки.
|
||
func NewFromPreset(name string) (Generator, error) {
|
||
for _, p := range presets {
|
||
if p.Name == name {
|
||
return p.New(), nil
|
||
}
|
||
}
|
||
return nil, fmt.Errorf("неизвестная заготовка %q (доступные: %s)", name, strings.Join(PresetNames(), ", "))
|
||
}
|
||
|
||
// Встроенные списки — короткие, ознакомительные. Для серьёзного перебора
|
||
// (rockyou и подобные) по-прежнему используется свой словарь через
|
||
// wordlist:<путь> — заготовки не пытаются его заменить.
|
||
var commonUsernames = []string{
|
||
"admin", "administrator", "root", "user", "test",
|
||
"guest", "demo", "support", "info", "webmaster",
|
||
}
|
||
|
||
var commonPasswords = []string{
|
||
"password", "123456", "admin", "letmein", "qwerty",
|
||
"password1", "12345678", "admin123", "root", "changeme",
|
||
}
|
||
|
||
var sqliProbes = []string{
|
||
`'`, `"`, `' OR '1'='1`, `' OR '1'='1' --`, `" OR "1"="1`,
|
||
`1' AND '1'='1`, `' UNION SELECT NULL--`, `1 OR 1=1`, `admin'--`,
|
||
}
|
||
|
||
var xssProbes = []string{
|
||
`<script>alert(1)</script>`, `"><script>alert(1)</script>`,
|
||
`'><img src=x onerror=alert(1)>`, `<img src=x onerror=alert(1)>`,
|
||
`javascript:alert(1)`, `"><svg onload=alert(1)>`,
|
||
}
|
||
|
||
var pathTraversalProbes = []string{
|
||
`../`, `../../`, `../../../etc/passwd`,
|
||
`..\..\..\windows\win.ini`, `%2e%2e%2f`, `....//....//etc/passwd`,
|
||
}
|