Cross Site Request Forgery (CSRF) คืออะไร

Watchanon Numnam
2 min readOct 11, 2021
https://pixabay.com/

ขอลองเล่าเรื่องราวสุดคลาสสิคอันหนึ่งก่อนละกันในการพัฒนาระบบการโอนเงินของธนาคารแห่งหนึ่ง

Transfer money flow

เริ่มต้นจากที่ ลูกค้าทำการล็อกอิน เมื่อล็อกอินสำเร็จเว็บไซต์ก็จะทำการเก็บ session-id ไว้ใน Cookie เพื่อนำไปใช้ในการเรียกหน้าต่อไป

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

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

ทุกอย่างดูเหมือนว่าจะเป็นเรื่องปกติ เพราะว่า API การโอนเงินของเรานั้นมีการเช็ค User-Session เพื่อป้องกันการโอนเงินจากลูกค้าที่ไม่ได้มีการล็อกอินอยู่แล้ว

money transfer at bank.com

แล้วมันผิดปกติตรงไหนหละ

สังเกตุไหมครับว่าถ้าหลังจากที่เราล็อกอินแล้ว ระบบจะเก็บ Session ของเราไว้จนกว่าจะหมดอายุ และฝั่งหน้าบ้านก็จะเก็บ Session ของเราไว้ใน Cookie เช่นกัน

ถ้าเกิดมี Attacker สามารถนำ Session ของเราไปใช้ได้ในขั้นตอนการโอนเงินที่ (3) และใส่เลขที่บัญชีไปเป็นของ Attacker เองนั่นหมายความว่าเงินของเราก็จะโดนโอนไปที่เลขที่บัญชีของ Attacker ได้เลย

ด้วยการหลอกให้ User ทำการคลิ๊กลิ้งจากอีเมล หรือหลอกให้เราเข้าเว็ปไซต์

เมื่อ Attacker สามารถหลอกให้ User เข้ามาใช้งานเพื่อให้ Execute attacker script จาก Browser ที่เรามี Cookie อยู่ โดยจะใช้ User-Session ของเราทำการ Transfer money ไปยังระบบหลังบ้านของ Bank ได้ทันที

วิธีการป้องกันที่ไม่ค่อยจะ Work!

  • ใช้ secret cookie แต่โดยปกติแล้วทุกๆ Request มันก็ส่ง cookie ไปทุกตัวอยู่แล้วนะ
  • อนุญาติเฉพาะ HTTP POST อาจจะคิดว่าใช้ POST ก็จะปลอม request ไม่ได้ แต่จริงๆมันก็ยังทำได้ตามตัวอย่างนี้
malicious websites
  • Multi-step transaction แต่ถ้า Attacker สามารถ Predict แล้ Reduce step ลงมาได้ก็จะโจมตีได้อยู่ดี
  • URL Rewrite คือไม่ใช้ cookie แต่เอา session-id มาไว้ที่ URL เลย http://bank.com/${session-id}/transfer ดูเหมือนว่าจะเป็นวิธีที่นิยมใช้ ตราบใดที่ Attacker ไม่สามารถ Predict session-id ได้ แต่มันก็ทำให้ session-id ไปอยู่ใน URL และ โดนเก็บ log ใน gateway ต่างๆนะ (รวมถึง public gateway) ? รวมถึงมันอาจจะนำไปสู่ session hijacking vulnerabilities (a man-in-the-middle sniffs the session identifier out of the URL) ได้อีก
  • HTTPS หรอ มันไม่เกี่ยวอะไรเลย

--

--