ทำความเข้าใจกับการโจมตี CSRF และปิดช่องโหว่ CSRF
เผยแพร่แล้ว: 2022-11-21ช่องโหว่ของเว็บมีอาละวาดและเพิ่มขึ้นอย่างต่อเนื่อง การรักษาความปลอดภัยและความเป็นส่วนตัวของผู้ใช้มีความสำคัญมากกว่าที่เคย การไม่จัดการกับช่องโหว่ของเว็บอาจทำให้เสียชื่อเสียงและถูกปรับจำนวนมากจากหน่วยงานกำกับดูแล และคุณจะสูญเสียความไว้วางใจของผู้ใช้ด้วย
เว็บไซต์และเว็บแอปพลิเคชันมีความเสี่ยงต่อมัลแวร์ สแปม และการโจมตีอื่นๆ — บทความนี้มุ่งเน้นไปที่เวกเตอร์การโจมตีประเภทหนึ่ง เช่น การโจมตีแบบ Cross-Site Request Forgery (CSRF) การโจมตี CSRF นั้นน่าหนักใจเป็นพิเศษเพราะสามารถเกิดขึ้นได้โดยที่ผู้ใช้ไม่รู้ตัว นอกจากนี้ยังเป็นเรื่องยากสำหรับนักพัฒนาซอฟต์แวร์หรือเจ้าของเว็บไซต์ที่จะตรวจจับได้ เนื่องจากคำขอที่เป็นอันตรายนั้นดูคล้ายกับคำขอของแท้อย่างมาก
บทความนี้จะสำรวจการโจมตี CSRF วิธีการทำงาน และขั้นตอนที่คุณสามารถทำได้เพื่อเตรียมพร้อมสำหรับการโจมตี
การโจมตี CSRF คืออะไร?
การโจมตีแบบ Cross-Site Request Forgery หรือที่เรียกว่าการโจมตีแบบ CSRF หลอกให้ผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ดำเนินการโดยไม่ได้ตั้งใจโดยการส่งคำขอที่เป็นอันตรายโดยที่พวกเขาไม่รู้ตัว
โดยทั่วไปแล้ว การโจมตี CSRF จะเกี่ยวข้องกับคำขอเปลี่ยนสถานะ เนื่องจากผู้โจมตีไม่ได้รับการตอบสนอง ตัวอย่างของคำขอดังกล่าว ได้แก่ การลบบันทึก การเปลี่ยนรหัสผ่าน การซื้อผลิตภัณฑ์ หรือการส่งข้อความ ทั้งหมดนี้สามารถเกิดขึ้นได้โดยที่ผู้ใช้ไม่ทราบ
ผู้โจมตีที่ประสงค์ร้ายมักใช้วิศวกรรมสังคมเพื่อส่งลิงก์ไปยังผู้ใช้ที่ไม่สงสัยผ่านการแชทหรืออีเมล
เมื่อผู้ใช้คลิกลิงก์ ผู้ใช้จะดำเนินการตามคำสั่งที่ผู้โจมตีตั้งไว้
ตัวอย่างเช่น การคลิกลิงก์สามารถโอนเงินจากบัญชีผู้ใช้ได้ หรือสามารถเปลี่ยนที่อยู่อีเมลของผู้ใช้เพื่อป้องกันไม่ให้เข้าถึงบัญชีได้อีกครั้ง
การโจมตี CSRF ทำงานอย่างไร
การให้ผู้ใช้เริ่มต้นคำขอเปลี่ยนสถานะในขณะที่เข้าสู่ระบบเป็นขั้นตอนแรกและสำคัญที่สุดในการโจมตี CSRF ด้วยการโจมตี CSRF ผู้โจมตีมีเป้าหมายเพื่อให้ผู้ใช้ที่ผ่านการรับรองความถูกต้องส่งคำขอเว็บที่เป็นอันตรายไปยังเว็บไซต์หรือเว็บแอปพลิเคชันโดยไม่รู้ตัว คำขอเหล่านี้อาจประกอบด้วยคุกกี้ พารามิเตอร์ URL และประเภทข้อมูลอื่นๆ ที่ปรากฏเป็นปกติสำหรับผู้ใช้
เพื่อให้การโจมตี CSRF ประสบความสำเร็จ จะต้องเกิดเงื่อนไขต่อไปนี้:
- ผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์จะต้องลงชื่อเข้าใช้เว็บแอปพลิเคชันที่ใช้คุกกี้สำหรับการจัดการเซสชัน
- ผู้โจมตีต้องสร้างคำขอปลอมแปลงสถานะ
- คำขอของแท้ที่จัดการโดยเซิร์ฟเวอร์เป้าหมายไม่ควรมีพารามิเตอร์ที่คาดเดาไม่ได้ ตัวอย่างเช่น คำขอไม่ควรคาดหวังรหัสผ่านเป็นพารามิเตอร์สำหรับวัตถุประสงค์ในการตรวจสอบก่อนที่จะเริ่มคำขอเปลี่ยนสถานะ
วิธีทั่วไปในการโจมตี CSRF ให้สำเร็จคือการใช้คุกกี้ในแอปพลิเคชันที่มีนโยบายคุกกี้ SameSite ที่อ่อนแอ เว็บเบราว์เซอร์รวมคุกกี้โดยอัตโนมัติและมักไม่ระบุตัวตน และบันทึกคุกกี้ที่ใช้โดยโดเมนในคำขอเว็บใดๆ ที่ผู้ใช้ส่งไปยังโดเมนนั้น
นโยบายคุกกี้ SameSite กำหนดวิธีที่เบราว์เซอร์ในบริบทการสืบค้นข้ามไซต์ปฏิบัติต่อคุกกี้ หากตั้งค่าเป็นแบบเข้มงวด คุกกี้จะไม่ถูกแชร์ในบริบทการเรียกดูข้ามไซต์ เพื่อป้องกันการโจมตี CSRF เบราว์เซอร์จะแนบคุกกี้ในบริบทข้ามไซต์ทั้งหมดหากตั้งค่าเป็นไม่มี ทำให้แอปพลิเคชันเสี่ยงต่อการโจมตี CSRF
เมื่อผู้ใช้ส่งคำขอที่เป็นอันตรายโดยไม่รู้ตัวผ่านเว็บเบราว์เซอร์ คุกกี้ที่บันทึกไว้จะทำให้คำขอนั้นดูเหมือนถูกต้องในเซิร์ฟเวอร์ จากนั้นเซิร์ฟเวอร์จะตอบกลับคำขอโดยเปลี่ยนบัญชีผู้ใช้ เปลี่ยนสถานะเซสชัน หรือส่งคืนข้อมูลที่ร้องขอ
มาดูตัวอย่างช่องทางการโจมตี CSRF สองตัวอย่างให้ละเอียดยิ่งขึ้น แบบหนึ่งใช้คำขอ GET และอีกแบบหนึ่งใช้คำขอ POST
CSRF สำหรับคำขอ GET
ขั้นแรก ให้พิจารณาคำขอ GET ที่ใช้โดยเว็บแอปพลิเคชันทางการเงินการธนาคาร ซึ่งการโจมตีใช้ประโยชน์จากคำขอ GET และการส่งไฮเปอร์ลิงก์
สมมติว่าคำขอ GET สำหรับการโอนเงินมีลักษณะดังนี้:
GET https://xymbank.com/online/transfer?amount=1000&accountNumber=547895 HTTP/1.1
ในคำขอของแท้ข้างต้น ผู้ใช้ขอให้โอนเงิน 1,000 ดอลลาร์ไปยังบัญชีที่มี 547895
เพื่อชำระค่าสินค้าที่ซื้อ
แม้ว่าคำขอนี้จะชัดเจน เรียบง่าย และใช้งานได้จริง แต่จะทำให้เจ้าของบัญชีถูกโจมตีด้วย CSRF นั่นเป็นเพราะคำขอไม่ต้องการรายละเอียดที่ผู้โจมตีอาจไม่ทราบ ดังนั้น เพื่อเริ่มต้นการโจมตี ผู้โจมตีเพียงแค่แก้ไขพารามิเตอร์ของคำขอนี้ (จำนวนเงินและหมายเลขบัญชี) เพื่อสร้างคำขอปลอมที่ปฏิบัติการได้
คำขอที่เป็นอันตรายจะมีผลกับผู้ใช้ของธนาคารตราบเท่าที่พวกเขามีเซสชันที่จัดการคุกกี้อย่างต่อเนื่อง
ต่อไปนี้คือลักษณะคำขอปลอมเพื่อโอนเงิน 500 ดอลลาร์ไปยังบัญชีของแฮ็กเกอร์ (ที่นี่ หมายเลข 654585
) จะมีลักษณะอย่างไร โปรดทราบว่าตัวอย่างด้านล่างเป็นเวอร์ชันที่ง่ายมากของขั้นตอนที่เกี่ยวข้องในการโจมตี CSRF สำหรับคำอธิบาย
GET https://xymbank.com/online/transfer?amount=500&accountNumber=654585 HTTP/1.1
เมื่อดำเนินการเสร็จสิ้น ผู้โจมตีจะต้องหาวิธีหลอกล่อให้ผู้ใช้ส่งคำขอนี้ในขณะที่ลงชื่อเข้าใช้แอปพลิเคชันธนาคารออนไลน์ของตน วิธีหนึ่งในการทำเช่นนี้คือการสร้างไฮเปอร์ลิงก์ที่ไม่เป็นอันตรายซึ่งดึงดูดความสนใจของผู้ใช้ ลิงค์อาจมีลักษณะดังนี้:
<a href="https://xymbank.com/online/transfer?amount=500&accountNumber=654585">Click here to get more information</a>.
เนื่องจากผู้โจมตีพบที่อยู่อีเมลที่ถูกต้องของเป้าหมาย พวกเขาสามารถส่งอีเมลนี้ไปยังลูกค้าธนาคารจำนวนมาก ผู้ที่คลิกลิงก์ในขณะที่เข้าสู่ระบบจะทำให้เกิดคำขอให้ส่งผู้โจมตี $500 จากบัญชีที่เข้าสู่ระบบ
CSRF สำหรับคำขอ POST
มาดูกันว่าสถาบันการเงินแห่งเดียวกันจะประสบกับ CSRF อย่างไร หากพวกเขายอมรับเฉพาะคำขอ POST ในกรณีนี้ การส่งไฮเปอร์ลิงก์ที่ใช้ในตัวอย่างคำขอ GET จะไม่ทำงาน ดังนั้น การโจมตี CSRF ที่ประสบความสำเร็จจะต้องให้ผู้โจมตีสร้างแบบฟอร์ม HTML คำขอของแท้ที่จะส่ง $1,000 สำหรับสินค้าที่ซื้อจะมีลักษณะดังนี้:
POST /online/transfer HTTP/1.1 Host: xymbank.com Content-Type: application/x-www-form-urlencoded Cookie: session=FRyhityeQkAPzeQ5gHgTvlyxHJYhg amount=1000 account=547895
คำขอ POST นี้ต้องการคุกกี้เพื่อระบุตัวตนของผู้ใช้ จำนวนเงินที่ต้องการส่ง และบัญชีที่ต้องการส่ง ผู้โจมตีสามารถแก้ไขคำขอนี้เพื่อทำการโจมตี CSRF
ผู้โจมตีจะต้องเพิ่มคุกกี้ของแท้ในคำขอปลอมเท่านั้นเพื่อให้เซิร์ฟเวอร์ดำเนินการถ่ายโอน พวกเขาสามารถทำได้โดยการสร้างไฮเปอร์ลิงก์ที่ดูไม่เป็นอันตรายซึ่งนำผู้ใช้ไปยังหน้าเว็บทริกเกอร์ที่มีลักษณะดังนี้:
<html> <body> <form action="https://xymbank.com/online/transfer" method="POST"> <input type="hidden" name="amount" value="500"/> <input type="hidden" name="account" value="654585" /> </form> <script> document.forms[0].submit(); </script> </body> </html>
เราได้ตั้งค่าพารามิเตอร์ของจำนวนเงินและบัญชีในแบบฟอร์มด้านบนแล้ว เมื่อผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์เข้าชมเพจ เบราว์เซอร์จะเพิ่มเซสชันคุกกี้ก่อนที่จะส่งต่อคำขอไปยังเซิร์ฟเวอร์ จากนั้นเซิร์ฟเวอร์จะส่งต่อ $500 ไปยังบัญชีของแฮ็กเกอร์
3 วิธีในการลดการโจมตี CSRF
มีหลายวิธีในการป้องกันและบรรเทาการโจมตี CSRF ที่อาจเกิดขึ้นบนเว็บไซต์หรือเว็บแอปพลิเคชันของคุณได้อย่างมาก รวมถึง:
- การใช้โทเค็น CSRF
- การใช้ส่วนหัวผู้อ้างอิง
- การเลือกโซลูชันโฮสติ้งที่เน้นความปลอดภัย เช่น Kinsta
วิธีป้องกันการโจมตี CSRF โดยใช้โทเค็น CSRF
เว็บไซต์ที่ปลอดภัยของ CSRF จะกำหนดโทเค็นที่ไม่ซ้ำกันให้กับแต่ละเซสชันและแชร์กับฝั่งเซิร์ฟเวอร์และเบราว์เซอร์ไคลเอนต์ เมื่อใดก็ตามที่เบราว์เซอร์ส่งคำขอที่ละเอียดอ่อน เซิร์ฟเวอร์คาดว่าคำขอนั้นจะมีโทเค็น CSRF ที่กำหนดไว้ หากมีโทเค็นที่ไม่ถูกต้อง เซิร์ฟเวอร์จะทิ้งโทเค็นนั้น โทเค็น CSRF ไม่ได้จัดเก็บไว้ในคุกกี้เซสชันบนเบราว์เซอร์ของไคลเอ็นต์เพื่อความปลอดภัย
ช่องโหว่ที่อาจเกิดขึ้นของโทเค็น CSRF
แม้ว่าโทเค็น CSRF จะเป็นมาตรการรักษาความปลอดภัยที่ยอดเยี่ยม แต่วิธีนี้ไม่สามารถป้องกันการโจมตีได้ ช่องโหว่บางส่วนที่มาพร้อมกับโทเค็น CSRF ได้แก่:
- บายพาสการตรวจสอบ — บางแอปพลิเคชันจะข้ามขั้นตอนการยืนยันหากไม่พบโทเค็น หากผู้โจมตีสามารถเข้าถึงโค้ดที่มีโทเค็นได้ พวกเขาสามารถลบโทเค็นนั้นและดำเนินการโจมตี CSRF ได้สำเร็จ ดังนั้น หากคำขอที่ถูกต้องไปยังเซิร์ฟเวอร์มีลักษณะดังนี้:
POST /change_password POST body: password=pass123&csrf_token=93j9d8eckke20d433
ผู้โจมตีต้องการเพียงลบโทเค็นและส่งสิ่งนี้เพื่อดำเนินการโจมตี:
POST /change_password POST body: password=pass123
- โทเค็น แบบรวม — บางแอปพลิเคชันจะรักษากลุ่มของโทเค็นไว้เพื่อตรวจสอบความถูกต้องของเซสชันผู้ใช้ แทนที่จะกำหนดโทเค็นเฉพาะให้กับเซสชัน ผู้โจมตีต้องการเพียงหนึ่งในโทเค็นที่มีอยู่แล้วในกลุ่มเพื่อแอบอ้างเป็นผู้ใช้ของไซต์
ผู้โจมตีสามารถเข้าสู่ระบบแอปพลิเคชันโดยใช้บัญชีของตนเพื่อรับโทเค็น เช่น:
[application_url].com?csrf_token=93j9d8eckke20d433
และเนื่องจากโทเค็นถูกรวมเข้าด้วยกัน ผู้โจมตีสามารถคัดลอกและใช้โทเค็นเดียวกันนั้นเพื่อเข้าสู่ระบบบัญชีผู้ใช้อื่น เนื่องจากคุณจะใช้อีกครั้ง:
- สามารถคัดลอกโทเค็น CSRF ไปยังคุกกี้ — บางแอปพลิเคชันจะคัดลอกพารามิเตอร์ที่เกี่ยวข้องกับโทเค็นไปยังคุกกี้ของผู้ใช้ หากผู้โจมตีสามารถเข้าถึงคุกกี้ดังกล่าวได้ พวกเขาสามารถสร้างคุกกี้ใหม่ วางไว้ในเบราว์เซอร์ และดำเนินการโจมตี CSRF ได้อย่างง่ายดาย
ดังนั้นผู้โจมตีสามารถเข้าสู่ระบบแอปพลิเคชันโดยใช้บัญชีของตนและเปิดไฟล์คุกกี้เพื่อดูสิ่งต่อไปนี้:
Csrf_token:93j9d8eckke20d433
จากนั้นพวกเขาสามารถใช้ข้อมูลนี้เพื่อสร้างคุกกี้อื่นเพื่อทำการโจมตีให้เสร็จสมบูรณ์
- โทเค็นไม่ถูกต้อง — บางแอปพลิเคชันไม่จับคู่โทเค็น CSRF กับเซสชันของผู้ใช้ ในกรณีดังกล่าว ผู้โจมตีสามารถเข้าสู่ระบบเซสชันอย่างแท้จริง รับโทเค็น CSRF ที่คล้ายกับข้างต้น และใช้เพื่อเตรียมการโจมตี CSRF ในเซสชันของเหยื่อ
วิธีป้องกันการโจมตี CSRF ด้วยส่วนหัวผู้อ้างอิง
อีกกลยุทธ์หนึ่งสำหรับการป้องกันการโจมตี CSRF คือการใช้ส่วนหัวของผู้อ้างอิง ใน HTTP ส่วนหัวของผู้อ้างอิงจะระบุที่มาของคำขอ โดยปกติแล้วจะใช้เพื่อทำการวิเคราะห์ เพิ่มประสิทธิภาพ และบันทึก
คุณยังสามารถเปิดใช้งานการตรวจสอบส่วนหัวผู้อ้างอิงในฝั่งเซิร์ฟเวอร์เพื่อป้องกันการโจมตี CSRF ฝั่งเซิร์ฟเวอร์ตรวจสอบต้นทางของคำขอและกำหนดต้นทางเป้าหมายของคำขอ หากตรงกันแสดงว่าคำขอนั้นได้รับอนุญาต หากไม่ตรงกัน เซิร์ฟเวอร์จะยกเลิกคำขอ
การใช้ส่วนหัวของผู้อ้างอิงนั้นง่ายกว่าการใช้โทเค็นมาก เนื่องจากไม่ต้องใช้การระบุตัวตนของผู้ใช้แต่ละคน
ช่องโหว่ที่อาจเกิดขึ้นของส่วนหัวผู้อ้างอิง
เช่นเดียวกับโทเค็น CSRF ส่วนหัวของผู้อ้างอิงมีช่องโหว่ที่สำคัญบางประการ
ประการแรก ส่วนหัวอ้างอิงไม่จำเป็น และบางไซต์จะส่งคำขอโดยไม่มีส่วนหัวดังกล่าว หาก CSRF ไม่มีนโยบายในการจัดการกับคำขอที่ไม่มีส่วนหัว ผู้โจมตีสามารถใช้คำขอที่ไม่มีส่วนหัวเพื่อดำเนินการโจมตีที่เปลี่ยนแปลงสถานะได้
นอกจากนี้ วิธีนี้มีประสิทธิภาพน้อยลงเมื่อมีการแนะนำนโยบายผู้อ้างอิงเมื่อเร็วๆ นี้ ข้อกำหนดนี้ป้องกันการรั่วไหลของ URL ไปยังโดเมนอื่น ทำให้ผู้ใช้สามารถควบคุมข้อมูลในส่วนหัวของผู้อ้างอิงได้มากขึ้น พวกเขาสามารถเลือกที่จะเปิดเผยข้อมูลส่วนหัวของผู้อ้างอิงบางส่วนหรือปิดการใช้งานโดยเพิ่มแท็กข้อมูลเมตาในหน้า HTML ดังที่แสดงด้านล่าง:
<meta name="referrer" content="no-referrer">
รหัสด้านบนลบส่วนหัวผู้อ้างอิงสำหรับคำขอทั้งหมดจากหน้านี้ การทำเช่นนี้ทำให้ยากสำหรับแอปพลิเคชันที่ใช้ส่วนหัวอ้างอิงเพื่อป้องกันการโจมตี CSRF จากหน้าดังกล่าว
Kinsta ป้องกันการโจมตี CSRF อย่างไร
นอกจากการใช้ส่วนหัวผู้อ้างอิงและโทเค็น CSRF แล้ว ยังมีทางเลือกที่สามซึ่งง่ายกว่า: การเลือกบริการโฮสติ้งที่ปลอดภัย เช่น Kinsta สำหรับเว็บไซต์และแอปพลิเคชันบนเว็บของคุณจะเป็นเกราะป้องกันที่แข็งแกร่งและปลอดภัยยิ่งขึ้นระหว่างผู้โจมตีและผู้ใช้ของคุณ
นอกเหนือจากคุณลักษณะด้านความปลอดภัยที่สำคัญ เช่น การสำรองข้อมูลอัตโนมัติ การตรวจสอบสิทธิ์แบบสองปัจจัย และ SFTP ผ่านโปรโตคอล SSH แล้ว การรวมระบบ Cloudflare ของ Kinsta ให้การป้องกันระดับองค์กรด้วยการป้องกัน IP และไฟร์วอลล์
โดยเฉพาะอย่างยิ่ง ปัจจุบัน Kinsta มีกฎไฟร์วอลล์ที่กำหนดเองประมาณ 60 กฎเพื่อช่วยป้องกันการโจมตีที่เป็นอันตรายและจัดการกับช่องโหว่ที่ไม่ได้รับการตรวจสอบสิทธิ์อย่างรุนแรงในปลั๊กอินและธีม รวมถึงกฎเฉพาะที่มองหาช่องโหว่ CSRF
สรุป
การปลอมแปลงคำขอข้ามไซต์ (CSRF) เป็นการโจมตีที่หลอกผู้ใช้ที่รับรองความถูกต้องให้เริ่มคำขอเปลี่ยนสถานะโดยไม่ได้ตั้งใจ พวกเขากำหนดเป้าหมายแอปพลิเคชันที่ไม่สามารถแยกความแตกต่างระหว่างคำขอเปลี่ยนสถานะที่ถูกต้องและปลอมแปลง
CSRF จะประสบความสำเร็จได้เฉพาะในแอปพลิเคชันที่ใช้คุกกี้เซสชันเพื่อระบุผู้ใช้ที่เข้าสู่ระบบและมีนโยบายคุกกี้ SameSite ที่อ่อนแอ พวกเขายังต้องการเซิร์ฟเวอร์ที่รับคำขอที่ไม่มีพารามิเตอร์ที่ไม่รู้จัก เช่น รหัสผ่าน แฮ็กเกอร์สามารถส่งการโจมตีที่เป็นอันตรายโดยใช้ GET หรือ POST
แม้ว่าการใช้โทเค็น CSRF หรือการบังคับใช้การตรวจสอบส่วนหัวของผู้อ้างอิงสามารถป้องกันการโจมตี CSRF ได้ แต่มาตรการทั้งสองมีช่องโหว่ที่อาจทำให้มาตรการป้องกันของคุณไร้ประโยชน์หากคุณไม่ระวัง
การโยกย้ายไปยังแพลตฟอร์มโฮสติ้งที่ปลอดภัยเช่น Kinsta จะช่วยรักษาความปลอดภัยให้เว็บไซต์หรือเว็บแอปของคุณจากการโจมตี CSRF นอกจากนี้ การผสานรวมของ Kinsta กับ Cloudflare ป้องกันการโจมตี CSRF ที่เฉพาะเจาะจง