Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
jsluice — Извлечение URL-адресов, путей, секретов и других интересных данных из JavaScript | Kitploit
Инструменты/GitHubGitHub/bishopfox/jsluice
Статический анализАнализ КодаСбор информацииВеб-безопасностьТестирование на ПроникновениеОбнаружение Секретов
GitHubbishopfox/jsluice

jsluice

Извлечение URL-адресов, путей, секретов и других интересных данных из JavaScript

Репозиторий
1.9k1452 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

jsluice

Go Reference

jsluice — это Go-пакет и инструмент командной строки для извлечения URL-адресов, путей, секретов и других интересных данных из исходного кода JavaScript.

Если вы хотите делать это сразу: посмотрите инструмент командной строки.

Если вы хотите интегрировать возможности jsluice в свой проект: посмотрите примеры и прочитайте документацию пакета.

Установка

Чтобы установить инструмент командной строки, выполните:

root@kitploit:~
▶ go install github.com/BishopFox/jsluice/cmd/jsluice@latest

Чтобы добавить пакет в свой проект, выполните:

root@kitploit:~
▶ go get github.com/BishopFox/jsluice

Извлечение URL-адресов

Вместо использования только регулярных выражений jsluice применяет go-tree-sitter для поиска мест, где, как известно, используются URL-адреса, например при присваивании document.location, передаче в window.open() или fetch() и т. д.

Простая примерная программа приведена здесь:

root@kitploit:~
analyzer := jsluice.NewAnalyzer([]byte(`
    const login = (redirect) => {
        document.location = "/login?redirect=" + redirect + "&method=oauth"
    }
`))

for _, url := range analyzer.GetURLs() {
    j, err := json.MarshalIndent(url, "", "  ")
    if err != nil {
        continue
    }

    fmt.Printf("%s\n", j)
}

Запуск примера:

root@kitploit:~
▶ go run examples/basic/main.go
{
  "url": "/login?redirect=EXPR\u0026method=oauth",
  "queryParams": [
    "method",
    "redirect"
  ],
  "bodyParams": [],
  "method": "GET",
  "type": "locationAssignment",
  "source": "document.location = \"/login?redirect=\" + redirect + \"\u0026method=oauth\""
}

Обратите внимание, что значение параметра redirect в строке запроса равно EXPR. Такой код часто встречается в JavaScript:

root@kitploit:~
document.location = "/login?redirect=" + redirect + "&method=oauth"

jsluice понимает конкатенацию строк и заменяет любые выражения, значение которых не может определить, на EXPR. Хотя это и не идеальное решение, такой подход чаще всего даёт корректный URL или путь и позволяет обнаруживать то, что трудно найти другими способами. В данном случае наивное регулярное выражение вполне может пропустить параметр method в строке запроса:

root@kitploit:~
▶ JS='document.location = "/login?redirect=" + redirect + "&method=oauth"'
▶ echo $JS | grep -oE 'document\.location = "[^"]+"'
document.location = "/login?redirect="

Пользовательские URL-матчеры

jsluice поставляется с несколькими встроенными URL-матчерами для типовых сценариев, но вы можете добавить свои с помощью функции AddURLMatcher:

root@kitploit:~
analyzer := jsluice.NewAnalyzer([]byte(`
    var fn = () => {
        var meta = {
            contact: "mailto:[email protected]",
            home: "https://example.com"
        }
        return meta
    }
`))

analyzer.AddURLMatcher(
    // The first value in the jsluice.URLMatcher struct is the type of node to look for.
    // It can be one of "string", "assignment_expression", or "call_expression"
    jsluice.URLMatcher{"string", func(n *jsluice.Node) *jsluice.URL {
        val := n.DecodedString()
        if !strings.HasPrefix(val, "mailto:") {
            return nil
        }

        return &jsluice.URL{
            URL:  val,
            Type: "mailto",
        }
    }},
)

for _, match := range analyzer.GetURLs() {
    fmt.Println(match.URL)
}

Копия этого примера находится здесь. Вы можете запустить его так:

root@kitploit:~
▶ go run examples/urlmatcher/main.go
mailto:[email protected]
https://example.com

jsluice по умолчанию не сопоставляет URI mailto:; этот адрес был найден пользовательским URLMatcher.

Извлечение секретов

Помимо URL-адресов, jsluice умеет извлекать секреты. Как и при извлечении URL, можно задавать пользовательские матчеры в дополнение к стандартным. Короткая примерная программа, которая как раз это делает, находится здесь:

root@kitploit:~
analyzer := jsluice.NewAnalyzer([]byte(`
    var config = {
        apiKey: "AUTH_1a2b3c4d5e6f",
        apiURL: "https://api.example.com/v2/"
    }
`))

analyzer.AddSecretMatcher(
    // The first value in the jsluice.SecretMatcher struct is a
    // tree-sitter query to run on the JavaScript source.
    jsluice.SecretMatcher{"(pair) @match", func(n *jsluice.Node) *jsluice.Secret {
        key := n.ChildByFieldName("key").DecodedString()
        value := n.ChildByFieldName("value").DecodedString()

        if !strings.Contains(key, "api") {
            return nil
        }

        if !strings.HasPrefix(value, "AUTH_") {
            return nil
        }

        return &jsluice.Secret{
            Kind: "fakeApi",
            Data: map[string]string{
                "key":   key,
                "value": value,
            },
            Severity: jsluice.SeverityLow,
            Context:  n.Parent().AsMap(),
        }
    }},
)

for _, match := range analyzer.GetSecrets() {
    j, err := json.MarshalIndent(match, "", "  ")
    if err != nil {
        continue
    }

    fmt.Printf("%s\n", j)
}

Запуск примера:

root@kitploit:~
▶ go run examples/secrets/main.go
[2023-06-14T13:04:16+0100]
{
  "kind": "fakeApi",
  "data": {
    "key": "apiKey",
    "value": "AUTH_1a2b3c4d5e6f"
  },
  "severity": "low",
  "context": {
    "apiKey": "AUTH_1a2b3c4d5e6f",
    "apiURL": "https://api.example.com/v2/"
  }
}

Благодаря наличию дерева синтаксиса для всего исходного кода JavaScript можно было проверить и key, и value, а также легко передать родительский объект в качестве контекста совпадения.

Скачать инструмент