WebSocket Security 100

Datafarm
4 min read3 days ago

สวัสดีครับ สำหรับบทความในวันนี้เป็นบทความสำหรับพื้นฐานของการทดสอบความปลอดภัยของ WebSocket ครับ ซึ่งบทความนี้เหมาะสำหรับท่านที่ยังไม่รู้ว่ามันคืออะไร หรือหากผู้อ่านท่านใดรู้อยู่แล้วก็ถือว่าเป็นการทบทวนความเข้าใจอีกครั้งก็แล้วกันนะครับ ไปเริ่มกันเลยครับบ

WebSocket คืออะไร??

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

โดยปกติแล้ว เมื่อทำการทดสอบความปลอดภัยของเว็บไซต์ ส่วนใหญ่เรามักจะเจอกับโปรโตคอล HTTP หรือ HTTPS ไม่ว่าจะเป็นการหาช่องโหว่ที่เกี่ยวข้องโดยตรง เช่น SQL Injection, Cross-Site Scripting (XSS) หรือช่องโหว่ทางอ้อมที่เกิดขึ้นจากการกำหนดค่าที่ผิดพลาดหรือใช้งานในแบบ Default โดยไม่ปลอดภัย อย่างการรั่วไหลของข้อมูล (Information Disclosure) หรือการควบคุมสิทธิ์ที่ผิดพลาด (Broken Access Control) อย่างไรก็ดี ในทุก ๆ วันนี้ที่เว็บแอปพลิเคชันมีการพัฒนาไปในรูปแบบเรียลไทม์มากขึ้น ดังนั้น WebSocket ก็กลายเป็นอีกหนึ่งโปรโตคอลที่ถูกนำมาใช้อย่างแพร่หลาย ไม่ว่าจะเป็นระบบแชทออนไลน์ เกมออนไลน์มัลติเพลเยอร์ การแจ้งเตือนแบบเรียลไทม์ หรือแม้กระทั่งแพลตฟอร์มซื้อขายสินทรัพย์ดิจิทัล

ถึงแม้ว่า WebSocket จะถูกออกแบบมาให้มีประสิทธิภาพสูงและแก้ไขปัญหาการร้องขอข้อมูลซ้ำ ๆ ของ HTTP แต่ช่องโหว่ด้านความปลอดภัยเองนั้นก็มีเช่นกัน ดังนั้นแล้วความปลอดภัยเองก็เป็นปัญหาที่ต้องคำนึงถึงด้วย โดยเฉพาะในกรณีที่มีพัฒนาโดยไม่คำนึงถึงมาตรการป้องกันมากเท่าที่ไรนัก ตัวอย่างเช่น Input-base Injection, Cross-Site WebSocket Hijacking, การขาดการตรวจสอบสิทธิ์ (Authentication & Authorization Bypass), และการส่งข้อมูลที่ไม่มีการเข้ารหัส เป็นต้น ซึ่งช่องโหว่ที่กล่าวนี้สามารถนำไปสู่การเข้าถึงข้อมูลสำคัญ หรือแม้แต่การควบคุมระบบจากระยะไกล (RCE) เพื่อให้เห็นภาพมากยิ่งขึ้น ผมจะพาทุกคนไปทำความรู้จักกับช่องโหว่ที่สามารถพบได้ ที่เกี่ยวข้องกับ WebSocket ใน Lab ต่อไปนี้กันครับ โดยเครื่องมือที่จะใช้ก็จะเป็นเครื่องมือ Intercepting Proxy ที่รู้จักกันโดยทั่วกันอยู่แล้วคือ BurpSuite

ช่องโหว่แรกเกี่ยวกับ Manipulating WebSocket messages หรือการดัดแปลงแก้ไข ข้อความที่รับและส่งใน WebSocket ครับ

นี่คือหน้าตาแล็บครับ

จากที่กล่าวไปเกี่ยวกับการใช้งาน WebSocket ก็พาจะคาดเดาได้ว่าช่องโหว่ต้องอยู่ที่ฟังก์ชัน “Live chat” อย่างแน่นอน

เมื่อกดเข้ามาก็จะเป็นหน้าต่างส่งข้อความ จากนั้นก็ลองส่งข้อความ

ระบบก็ตอบกลับปกติ จากนั้นใช้ Brup Suite วิเคราะห์ครับ

โดยมาที่แถบ Proxy แล้วก็ “WebSockets history” ก็จะพบข้อความที่เราส่งไปหาเซิร์ฟเวอร์และที่เซิร์ฟเวอร์ตอบกลับครับ

เมื่อมาถึงขั้นตอนนี้ ก็ลองทดสอบด้วยการใส่ค่าต่าง ๆ เหมือนตอนที่ทำบน HTTP เพื่อหาช่องโหว่ที่สามารถเป็นไปได้ครับ ผมจึงลองใส่ค่าอักขระพิเศษ “’” ไป กลับพบว่าถูก HTML Entity Encode ก่อนส่งไปยังเซิร์ฟเวอร์

เซิร์ฟเวอร์ก็ส่งข้อมูลนั้นกลับมา Render ที่ฝั่งผู้ใช้งาน

ซึ่งหมายความว่ามีการป้องกันด้วย HTML Entity Encode ที่ฝั่งทางผู้ใช้งานก่อนที่จะส่งไปยังเซิร์ฟเวอร์ ก็เลยใช้ Burp Suite แก้ไขค่าอีกครั้งแล้วส่งไปยังเซิร์ฟเวอร์

ก็พบว่าเซิร์ฟเวอร์ก็ตอบกลับด้วยข้อความ “’” กลับมา เพื่อ Render เช่นกัน….. เราสามารถส่งอักขระพิเศษและตอบกลับมาเพื่อ Redner ได้

เมื่อใส่ Tag HTML ก็ต้องส่งกลับมาเพื่อ Render ได้ด้วย

เมื่อกลับไปดูยังหน้าเว็บพบว่า Tag ที่ใส่เข้าไปทำงาน

ถึงขั้นนี้แล้วก็ต้อง XSS ด้วย Payload “<img src=x onerror=’alert(12123)’”

เมื่อกลับมายังหน้าเว็บพบว่ามี Pop-up เด้งขึ้นมา สรุปแล้วก็โดน XSS ครับ

วิธีแก้ไขนั้นก็เป็นการแก้ไขแบบ XSS ปกติเลยครับ ทำ Sanitization ด้วย HTML Entity Encode ที่ฝั่งขาออก (เซิร์ฟเวอร์ส่งข้อมูลกับมายังผู้ใช้งาน) และทำ Input Validation ที่ฝั่งเซิร์ฟเวอร์ครับ

มาดูแล็บอีกข้อกันครับข้อสุดท้ายกันครับ

ข้อนี้จะใช้ประโยชน์จากการเริ่ม Handshake ของ WebSocket ครับ

WebSocket Handshake เป็นขั้นตอนการเริ่มต้นการใช้งาน WebSocket คือการเปลี่ยนจาก HTTP ไปเป็น WebSocket โดยใช้ HTTP Request แบบ Upgrade เมื่อเสร็จขั้นตอนก็จะเริ่มใช้งาน WebSocket ตามปกติจนปิดการเชื่อมต่อ

ข้อมูลในการส่ง HTTP ก็จะประกอบไปด้วยอย่างน้อยตามที่วงสีแดงไว้ครับ

ใช้ GET Method พร้อม Header Upgrade: websocket, Connection: Upgrade, Sec-WebSocket-Key และ Sec-WebSocket-Version

Upgrade: websocket ใช้สำหรับ Upgrade Protocol จาก Http ไปเป็น WebSocket

Connection: Upgrade เป็นการ Upgrade Connection ไปเป็นแบบ keep-alive จะไม่มีการหยุด Connection

Sec-WebSocket-Key ซึ่ง Client เป็นคน Generate ขึ้นมา ใช้เพื่อเอามาใช้สำหรับเปิด Handshake เป็นค่าที่ใช้ในการความถูกต้องของการเชื่อมต่อ และ Sec-WebSocket-Version: เพื่อบอกเวอร์ชันของ WebSocket

แล้วมันเกี่ยวอะไรกับแล็บต่อไปล่ะ? มาดูกันครับ

แล็บนี้หน้าตาก็จะเหมือนเดิมเลยครับ ลองส่งข้อมูลจากนั้นดักข้อมูลลองแก้ไข ส่ง Payload XSS เหมือนเดิม

รอบนี้เราโดนตรวจจับการโจมตี และไม่สามารถใช้ Payload แบบเห็นเด่นชัดแบบนี้ได้แล้วครับ

จากนั้นผมก็ลอง Payload อื่นๆ เผื่อสามารถ Bypass ได้ครับ ด้วย Cheat Sheet หรือแม้แต่ JS FUCK แต่ก็พบว่า…

ไม่สามารถใช้งานได้ครับ นอกจากนี้ก็ยังโดน Block อีกครับ

ในเมื่อเราไม่สามารถ Bypass ตรงนี้ได้ ก็ลองที่จุดอื่นครับ ดังนั้นแล้ว Handshake WebSocket ที่ HTTP Request อาจจะทำอะไรได้

จาก Error ที่เซิร์ฟเวอร์ตอบกลับเรา ทำอะไรสักอย่างเพื่อรับมือการโจมตีของเรา และเรายังโดน Block IP-address…

ก็คงต้องลอง Spoofing IP Address ดูกันครับ

มายัง WebSocket ที่เราแก้ไขความ จากนั้นกดปุ่ม “Reconnect”

แล้วเพิ่ม HTTP Header ที่ Spoofing IP Address โดยใช้ “X-Forwarded-For: 127.0.0.1”

สามารถ connect กลับมาได้ โดยสังเกตุจากปุ่ม “Send” บ่งบอกว่าสามารถส่งข้อความไปยังเซิร์ฟเวอร์ได้

ผมก็ได้แก้ไข Payload นิดหน่อย แล้วพบว่าโดนตรวจจับอีกเหมือนเดิม แต่ข้อความเปลี่ยนไป มาถูกทางแล้วอย่างแน่นอน

หลังจากที่พยายามอยู่สักพักก็สามารถ Bypass ได้เรียบร้อย และเซิร์ฟเวอร์ไม่ตอบกลับด้วยข้อความ Error อีกแล้ว

แล้วแล็บก็ขึ้นว่าผ่านแล้วเรียบร้อย

จากแล็บนี้ก็พบว่าเราสามารถดำเนินการใช้ช่องโหว่กับ Handshake ของ WebSocket ได้เช่นกันครับ

วิธีแก้ไขนั้นก็เป็นการแก้ไขแบบ XSS เช่นเดิมครับ ด้วยการทำ Sanitization ด้วย HTML Entity Encode ที่ฝั่งขาออก (เซิร์ฟเวอร์ส่งข้อมูลกับมายังผู้ใช้งาน) และทำ Input Validation ที่ฝั่งเซิร์ฟเวอร์ครับ

ในด้านความปลอดภัยของ Cleartext, HTTP (http://) ส่งข้อมูลโดยไม่มีการเข้ารหัส ปัญหานี้แก้ไขได้ด้วย HTTPS (https://) ที่เข้ารหัสผ่าน TLS

เช่นเดียวกัน WebSocket (ws://) ก็สื่อสารแบบ Cleartext การแก้ไขคือใช้ Secure WebSocket (wss://), ซึ่งเข้ารหัสด้วย TLS ครับบ

นอกจากนี้ก็ยังมีเครื่องมือสำหรับการ Handle การ Encrypt/Decrypt ของ WebSocket ด้วยเครื่องมือ PyCript WebSocket เป็น Extension ของ Burp Suite ครับ สามารถเข้าไปดูข้อมูลเพิ่มเติมได้เลยครับ

ขอบคุณผู้อ่านทุกท่านที่อ่านมาถึงตอนสุดท้ายครับ บทความนี้เป็นเพียงพื้นฐานของ WebSocket เพียงเท่านั้น ไม่ใช่เนื้อหาทั้งหมดแต่อย่างใด หากผิดพลาดตรงไหนขออภัย ณ ที่นี้ด้วยครับ

--

--

No responses yet