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 เดียวกันจึงไม่เป็นปัญหา ข้อเสนอแนะใด ๆ ? ขอบคุณ

คำตอบ:


147

เว็บไซต์มีแนวโน้มที่จะใช้คุกกี้เพื่อจัดเก็บข้อมูลเซสชันของคุณ เมื่อคุณเรียกใช้

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

curlถูกเรียกใช้สองครั้งในสองเซสชันแยกกัน ดังนั้นเมื่อคำสั่งที่สองทำงานคุกกี้ที่กำหนดโดยคำสั่งที่ 1 จะไม่พร้อมใช้งาน เหมือนกับว่าคุณลงชื่อเข้าใช้เพจaในเซสชันเบราว์เซอร์หนึ่งและพยายามเข้าถึงเพจbในเซสชันอื่น

สิ่งที่คุณต้องทำคือบันทึกคุกกี้ที่สร้างโดยคำสั่งแรก:

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

จากนั้นอ่านกลับในเมื่อเรียกใช้วินาที:

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

หรือคุณสามารถลองดาวน์โหลดทั้งสองไฟล์ด้วยคำสั่งเดียวกันซึ่งฉันคิดว่าจะใช้คุกกี้เดียวกัน


นี่เป็นเรื่องแปลกเพราะเมื่อฉันลองสิ่งนี้มันไม่ทำงานเนื่องจากคุกกี้ที่เก็บไว้ในsomefileมีพารามิเตอร์เส้นทาง ( /aในกรณีนี้) และจะไม่ถูกส่งต่อไปยังการโทรครั้งที่สอง หากฉันแก้ไขคุกกี้ในไฟล์และใส่เฉพาะสแลชมันก็ใช้ได้ (คุกกี้ถูกส่งต่อไปยังสายที่สอง) คุณทราบหรือไม่ว่าเป็นไปได้หรือไม่ที่จะป้องกันการจัดเก็บเส้นทางในไฟล์คุกกี้
рüффп

124

นอกจากนี้คุณอาจต้องการเข้าสู่ระบบผ่านเบราว์เซอร์และรับคำสั่งพร้อมส่วนหัวทั้งหมดรวมถึงคุกกี้:

เปิดแท็บเครือข่ายของเครื่องมือสำหรับนักพัฒนาเข้าสู่ระบบไปที่หน้าที่ต้องการใช้ "คัดลอกเป็น cURL"

ภาพหน้าจอ


12
นี่คือคำตอบที่ลึกซึ้ง! มันไม่ได้ตอบคำถามโดยตรงเพราะมันแสดงให้เห็นว่าจะตอบอย่างไร
bgStack15

5
นั่นคือหนึ่งในคำตอบที่มีประโยชน์ที่สุด ช่วยให้คุณสังเกตและเข้าใจแม้กระทั่งการรับรองความถูกต้องแบบหลายขั้นตอน
Pierre D

ฉันไม่รู้เกี่ยวกับคุณลักษณะนี้ที่ฝังอยู่ในเครื่องมือที่ยอดเยี่ยมเหล่านั้น มีประโยชน์สุด ๆ !
Timothy C. Quinn

52

หลังจาก googling ฉันพบสิ่งนี้:

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

คำตอบของฉันคือ mod ของคำตอบก่อนหน้านี้จาก @JoeMills และ @user

  1. รับคำcURLสั่งเพื่อเข้าสู่เซิร์ฟเวอร์:

    • โหลดหน้าเข้าสู่ระบบสำหรับเว็บไซต์และเปิดบานหน้าต่างเครือข่ายของเครื่องมือสำหรับนักพัฒนา
      • ใน firefox คลิกขวาที่หน้าเลือก 'Inspect Element (Q)' และคลิกที่แท็บ Network
    • ไปที่แบบฟอร์มเข้าสู่ระบบป้อนชื่อผู้ใช้รหัสผ่านและเข้าสู่ระบบ
    • หลังจากคุณเข้าสู่ระบบแล้วให้กลับไปที่บานหน้าต่างเครือข่ายและเลื่อนไปด้านบนเพื่อค้นหารายการ POST คลิกขวาและเลือก Copy -> Copy as CURL
    • วางสิ่งนี้ลงในโปรแกรมแก้ไขข้อความแล้วลองทำในพรอมต์คำสั่งเพื่อดูว่าใช้งานได้หรือไม่
      • เป็นไปได้ว่าบางเว็บไซต์มีการปิดกั้นการปลอมแปลงการเข้าสู่ระบบประเภทนี้ซึ่งจะต้องใช้ขั้นตอนเพิ่มเติมด้านล่างเพื่อข้าม
  2. แก้ไขคำสั่ง cURL เพื่อให้สามารถบันทึกคุกกี้เซสชันหลังจากล็อกอิน

    • ลบรายการ -H 'Cookie: <somestuff>'
    • เพิ่มหลังจากcurlที่จุดเริ่มต้น-c login_cookie.txt
    • ลองเรียกใช้คำสั่ง curl ที่อัปเดตแล้วคุณจะได้ไฟล์ใหม่'login_cookie.txt'ในโฟลเดอร์เดียวกัน
  3. เรียกหน้าเว็บใหม่โดยใช้คุกกี้ใหม่นี้ซึ่งคุณต้องเข้าสู่ระบบ

    • curl -b login_cookie.txt <url_that_requires_log_in>

ฉันได้ลองใช้กับ Ubuntu 20.04 แล้วและมันก็ใช้งานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.