
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 ภายในเว็บไซต์อย่างรอบคอบ เพื่อไม่ให้มีการเปลี่ยนเส้นทางไปยังฟังก์ชันที่เปลี่ยนแปลงสถานะโดยตรงหลังการนำทางจากภายนอก
การทำความเข้าใจกลไกและช่องโหว่เหล่านี้ จะช่วยให้การออกแบบระบบมีความปลอดภัยมากขึ้น และปกป้องผู้ใช้งานจากภัยคุกคามในโลกออนไลน์ได้อย่างมีประสิทธิภาพ.