CURL для доступа к странице, требующей входа в систему с другой страницы

125

У меня 2 страницы: xyz.com/aа xyz.com/b. Я могу получить доступ только xyz.com/bтогда и только тогда, когда я xyz.com/aсначала войду в систему . Если доступ осуществляется xyz.com/bбез прохождения другого, я просто получаю отказ в доступе (без перенаправления для входа в систему) через браузер. После входа в систему xyz.com/aя могу получить доступ к другому.

Моя проблема в том, чтобы сделать это с помощью команды curl. Я могу успешно войти в систему с xyz.com/aпомощью curl, но затем попытаюсь, xyx.com/bи мне будет отказано в доступе.

Я использую следующее:

curl --user user:pass https://xyz.com/a  #works ok
curl https://xyz.com/b #doesn't work

Я пробовал использовать вторую строку с & без части пользователя / пароля и все еще не работает. Обе страницы используют один и тот же CA, так что это не проблема. Какие-либо предложения? Спасибо

ms1013
источник

Ответы:

147

Веб-сайт, вероятно, использует файлы cookie для хранения информации о вашем сеансе. Когда ты бежишь

curl --user user:pass https://xyz.com/a  #works ok
curl https://xyz.com/b #doesn't work

curlвыполняется дважды в двух отдельных сеансах. Таким образом, когда выполняется вторая команда, файлы cookie, установленные первой командой, недоступны; это как если бы вы вошли на страницу aв одном сеансе браузера и попытались получить доступ к странице bв другом.

Что вам нужно сделать, так это сохранить файлы cookie, созданные первой командой:

curl --user user:pass --cookie-jar ./somefile https://xyz.com/a

а затем прочтите их при запуске второго:

curl --cookie ./somefile https://xyz.com/b

В качестве альтернативы вы можете попробовать загрузить оба файла в одной команде, которая, я думаю, будет использовать одни и те же файлы cookie.

Механическая улитка
источник
Это странно, потому что, когда я пытаюсь это сделать, это не работает, поскольку файл cookie, хранящийся в, somefileсодержит параметр пути ( /aв этом случае) и не перенаправляется на второй вызов. Если я отредактирую файл cookie в файле и поставлю только косую черту, он будет работать (файл cookie будет перенаправлен на второй вызов). Вы знаете, можно ли предотвратить сохранение пути в файле cookie?
рüффп 06
124

Также вы можете войти в систему через браузер и получить команду со всеми заголовками, включая файлы cookie:

Откройте вкладку «Сеть» в инструментах разработчика, войдите в систему, перейдите на нужную страницу, используйте «Копировать как cURL».

Скриншот

пользователь
источник
12
Это глубокий ответ! Он не дает прямого ответа на вопрос, потому что показывает, как на него ответить.
bgStack15
5
это один из самых полезных ответов. Это действительно позволяет вам наблюдать и понимать даже многоступенчатую аутентификацию.
Pierre D
Я не знал об этой функции, скрытой в этих потрясающих инструментах. Супер полезно!
Тимоти К. Куинн,
52

После некоторого поиска в Google я обнаружил это:

curl -c cookie.txt -d "LoginName=someuser" -d "password=somepass" https://oursite/a
curl -b cookie.txt https://oursite/b

Не знаю, работает ли это, но может привести вас в правильном направлении.

Джо Миллс
источник
9
Это будет работать, если у вас есть веб-сайт, который ожидает отправки формы. Вам нужно будет посмотреть на источник и найти изображение <form> и посмотреть, как называются поля и какой URL-адрес нужно опубликовать. Вы можете использовать отладчик своего веб-браузера для поиска почтового запроса, чтобы вы могли видеть, что отправляется. Это немного проще.
Stonefury
0

Мой ответ - это модификация некоторых предыдущих ответов @JoeMills и @user.

  1. Получите cURLкоманду для входа на сервер:

    • Загрузите страницу входа для веб-сайта и откройте сетевую панель инструментов разработчика.
      • В firefox щелкните страницу правой кнопкой мыши, выберите «Проверить элемент (Q)» и щелкните вкладку «Сеть».
    • Перейдите в форму входа, введите имя пользователя, пароль и войдите в систему
    • После входа в систему вернитесь на панель «Сеть» и прокрутите вверх, чтобы найти запись POST. Щелкните правой кнопкой мыши и выберите Копировать -> Копировать как CURL.
    • Вставьте это в текстовый редактор и попробуйте в командной строке, чтобы увидеть, работает ли он.
      • Возможно, на некоторых сайтах есть усиление, которое заблокирует этот тип подмены логина, для обхода которого потребуются дополнительные шаги, указанные ниже.
  2. Измените команду cURL, чтобы иметь возможность сохранять cookie сеанса после входа в систему

    • Удалить запись -H 'Cookie: <somestuff>'
    • Добавить после curlв начале-c login_cookie.txt
    • Попробуйте запустить эту обновленную команду curl, и вы должны получить новый файл 'login_cookie.txt'в той же папке.
  3. Вызов новой веб-страницы, используя этот новый файл cookie, который требует, чтобы вы вошли в систему

    • curl -b login_cookie.txt <url_that_requires_log_in>

Я пробовал это на Ubuntu 20.04, и это прекрасно работает.

Тимоти К. Куинн
источник