เจาะช่องโหว่ XSS: เมื่อเว็บไซต์สะท้อนภัยคุกคามกลับมาหาคุณ

เจาะช่องโหว่ XSS: เมื่อเว็บไซต์สะท้อนภัยคุกคามกลับมาหาคุณ

โลกออนไลน์ที่เราใช้กันทุกวันนี้เต็มไปด้วยเว็บไซต์และแอปพลิเคชันมากมาย

แต่ใครจะรู้ว่าความสะดวกสบายเหล่านั้นอาจซ่อนภัยร้ายที่เรียกว่า Cross-Site Scripting หรือ XSS ไว้

นี่ไม่ใช่เรื่องไกลตัวเลย เพราะ XSS คือหนึ่งในช่องโหว่ความปลอดภัยบนเว็บที่พบบ่อยที่สุด และมีอันตรายไม่น้อยกว่าที่คิด

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

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

Reflected XSS คืออะไร?

ในบรรดา XSS หลายรูปแบบ Reflected XSS ถือเป็นประเภทที่พบบ่อยและเข้าใจง่ายที่สุด

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

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

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

ตามรอยช่องโหว่จากพารามิเตอร์ใน URL

บ่อยครั้ง การค้นหาช่องโหว่นี้เริ่มต้นจากการสังเกต พารามิเตอร์ ต่างๆ ใน URL ของเว็บไซต์

เช่น พารามิเตอร์ที่ชื่อว่า redir (ย่อมาจาก redirect) ที่มักจะใช้ระบุว่าเมื่อล็อกอินสำเร็จแล้ว จะให้พาผู้ใช้ไปยังหน้าไหนต่อ

ยกตัวอย่างเช่น URL ที่ดูปกติอย่าง https://example.com/login?redir=/dashboard

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

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

อย่างไรก็ตาม การสังเกตอย่างละเอียดคือหัวใจสำคัญ

เมื่อลองส่งค่าแปลก ๆ เข้าไปในพารามิเตอร์นี้ สังเกตว่าข้อความที่เราส่งไปปรากฏบนหน้าเว็บอย่างไร

ในกรณีหนึ่ง พบว่าค่าที่ส่งไปผ่านพารามิเตอร์ redir นั้น ถูกนำไปแสดงผลอยู่ในส่วนของ attribute ภายในแท็ก HTML เช่น <input type="hidden" name="redirect" value="[ค่าที่เราส่งไป]">

นี่แหละคือจุดที่อันตราย!

จุดประกายด้วย Single Quote

เมื่อรู้ว่าค่าที่ส่งไปปรากฏอยู่ใน attribute ของแท็ก <input> สิ่งที่ต้องทำคือหาวิธี “หลุด” ออกมาจาก attribute นั้น

การใช้เครื่องหมาย single quote (‘) หรือ double quote (“) คือกุญแจสำคัญ

หากเว็บไซต์ใช้ single quote ปิด attribute อย่าง value='...' การส่งค่าอย่าง '-alert(document.domain)-' เข้าไปใน redir ก็จะทำให้เกิดการแทรกโค้ดได้สำเร็จ

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

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

HTML ที่ถูกสร้างขึ้นมาจะกลายเป็นประมาณนี้: <input type="hidden" name="redirect" value="'-alert(document.domain)-'"> ซึ่งทำให้ส่วน '-alert(document.domain)-' ถูกตีความว่าเป็นโค้ด JavaScript ที่ต้องการให้ทำงานนอกเหนือจาก attribute

ผลกระทบและการป้องกัน

ผลกระทบของ XSS ไม่ใช่แค่การแสดงกล่องข้อความ alert เท่านั้น

ผู้โจมตีสามารถขโมย cookie ของผู้ใช้ ซึ่งอาจมีข้อมูล session ที่ทำให้ล็อกอินเข้าสู่ระบบในฐานะผู้ใช้นั้นได้เลย

นอกจากนี้ ยังสามารถเปลี่ยนเนื้อหาบนหน้าเว็บ หลอกให้ผู้ใช้กรอกข้อมูลส่วนตัว หรือแม้แต่เปลี่ยนเส้นทางไปยังเว็บไซต์ปลอมที่สร้างขึ้นมาเพื่อขโมยข้อมูล

การป้องกันช่องโหว่ XSS ทำได้โดยการ ตรวจสอบและกรองข้อมูลนำเข้า (input validation) อย่างเข้มงวด และที่สำคัญกว่าคือการ เข้ารหัสข้อมูลผลลัพธ์ (output encoding) ก่อนนำไปแสดงผลบนหน้าเว็บ เพื่อให้เบราว์เซอร์มองเห็นว่าเป็นเพียงข้อความธรรมดา ไม่ใช่โค้ดที่ต้องรัน

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