เจาะลึก XSS ที่ซ่อนเร้น: ไขรหัสช่องโหว่ในแอปพลิเคชันที่ปลอดภัย

เจาะลึก XSS ที่ซ่อนเร้น: ไขรหัสช่องโหว่ในแอปพลิเคชันที่ปลอดภัย

Cross-Site Scripting หรือ XSS เป็นช่องโหว่ที่นักพัฒนาและนักทดสอบความปลอดภัยมักมองว่าเป็นเรื่องพื้นฐาน และคิดว่ามันถูกป้องกันได้ง่ายดายแล้วในระบบสมัยใหม่

แต่เรื่องจริงคือ XSS ยังคงเป็นภัยคุกคามที่ซ่อนเร้น และสามารถสร้างผลกระทบมหาศาลหากมันถูกฝังตัวอยู่ในจุดที่คาดไม่ถึง

หลายครั้งที่ช่องโหว่นี้อยู่ในแอปพลิเคชันที่ดูเหมือนจะปลอดภัยอย่างยิ่ง

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

XSS คืออะไรกันแน่

XSS คือช่องโหว่ที่ทำให้ผู้ไม่ประสงค์ดีสามารถฉีด สคริปต์ที่เป็นอันตราย (malicious scripts) เข้าไปในเว็บไซต์ที่ผู้ใช้งานคนอื่นเข้าชมได้

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

ผลกระทบมีตั้งแต่การขโมย ข้อมูลคุกกี้ (cookies) การเปลี่ยนหน้าตาเว็บไซต์ หรือแม้แต่การเปลี่ยนเส้นทางไปยังเว็บไซต์ปลอม

แอปพลิเคชันส่วนใหญ่มีกลไกป้องกัน XSS โดยการ กรองข้อมูล (sanitization) หรือ เข้ารหัส (encoding) อักขระพิเศษบนฝั่งเซิร์ฟเวอร์อย่างเข้มงวด

ความท้าทายในการค้นหา XSS ที่ซ่อนเร้น

แม้ว่าการป้องกัน XSS บนฝั่งเซิร์ฟเวอร์จะแข็งแกร่ง แต่ช่องโหว่ก็ยังสามารถเกิดขึ้นได้

โดยเฉพาะอย่างยิ่งในกรณีที่การประมวลผลข้อมูลเกิดขึ้นบน ฝั่งไคลเอนต์ (client-side) หรือเมื่อข้อมูลถูกสะท้อนกลับในรูปแบบที่ซับซ้อน

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

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

เจาะลึกช่องโหว่ที่มองไม่เห็น

เคยมีการค้นพบ XSS ที่น่าสนใจในระบบจัดการผู้ดูแลระบบ (admin panel) ที่ดูเหมือนจะได้รับการป้องกันอย่างดี

จุดสังเกตคือเมื่อแก้ไขข้อมูลผู้ใช้งาน จะมี พารามิเตอร์ ID ปรากฏอยู่ใน URL

เช่น admin.example.com/edit_user?id=123

ตัวแอปพลิเคชันมีการ เข้ารหัสอักขระพิเศษ บนฝั่งเซิร์ฟเวอร์อย่างถูกต้อง ทำให้คิดว่าปลอดภัยแล้ว

แต่พารามิเตอร์ id นี้ถูกนำไปสะท้อนอยู่ในแอตทริบิวต์ value ของแท็ก input ประเภท hidden ในหน้า HTML

หน้าเว็บจะมีลักษณะประมาณนี้: <input type="hidden" name="user_id" value="[ค่าของ id parameter ที่ส่งมา]">

นี่คือจุดที่ช่องโหว่ซ่อนอยู่!

ถ้าผู้โจมตีส่งค่า id ที่ออกแบบมาเป็นพิเศษ เช่น 123"><img src=x onerror=alert(1)>

เบราว์เซอร์จะตีความสตริงนี้อย่างไร?

เครื่องหมายคำพูดคู่ " จะถูกตีความว่าเป็นการปิดแอตทริบิวต์ value ก่อนกำหนด

ส่วนเครื่องหมาย > จะถูกตีความว่าเป็นการปิดแท็ก <input>

จากนั้น แท็ก <img src=x onerror=alert(1)> ก็จะถูกมองว่าเป็นโค้ด HTML ใหม่

และเมื่อรูปภาพ src=x โหลดไม่สำเร็จ อีเวนต์ onerror ก็จะถูกทริกเกอร์ ทำให้สคริปต์ alert(1) ทำงาน

นี่เป็นการเข้าถึงข้อมูลส่วนตัว หรือควบคุมการทำงานในส่วนของ admin panel ได้ทันที

ซึ่งถือเป็นช่องโหว่ที่มีความร้ายแรงอย่างมาก และมักถูกละเลย

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

มองให้ทะลุข้อจำกัด

กรณีศึกษาข้างต้นตอกย้ำความสำคัญของการทดสอบความปลอดภัยเชิงลึก

ไม่ควรเชื่อว่าระบบปลอดภัยเพียงเพราะเครื่องมืออัตโนมัติไม่พบอะไร

นักทดสอบความปลอดภัยที่ดีต้องคิดนอกกรอบ และพยายามหาช่องทางที่ข้อมูลสามารถถูกตีความในรูปแบบที่แตกต่างกัน

โดยเฉพาะอย่างยิ่งเมื่อมีการส่งข้อมูลจากฝั่งเซิร์ฟเวอร์มาแสดงผลบนฝั่งไคลเอนต์

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

การตรวจสอบทุกพารามิเตอร์และทุกจุดที่ข้อมูลถูกสะท้อนกลับเป็นกุญแจสำคัญ

การหมั่นศึกษาเรียนรู้และฝึกฝนอย่างต่อเนื่อง จะช่วยให้มองเห็นช่องโหว่ที่คนอื่นมองไม่เห็น