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{
``, `">`,
`'>`, ``,
`javascript:alert(1)`, `">