CURL, aby uzyskać dostęp do strony wymagającej logowania z innej strony

125

Mam 2 strony: xyz.com/ai xyz.com/b. Mam dostęp tylko xyz.com/bwtedy i tylko wtedy, gdy xyz.com/anajpierw się zaloguję. Jeśli uzyskuję dostęp xyz.com/bbez przechodzenia przez drugą stronę, po prostu otrzymuję odmowę dostępu (brak przekierowania do logowania) za pośrednictwem przeglądarki. Po zalogowaniu się xyz.com/amam dostęp do drugiego.

Mój problem polega na tym, że robię to za pomocą polecenia curl. Mogę pomyślnie zalogować się do programu xyz.com/acurl, ale wtedy próbuję xyx.com/buzyskać odmowę dostępu.

Używam następujących:

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

Próbowałem użyć drugiej linii z & bez części użytkownika / hasło i nadal nie działa. Obie strony używają tego samego urzędu certyfikacji, więc nie stanowi to problemu. Jakieś sugestie? Dzięki

ms1013
źródło

Odpowiedzi:

147

Witryna prawdopodobnie wykorzystuje pliki cookie do przechowywania informacji o sesji. Kiedy biegasz

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

curljest uruchamiany dwukrotnie, w dwóch oddzielnych sesjach. Zatem po uruchomieniu drugiego polecenia pliki cookie ustawione przez pierwsze polecenie nie są dostępne; to tak, jakbyś logował się na stronę aw jednej sesji przeglądarki i próbował uzyskać dostęp do strony bw innej.

To, co musisz zrobić, to zapisać pliki cookie utworzone przez pierwsze polecenie:

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

a następnie przeczytaj je ponownie podczas uruchamiania drugiego:

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

Alternatywnie możesz spróbować pobrać oba pliki za pomocą tego samego polecenia, które, jak sądzę, będzie używać tych samych plików cookie.

Ślimak mechaniczny
źródło
Jest to dziwne, ponieważ kiedy próbuję tego, nie działa, ponieważ plik cookie przechowywany w somefilezawiera parametr ścieżki ( /aw tym przypadku) i nie jest przekazywany do drugiego połączenia. Jeśli edytuję plik cookie w pliku i wstawię tylko ukośnik, to działa (plik cookie jest przekazywany do drugiego połączenia). Czy wiesz, czy można zapobiec przechowywaniu ścieżki w pliku cookie?
рüффп
124

Możesz również zalogować się przez przeglądarkę i otrzymać polecenie ze wszystkimi nagłówkami, w tym plikami cookie:

Otwórz kartę Sieć w Narzędziach dla programistów, zaloguj się, przejdź do potrzebnej strony, użyj opcji „Kopiuj jako cURL”.

zrzut ekranu

użytkownik
źródło
12
To głęboka odpowiedź! Nie odpowiada bezpośrednio na pytanie, ponieważ pokazuje, jak odpowiedzieć.
bgStack15
5
to jedna z najbardziej przydatnych odpowiedzi. To naprawdę pozwala obserwować i rozumieć nawet uwierzytelnianie wieloetapowe.
Pierre D,
Nie wiedziałem o tej funkcji ukrytej w tych niesamowitych narzędziach. Super przydatne!
Timothy C. Quinn
52

Po pewnym googlowaniu znalazłem to:

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

Nie mam pojęcia, czy to zadziała, ale może poprowadzić cię we właściwym kierunku.

Joe Mills
źródło
9
To zadziała, jeśli masz witrynę internetową, która oczekuje na przesłanie formularza. Będziesz musiał spojrzeć na źródło i znaleźć obraz <form> i zobaczyć, jaka jest nazwa pól i jaki adres URL ma zostać wysłany. Możesz użyć debugera przeglądarki internetowej, aby wyszukać żądanie wpisu, aby zobaczyć, co jest wysyłane. To jest trochę łatwiejsze.
Stonefury
0

Moja odpowiedź to modyfikacja niektórych wcześniejszych odpowiedzi od @JoeMills i @user.

  1. Uzyskaj cURLpolecenie zalogowania się do serwera:

    • Załaduj stronę logowania do serwisu WWW i otwórz panel Network w Narzędziach dla programistów
      • W przeglądarce Firefox, kliknij prawym przyciskiem myszy stronę, wybierz „Sprawdź element (Q)” i kliknij kartę Sieć
    • Przejdź do formularza logowania, wprowadź nazwę użytkownika, hasło i zaloguj się
    • Po zalogowaniu się wróć do okienka Sieć i przewiń do góry, aby znaleźć wpis POST. Kliknij prawym przyciskiem myszy i wybierz Kopiuj -> Kopiuj jako CURL
    • Wklej to do edytora tekstu i wypróbuj to w wierszu poleceń, aby sprawdzić, czy działa
      • Możliwe, że niektóre witryny mają zabezpieczenia, które blokują tego typu fałszowanie logowania, które wymagałoby więcej kroków poniżej, aby ominąć.
  2. Zmodyfikuj polecenie cURL, aby móc zapisać plik cookie sesji po zalogowaniu

    • Usuń wpis -H 'Cookie: <somestuff>'
    • Dodaj po curlna początku-c login_cookie.txt
    • Spróbuj uruchomić to zaktualizowane polecenie curl i powinieneś otrzymać nowy plik 'login_cookie.txt'w tym samym folderze
  3. Wywołaj nową stronę internetową za pomocą tego nowego pliku cookie, która wymaga zalogowania

    • curl -b login_cookie.txt <url_that_requires_log_in>

Wypróbowałem to na Ubuntu 20.04 i działa jak urok.

Timothy C. Quinn
źródło