SameSite=Strict ก็ไม่รอด! เผยกลโกง CSRF ด้วยเทคนิค Redirect ฝั่ง Client

SameSite=Strict ก็ไม่รอด! เผยกลโกง CSRF ด้วยเทคนิค Redirect ฝั่ง Client

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

เพื่อป้องกันภัยนี้ SameSite คุกกี้จึงถูกนำมาใช้เป็นเกราะป้องกัน ช่วยควบคุมการส่งคุกกี้พร้อมคำขอ

SameSite=Strict: เกราะป้องกันที่เข้มงวดที่สุด?

SameSite=Strict คือการตั้งค่าที่เข้มงวดที่สุด คุกกี้ที่มีแอตทริบิวต์นี้จะถูกส่งไปพร้อมกับคำขอเมื่อต้นทางของคำขอ (origin) ตรงกับเว็บไซต์ปัจจุบันที่เบราว์เซอร์กำลังเยี่ยมชมอยู่เท่านั้น

พูดง่ายๆ คือ ถ้าเราเข้าเว็บไซต์ A อยู่ แล้วมีลิงก์พาไปเว็บไซต์ B คุกกี้ของเว็บไซต์ A ที่ตั้งค่าเป็น SameSite=Strict จะไม่ถูกส่งไปพร้อมกับคำขอใดๆ ที่มาจาก B เลย

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

ช่องโหว่ที่ซ่อนอยู่: เมื่อ Redirect กลายเป็นจุดอ่อน

แม้ SameSite=Strict จะดูมั่นคง แต่ในบางสถานการณ์ก็ยังสามารถถูกเลี่ยงผ่านไปได้ โดยเฉพาะเมื่อเว็บไซต์เป้าหมายมีการใช้เทคนิค Client-side Redirect หรือการเปลี่ยนเส้นทางฝั่งผู้ใช้งานอย่างไม่ระมัดระวัง

กลโกงนี้จะใช้ประโยชน์จากพฤติกรรมของเบราว์เซอร์และการออกแบบการเปลี่ยนเส้นทางบนเว็บไซต์เป้าหมาย

กลโกงการเปลี่ยนเส้นทาง: เบื้องหลังการโจมตี

การโจมตีด้วย Client-side Redirect เริ่มเมื่อผู้โจมตีชักชวนให้เหยื่อเข้าชมหน้าเว็บที่สร้างขึ้นมา

บนหน้าเว็บผู้โจมตีจะมีโค้ด JavaScript สั่งให้เบราว์เซอร์เหยื่อเปลี่ยนเส้นทางไปยัง URL หนึ่งบนเว็บไซต์เป้าหมายทันที เช่น หน้าเข้าสู่ระบบ

เมื่อเบราว์เซอร์เหยื่อถูกเปลี่ยนเส้นทางไปยังเว็บไซต์เป้าหมายในครั้งแรก คุกกี้ที่มี SameSite=Strict จะ ไม่ ถูกส่งไปพร้อมกับคำขอแรกนั้น เพราะเป็นการนำทางข้ามโดเมน

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

การเปลี่ยนเส้นทางที่เกิดขึ้นภายในเว็บไซต์เป้าหมาย (จากหน้า Login ไปยังหน้า Profile หรือหน้าดำเนินการ) ถือเป็นการนำทางภายในโดเมนเดียวกัน

และตรงจุดนี้เองที่สำคัญ: เบราว์เซอร์จะส่งคุกกี้ที่มี SameSite=Strict ไปด้วย!

หากหน้าปลายทางของการเปลี่ยนเส้นทางภายในนี้เป็นหน้าที่มีการดำเนินการที่ละเอียดอ่อน และสามารถถูกเรียกได้ด้วยคำขอแบบ GET ผู้โจมตีก็สามารถกำหนด URL ตั้งแต่แรกให้รวมพารามิเตอร์ของคำสั่งที่ต้องการโจมตีได้

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

เงื่อนไขที่เอื้อต่อการโจมตี

การโจมตีนี้จะประสบความสำเร็จได้ต้องอาศัยปัจจัยหลักคือ:

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

ป้องกันตัวเองจากการโจมตี

การพึ่งพาแค่ SameSite=Strict อย่างเดียวอาจไม่เพียงพอ นักพัฒนาควรใช้ CSRF Token สำหรับคำขอที่มีผลกระทบทุกชนิด ทั้ง GET หรือ POST โดยเฉพาะฟังก์ชันที่เปลี่ยนแปลงข้อมูลสำคัญ

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

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