
ถอดรหัส DOM XSS ใน jQuery Selector Sink: รู้ทันภัยจาก URL
ความปลอดภัยของเว็บไซต์สำคัญในโลกออนไลน์ DOM XSS คือหนึ่งในช่องโหว่ร้ายแรง โดยเฉพาะเมื่อทำงานกับ jQuery แฮกเกอร์ใช้ช่องทางนี้โจมตีผู้ใช้งานง่ายกว่าที่คิด บทความนี้จะเผยกลไกและวิธีป้องกันภัยนี้
DOM XSS คืออะไร ทำไมต้องระวัง?
DOM XSS คือการโจมตี Cross-Site Scripting ที่เกิดขึ้นในเบราว์เซอร์ของผู้ใช้งานโดยตรง ไม่ได้ผ่านเซิร์ฟเวอร์
แฮกเกอร์จะฝังสคริปต์อันตรายเข้าไปในหน้าเว็บ ด้วยการจัดการ DOM (Document Object Model) ซึ่งเป็นโครงสร้างเว็บที่เบราว์เซอร์ใช้แสดงผล
เมื่อเบราว์เซอร์ประมวลผล สคริปต์นั้นจะถูกรัน ทำให้ผู้โจมตีสามารถขโมยข้อมูลเซสชัน, เปลี่ยนแปลงเนื้อหา หรือพาผู้ใช้งานไปยังเว็บไซต์ปลอมได้
เมื่อ jQuery กลายเป็นช่องโหว่: Selector Sink
jQuery คือไลบรารี JavaScript ที่ทำให้การจัดการ DOM และการพัฒนาเว็บง่ายขึ้น ฟังก์ชัน Selector ช่วยให้นักพัฒนาเลือกองค์ประกอบต่างๆ บนหน้าเว็บได้อย่างรวดเร็ว
แต่หากนำข้อมูลที่ผู้ใช้งานควบคุมได้ เช่น จาก URL มาใช้ใน jQuery selector โดยไม่มีการกรองที่เหมาะสม ข้อมูลอันตรายอาจปนเปื้อนได้
ทำให้ jQuery ตีความผิดเป็น HTML หรือ JavaScript ที่เป็นอันตราย และนำไปสู่การรันโค้ด XSS ได้
location.hash และ hashchange ตัวช่วยของแฮกเกอร์?
ส่วน hash ใน URL (หลังเครื่องหมาย # เช่น www.example.com/page#section1) ถูกจัดการโดยเบราว์เซอร์ฝั่งไคลเอนต์ ไม่ส่งไปยังเซิร์ฟเวอร์
หลายเว็บไซต์ใช้ location.hash สำหรับการนำทางภายในหน้าหรือเก็บสถานะ
hashchange คืออีเวนต์ที่ทำงานเมื่อ hash เปลี่ยนแปลง ซึ่งนักพัฒนาใช้เพื่อโหลดเนื้อหาหรือปรับแต่งหน้าเว็บแบบไดนามิก
การรวม location.hash, hashchange และการใช้ jQuery selector อย่างไม่ระวัง จึงกลายเป็นช่องทางที่แฮกเกอร์ใช้ส่ง payload อันตรายเข้าสู่เบราว์เซอร์
เจาะลึกกลไกการโจมตี DOM XSS ด้วย jQuery Selector Sink
ลองจินตนาการว่าเว็บไซต์ดึงค่าจาก location.hash มาแสดงข้อมูลโดยตรง หากโค้ดไม่มีการกรองข้อมูลจาก window.location.hash อย่างเหมาะสม แฮกเกอร์สามารถสร้าง URL ที่มี payload อันตราย เช่น https://example.com/vulnerable-page.html#<img src=x onerror=alert(1)>
เมื่อผู้ใช้งานเข้า URL นี้ เบราว์เซอร์จะตรวจจับ hash ที่เปลี่ยนไป และโค้ด JavaScript ของเว็บจะทำงาน
ส่วน $(window.location.hash) จะถูกแปลเป็น $(#<img src=x onerror=alert(1)>)
jQuery จะตีความ <img src=x onerror=alert(1)> เป็น HTML element ทันทีที่สร้างใน DOM อีเวนต์ onerror ของแท็ก <img> ที่แฮกเกอร์ฝังไว้ก็จะทำงาน ทำให้สคริปต์ alert(1) ถูกรัน เกิดเป็น DOM XSS ที่สำเร็จ
ป้องกันได้อย่างไร?
การป้องกัน DOM XSS ประเภทนี้ สิ่งสำคัญคือไม่เชื่อถือข้อมูลจากผู้ใช้งานโดยเด็ดขาด เริ่มจากการ ตรวจสอบและกรองข้อมูล (Sanitization) อย่างเข้มงวด ก่อนนำข้อมูลจาก location.hash มาใช้ ควรลบอักขระพิเศษหรือแท็ก HTML ที่ไม่จำเป็นออกไป
ต่อไปคือ หลีกเลี่ยงการใช้ข้อมูลผู้ใช้งานโดยตรงใน Selector หากจำเป็น ต้องแน่ใจว่าได้ Escape หรือตรวจสอบค่าอย่างรัดกุมที่สุด เพื่อป้องกันการตีความผิดพลาด
สุดท้าย ใช้ Content Security Policy (CSP) ที่แข็งแกร่ง เพื่อจำกัดแหล่งที่มาของสคริปต์และเนื้อหาที่เบราว์เซอร์สามารถโหลดได้ สิ่งนี้ช่วยลดความเสี่ยง XSS ได้อย่างมีนัยสำคัญ
การเข้าใจกลไกเหล่านี้ช่วยให้นักพัฒนาและผู้ใช้งานรับมือภัยคุกคามทางไซเบอร์ได้อย่างมีประสิทธิภาพ สร้างสภาพแวดล้อมออนไลน์ที่ปลอดภัยยิ่งขึ้น