แบบฟอร์มข้ามโดเมน POSTing


145

ฉันเคยเห็นบทความและโพสต์ทั่ว (รวมถึง SO) ในหัวข้อนี้และความเห็นที่แพร่หลายคือนโยบายต้นกำเนิดเดียวกันป้องกันฟอร์ม POST ข้ามโดเมน คนเพียงสถานที่ที่ผมเคยเห็นชี้ให้เห็นว่านโยบายเดียวกันแหล่งกำเนิดไม่ได้นำไปใช้กับรูปแบบการโพสต์อยู่ที่นี่

ฉันต้องการคำตอบจาก "ทางการ" หรือแหล่งข้อมูลทางการ ตัวอย่างเช่นไม่มีใครรู้ RFC ที่ระบุว่ามีต้นกำเนิดเดียวกันหรือไม่มีผลต่อฟอร์ม POST หรือไม่

คำชี้แจง : ฉันไม่ได้ถามว่าสามารถสร้าง GET หรือ POST และส่งไปยังโดเมนใด ๆ ได้หรือไม่ ฉันกำลังถาม:

  1. ถ้า Chrome, IE หรือ Firefox จะอนุญาตเนื้อหาจากโดเมน 'Y' เพื่อส่ง POST ไปยังโดเมน 'X'
  2. ถ้าเซิร์ฟเวอร์ที่รับ POST จะเห็นค่าฟอร์มใด ๆ เลย ฉันพูดแบบนี้เพราะส่วนใหญ่ของการสนทนาออนไลน์บันทึกผู้ทดสอบบอกว่าเซิร์ฟเวอร์ได้รับการโพสต์ แต่ค่าแบบฟอร์มทั้งหมดว่าง / ถอดออก
  3. เอกสารอย่างเป็นทางการใด ๆ (เช่น RFC) อธิบายว่าพฤติกรรมที่คาดหมายคืออะไร (ไม่ว่าเบราว์เซอร์ใดบ้างที่นำไปใช้งานในปัจจุบัน)

อนึ่งหากแหล่งกำเนิดเดียวกันไม่ส่งผลกระทบต่อแบบฟอร์มโพสต์ - แล้วมันทำให้ค่อนข้างชัดเจนว่าทำไมโทเค็นต่อต้านการปลอมแปลงจึงมีความจำเป็น ฉันพูดว่า "ค่อนข้าง" เพราะดูเหมือนว่าง่ายเกินไปที่จะเชื่อว่าผู้โจมตีสามารถออก HTTP GET เพื่อดึงฟอร์มที่มีโทเค็นต่อต้านการปลอมแปลงจากนั้นสร้าง POST ที่ไม่ถูกต้องซึ่งมีโทเค็นเดียวกันนั้น ความคิดเห็น?


ใช่ผู้โจมตีสามารถทำได้ ... ด้วยเว็บเบราว์เซอร์ทั่วไป
Michael Hampton

อาจไม่มี RFCs ด้วยเหตุผลเดียวกันกับที่ไม่มี RFC ที่พูดว่า: "อย่าโพสต์รหัสผ่านของคุณบนเว็บไซต์ของคุณ" มาตรฐานเว็บจำเป็นต้องมีก็ต่อเมื่อหลาย ๆ ฝ่ายต้องทำงานร่วมกันเพื่อให้บรรลุเป้าหมาย: นโยบายต้นกำเนิดเดียวกันนั้นเป็นชุดที่ซับซ้อนกว่าของ
Ciro Santilli 郝海东冠状病六四事件法轮功

@Ciro กรุณาพูดอย่างชัดเจน กฎสำหรับการข้ามโพสต์ไปยังเว็บไซต์อื่น ๆ จะไม่ส่งผลกระทบต่อหลายฝ่าย ไม่จำเป็นต้องพูดจาคลุมเครือ
Little Alien

คำตอบ:


175

นโยบายต้นกำเนิดเดียวกันใช้เฉพาะกับภาษาการเขียนโปรแกรมด้านเบราว์เซอร์ ดังนั้นหากคุณพยายามโพสต์ไปยังเซิร์ฟเวอร์ที่แตกต่างจากเซิร์ฟเวอร์ต้นทางโดยใช้ JavaScript นโยบายกำเนิดเดียวกันจะเข้ามาเล่น แต่ถ้าคุณโพสต์โดยตรงจากแบบฟอร์มนั่นคือแอ็คชันชี้ไปยังเซิร์ฟเวอร์อื่นเช่น:

<form action="http://someotherserver.com">

และไม่มีจาวาสคริปต์ที่เกี่ยวข้องกับการโพสต์แบบฟอร์มจากนั้นนโยบายต้นกำเนิดเดียวกันไม่สามารถใช้ได้

ดูวิกิพีเดียสำหรับข้อมูลเพิ่มเติม


18
ขออภัยที่จะลากคำถามเก่า ๆ จะเกิดอะไรขึ้นถ้าการกระทำนั้นเปลี่ยนไปโดยใช้ JS แต่แล้วแบบฟอร์มนั้นโพสต์โดยใช้ปุ่ม นั่นจะช่วยให้การโพสต์ข้ามโดเมนสำเร็จหรือไม่
Chris

AFAIK มันไม่ควรมีปัญหา แต่ฉันไม่ได้ลองด้วยตัวเอง จะน่าสนใจที่จะหา
Suresh Kumar

2
ฉันมีความคิดเดียวกัน จริง ๆ แล้วฉันมีความกังวลเกี่ยวกับความปลอดภัย JS / ไวรัสของบุคคลที่สามบางคนเปลี่ยนการกระทำเพื่อโพสต์แบบฟอร์มที่ไหนสักแห่งที่เป็นอันตราย แต่ตระหนักว่าสิ่งนี้สามารถทำได้ในรูปแบบการชำระเงินที่ได้รับข้ามโดเมนหรือไม่ บทเรียนที่นี่จริง ๆ : ตรวจสอบไฟล์ JS ของบุคคลที่สาม;)
Chris

20
กล่าวโดยย่อ: ใช่สามารถใช้ POSTing ข้ามโดเมนได้
Christian Davén

17
-1 สำหรับ: นโยบายต้นกำเนิดเดียวกันไม่มีส่วนเกี่ยวข้องกับการส่งคำขอไปยัง url อื่น (โปรโตคอลหรือโดเมนหรือพอร์ตที่แตกต่างกัน) เป็นเรื่องเกี่ยวกับการ จำกัด การเข้าถึง (อ่าน) ข้อมูลการตอบกลับจาก URL อื่น แบบฟอร์มที่มีโทเค็นความปลอดภัยจาก URL อื่น)
Mohsenme

43

เป็นไปได้ที่จะสร้างคำขอ GET หรือ POST โดยพลการและส่งไปยังเซิร์ฟเวอร์ใด ๆ ที่สามารถเข้าถึงเบราว์เซอร์ที่ตกเป็นเหยื่อ ซึ่งรวมถึงอุปกรณ์ในเครือข่ายท้องถิ่นของคุณเช่นเครื่องพิมพ์และเราเตอร์

มีหลายวิธีในการสร้างการใช้ประโยชน์จาก CSRF การโจมตี CSRF แบบ POST ที่ใช้งานง่ายสามารถส่งโดยใช้.submit()วิธีการ การโจมตีที่ซับซ้อนมากขึ้นเช่นข้ามไซต์อัปโหลดไฟล์การโจมตี CSRFจะใช้ประโยชน์จากใช้พฤติกรรม

CSRF ไม่ละเมิดนโยบายแหล่งกำเนิดเดียวกันสำหรับ JavaScrip t เนื่องจาก SOP เกี่ยวข้องกับ JavaScript ที่อ่านการตอบสนองของเซิร์ฟเวอร์ต่อคำขอของลูกค้า การโจมตี CSRF ไม่สนใจเกี่ยวกับการตอบสนองพวกเขาสนใจเกี่ยวกับผลข้างเคียงหรือการเปลี่ยนแปลงสถานะที่เกิดจากการร้องขอเช่นการเพิ่มผู้ใช้ที่เป็นผู้ดูแลระบบหรือการใช้รหัสโดยอำเภอใจบนเซิร์ฟเวอร์

ตรวจสอบให้แน่ใจร้องขอของคุณได้รับการคุ้มครองโดยใช้วิธีใดวิธีหนึ่งที่อธิบายไว้ในแผ่นป้องกัน OWASP CSRF โกง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ CSRF ปรึกษาหน้า OWASP บน CSRF


ฉันได้อัปเดตคำถามเพื่อชี้แจง นอกจากนี้ลิงก์ WordPress ที่คุณให้นั้นเกี่ยวข้องกับการหาประโยชน์ที่เริ่มต้นจากภายในจุดกำเนิด X เดียวกันแทนที่จะเริ่มจากข้ามโดเมน Y ... ดังนั้นจึงไม่ใช่สถานการณ์ที่ถูกต้องจากสิ่งที่ฉันเห็น
Brent Arias

@Brent Arias ใช่สิ่งที่คุณอธิบายใน 1 และ 2 นั้นเท่ากับการโจมตี CSRF ที่มีประสิทธิภาพบางทีคุณควรลองใช้งาน CSRF ที่เป็นประโยชน์อย่างใดอย่างหนึ่งที่จัดเตรียมไว้และสูดดมทราฟฟิก ฉันได้อัปเดตโพสต์แล้วคุณควรอ่านทุกลิงก์ที่มีให้เพราะจะตอบคำถามเหล่านี้ได้อย่างถูกต้อง จุดประสงค์ของการโจมตี "การปลอมแปลงคำขอข้ามไซต์" (CSRF) คือการร้องขอมาจากโดเมนอื่นการหาช่องโหว่ทั้งหมดที่จัดหาให้เป็นไปตามข้อกำหนดพื้นฐานนี้อย่างสมบูรณ์
Mikey

16

นโยบายต้นกำเนิดเดียวกันไม่มีส่วนเกี่ยวข้องกับการส่งคำขอไปยัง URL อื่น (โปรโตคอลหรือโดเมนหรือพอร์ตอื่น)

มันคือทั้งหมดที่เกี่ยวกับการ จำกัด การเข้าถึงข้อมูลการตอบสนอง (อ่าน) จาก url อื่น ดังนั้นโค้ด JavaScript ภายในหน้าสามารถโพสต์ไปยังโดเมนใดก็ได้หรือส่งแบบฟอร์มภายในหน้านั้นไปที่ใดก็ได้ (ยกเว้นว่าแบบฟอร์มนั้นอยู่ใน iframe ที่มี URL ต่างกัน)

แต่สิ่งที่ทำให้คำขอ POST เหล่านี้ไม่มีประสิทธิภาพคือคำขอเหล่านี้ไม่มีโทเค็นการป้องกันการสูญหายดังนั้น URL อื่นจึงถูกละเว้น นอกจากนี้หาก JavaScript พยายามรับโทเค็นการรักษาความปลอดภัยนั้นโดยส่งคำขอ AJAX ไปที่ URL ของเหยื่อมันจะถูกป้องกันไม่ให้เข้าถึงข้อมูลดังกล่าวโดยนโยบายแหล่งกำเนิดเดียวกัน

ตัวอย่างที่ดี: ที่นี่

และเอกสารที่ดีจาก Mozilla: ที่นี่

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