FixVibe
Covered by FixVibehigh

การป้องกัน CSRF: การป้องกันการเปลี่ยนแปลงสถานะที่ไม่ได้รับอนุญาต

การปลอมแปลงคำขอข้ามไซต์ (CSRF) ยังคงเป็นภัยคุกคามที่สำคัญต่อเว็บแอปพลิเคชัน งานวิจัยนี้สำรวจว่าเฟรมเวิร์กสมัยใหม่อย่าง Django ใช้การป้องกันอย่างไร และคุณลักษณะระดับเบราว์เซอร์อย่าง SameSite ให้การป้องกันในเชิงลึกต่อคำขอที่ไม่ได้รับอนุญาตอย่างไร

CWE-352

ผลกระทบ

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

ต้นเหตุ

สาเหตุพื้นฐานของ CSRF คือพฤติกรรมเริ่มต้นของเว็บเบราว์เซอร์ในการส่งคุกกี้ที่เชื่อมโยงกับโดเมนทุกครั้งที่มีการร้องขอไปยังโดเมนนั้น โดยไม่คำนึงถึงต้นกำเนิดของคำขอ [S1] หากไม่มีการตรวจสอบเฉพาะเจาะจงว่าคำขอถูกกระตุ้นโดยเจตนาจากอินเทอร์เฟซผู้ใช้ของแอปพลิเคชันเอง เซิร์ฟเวอร์ก็ไม่สามารถแยกแยะระหว่างการดำเนินการของผู้ใช้ที่ถูกต้องกับการดำเนินการของผู้ใช้ปลอมได้

กลไกการป้องกัน Django CSRF

Django มีระบบป้องกันในตัวเพื่อลดความเสี่ยงเหล่านี้ผ่านการรวมมิดเดิลแวร์และเทมเพลต [S2]

การเปิดใช้งานมิดเดิลแวร์

django.middleware.csrf.CsrfViewMiddleware รับผิดชอบการป้องกัน CSRF และโดยทั่วไปจะเปิดใช้งานโดยค่าเริ่มต้น [S2] จะต้องวางตำแหน่งก่อนมิดเดิลแวร์มุมมองใดๆ ที่ถือว่าการโจมตี CSRF ได้รับการจัดการแล้ว [S2]

การใช้งานเทมเพลต

สำหรับแบบฟอร์ม POST ภายในใดๆ นักพัฒนาจะต้องรวมแท็ก {% csrf_token %} ไว้ในองค์ประกอบ <form> [S2] เพื่อให้แน่ใจว่าโทเค็นลับที่ไม่ซ้ำกันจะรวมอยู่ในคำขอ ซึ่งเซิร์ฟเวอร์จะตรวจสอบกับเซสชันของผู้ใช้

ความเสี่ยงการรั่วไหลของโทเค็น

รายละเอียดการใช้งานที่สำคัญคือไม่ควรรวม {% csrf_token %} ในรูปแบบที่กำหนดเป้าหมาย URL ภายนอก ZXCVFIXVIBTOKEN1ZXCV การทำเช่นนี้จะทำให้โทเค็น CSRF ลับรั่วไหลไปยังบุคคลที่สาม ซึ่งอาจส่งผลต่อความปลอดภัยของเซสชันของผู้ใช้ [S2]

การป้องกันระดับเบราว์เซอร์: คุกกี้ SameSite

เบราว์เซอร์สมัยใหม่ได้แนะนำคุณลักษณะ SameSite สำหรับส่วนหัว Set-Cookie เพื่อจัดเตรียมชั้นของการป้องกันในเชิงลึก ZXCVFIXVIBTOKEN2ZXCV

  • เข้มงวด: คุกกี้จะถูกส่งเฉพาะในบริบทของบุคคลที่หนึ่งเท่านั้น ซึ่งหมายความว่าไซต์ในแถบ URL ตรงกับโดเมนของคุกกี้ [S1]
  • Lax: คุกกี้จะไม่ถูกส่งไปยังคำขอย่อยข้ามไซต์ (เช่น รูปภาพหรือเฟรม) แต่จะถูกส่งเมื่อผู้ใช้นำทางไปยังไซต์ต้นทาง เช่น โดยไปตามลิงก์มาตรฐาน [S1]

วิธีทดสอบ FixVibe

ขณะนี้ FixVibe มีการป้องกัน CSRF เป็นการตรวจสอบแบบมีรั้วรอบขอบชิด หลังจากการตรวจสอบโดเมนแล้ว active.csrf-protection จะตรวจสอบแบบฟอร์มที่มีการเปลี่ยนแปลงสถานะที่ค้นพบ ตรวจสอบอินพุตรูปโทเค็น CSRF และสัญญาณคุกกี้ SameSite จากนั้นพยายามส่งแหล่งกำเนิดปลอมแปลงที่มีผลกระทบต่ำ และรายงานเฉพาะเมื่อเซิร์ฟเวอร์ยอมรับเท่านั้น การตรวจสอบคุกกี้ยังทำเครื่องหมายแอตทริบิวต์ SameSite ที่อ่อนแอซึ่งจะลดการป้องกันเชิงลึกของ CSRF