Отправка HTTP-запросов по недопустимому пути в Golang - PullRequest
1 голос
/ 21 апреля 2020

У меня есть вопрос, в целях безопасности иногда очень полезно делать HTTP-запросы с недопустимыми путями, такими как: http://localhost/%x, в Golang кажется, что это не способ сделать это, может кто-нибудь пролить свет на эту проблему? Что я пробовал до сих пор: - функция .Get ()

response, err := http.DefaultClient.Get("http://localhost/%x")
if err != nil{
    panic(err) // net/url.EscapeError
}
  • .Do () функция
    requestObject, err := http.NewRequest("GET", "http://localhost/%x", nil)
    if err != nil {
        panic(err) // panics!
    }

И

    requestObject, err := http.NewRequest("GET", "http://localhost", nil)
    if err != nil {
        panic(err) // Not panic
    }
    requestObject.URL.Path = "/%x"
    response, err = netClient.goHttpClient.Do(requestObject)
    if err != nil {
        panic(err) // Not panic
    }

Этот последний выглядит многообещающе, но запрос сделан на %25x вместо %x, может кто-нибудь помочь, пожалуйста?

ОБНОВЛЕНИЕ : Go может отправить% x в запросе, в разделе запроса, но не в пути, я хочу отправить% x в пути, поэтому моя проблема не решена:

requestObject, err := http.NewRequest("GET", "http://localhost", nil)
    if err != nil {
        panic(err) // Not panic
    }
requestObject.URL.Path = "/%x"
requestObject.URL.RawQuery = "%x"

Запрос сделан на http://localhost/%25x?%x% x в пути закодирован, в запросе это не так.

ОБНОВЛЕНИЕ:
Ответ, данный @Cerise, является тем, который я использую, и он отлично работает, но есть крайние случаи, чтобы принять во внимание.
1 - Прокси-сервер: если вам по какой-то причине необходимо перенаправить запросы на прокси-сервер, каркас HTTP не знает, как отправлять HTTP-запросы, понятные вашему прокси-серверу, чтобы исправить это, в пакете Burp вы должны включите невидимый прокси, как описано здесь: https://portswigger.net/support/using-burp-suites-invisible-proxy-settings-to-test-a-non-proxy-aware-thick-client-application Это все еще имеет проблему, я заметил это, когда мне пришлось отлаживать некоторые HTTP-запросы, я не мог понять, о чем говорил мне Burp Suite, а затем проверял запросы в Wireshark Я знал, что что-то не так, если вы используете .Opaque + BurpSuite, BurpSuite изменит некоторые запросы, вот здесь вступает в игру вторая проблема, продолжайте читать.

2 - Opaque не обрабатывает ну, пути, начинающиеся с "//", я не думаю, что это ошибка, хотя хорошо известно, что { ссылка } также можно переписать как //stackoverflow.com, я думаю, что это logi c учитывается go, в любом случае, если вы делаете:

requestObject, err := http.NewRequest(methodStr, "http://localhost", nil)
requestObject.URL.Opaque = "//something"

Вот как выглядит HTTP-запрос с Wireshark:

GET http://something HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Language: en-US,en;q=0.9,ca;q=0.8
Cache-Control: no-cache
Connection: close
Pragma: no-cache
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip

обратите внимание на файл Первая строка, это не то, что мы можем иметь, хотя сначала, верно?

Я использовал для отладки HTTP-запросов с Burp Suite, но давайте использовать тот же код и перенаправить запросы на Burp с помощью:

http.DefaultTransport.(*http.Transport).Proxy = http.ProxyURL("http://localhost:8080")

Не забудьте включить невидимый прокси на BurpSuite, в противном случае он отклонит запрос. Burp Suite показывает:

GET / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Language: en-US,en;q=0.9,ca;q=0.8
Cache-Control: no-cache
Connection: close
Pragma: no-cache
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip, deflate

outch !!, Burp полностью изменил наш запрос !!! Выводы: - Не используйте HTTP-прокси для отладки запросов, выполненных с помощью Opaque. - Не используйте .Opaque с путями, начинающимися с двойной косой черты, используйте следующее:

       if strings.HasPrefix(yourPath, "//") {
            requestObject.URL.Path = fmt.Sprintf("%s", yourPath)
        } else {
            requestObject.URL.Opaque = fmt.Sprintf("%s", yourPath)
        }

1 Ответ

3 голосов
/ 21 апреля 2020

Установить Request.URL.Opaque на неверный путь. Данные Непрозрачный записываются в сеть как есть.

requestObject, err := http.NewRequest("GET", "http://localhost", nil)
if err != nil {
    panic(err) 
}
requestObject.URL.Opaque = "/%x"
response, err = netClient.goHttpClient.Do(requestObject)
if err != nil {
    panic(err)
}

Этот код создает неверный запрос. Сервер net / http обрабатывает неверный запрос, отвечая 400 неверным запросом. Другие серверы и прокси могут делать что-то другое.

Запустите его на детской площадке

...