65 lines
2.1 KiB
Go
65 lines
2.1 KiB
Go
package payload
|
||
|
||
import "strings"
|
||
|
||
// SmartSuggest возвращает имена заготовок (см. Preset), отсортированные
|
||
// по релевантности для параметра с именем paramName. Это эвристика по
|
||
// подстрокам в имени — тот же принцип, что и "умная" генерация в Burp:
|
||
// там это тоже не ИИ, а сопоставление по имени/типу параметра, просто
|
||
// более развитое. Если контекст не распознан, возвращает разведочный
|
||
// набор общего назначения вместо пустого списка — так вызывающему коду
|
||
// не нужно отдельно обрабатывать случай "ничего не найдено".
|
||
func SmartSuggest(paramName string) []string {
|
||
name := strings.ToLower(paramName)
|
||
var suggestions []string
|
||
|
||
add := func(names ...string) {
|
||
suggestions = append(suggestions, names...)
|
||
}
|
||
|
||
if containsAny(name, "id", "num", "count", "page", "offset", "limit") {
|
||
add("numbers-small", "numbers-large")
|
||
}
|
||
if containsAny(name, "user", "login", "account") {
|
||
add("common-usernames")
|
||
}
|
||
if containsAny(name, "pass", "pwd", "secret") {
|
||
add("common-passwords")
|
||
}
|
||
if containsAny(name, "search", "query", "comment", "message", "name", "text") {
|
||
add("xss-probes", "sqli-probes")
|
||
}
|
||
if containsAny(name, "file", "path", "dir", "folder", "template", "include") {
|
||
add("path-traversal")
|
||
}
|
||
if containsAny(name, "token", "session", "key", "code") {
|
||
add("alnum")
|
||
}
|
||
|
||
if len(suggestions) == 0 {
|
||
add("sqli-probes", "xss-probes", "numbers-small")
|
||
}
|
||
|
||
return dedupe(suggestions)
|
||
}
|
||
|
||
func containsAny(s string, subs ...string) bool {
|
||
for _, sub := range subs {
|
||
if strings.Contains(s, sub) {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
|
||
func dedupe(in []string) []string {
|
||
seen := make(map[string]bool, len(in))
|
||
out := make([]string, 0, len(in))
|
||
for _, s := range in {
|
||
if !seen[s] {
|
||
seen[s] = true
|
||
out = append(out, s)
|
||
}
|
||
}
|
||
return out
|
||
}
|