
แกะรอยช่องโหว่ PHP Object Injection ใน CMS ที่ซ้ำรอยเดิม!
เคยสงสัยไหมว่าแค่การใส่ข้อมูลผ่าน URL จะกลายเป็นหายนะต่อเว็บไซต์ได้จริงหรือ? เรื่องราวของช่องโหว่ PHP Object Injection ในระบบจัดการเนื้อหา (CMS) ชื่อ Cotonti ที่ถูกค้นพบครั้งที่สี่ในลักษณะคล้ายกัน จะเผยให้เห็นถึงอันตรายที่หลายคนอาจมองข้ามไป
นี่คือภัยคุกคามที่ซ่อนอยู่ในฟังก์ชันพื้นฐานที่ชื่อว่า unserialize() ซึ่งหากใช้งานอย่างไม่ระมัดระวัง ก็เปิดประตูให้แฮกเกอร์เข้ามาควบคุมระบบได้เลย
PHP Object Injection คืออะไร?
ลองนึกภาพว่าเว็บไซต์ของเราเก็บข้อมูลบางอย่างในรูปแบบที่เรียกว่า “serialized data” ซึ่งก็คือการแปลงข้อมูลที่ซับซ้อน เช่น อ็อบเจกต์ (Object) ของภาษา PHP ให้กลายเป็นสตริงข้อความธรรมดา เพื่อสะดวกในการจัดเก็บหรือส่งผ่าน
เมื่อต้องการนำข้อมูลนั้นกลับมาใช้งาน ก็จะต้องใช้ฟังก์ชัน unserialize()
ปัญหาคือ ถ้าเว็บไซต์รับข้อมูล serialized data จากผู้ใช้งานโดยตรง โดยไม่มีการตรวจสอบที่ดี ผู้ไม่หวังดีสามารถสร้างสตริงพิเศษที่เมื่อถูก unserialize() แล้ว จะไปสั่งให้เว็บไซต์ทำงานในลักษณะที่ไม่พึงประสงค์ได้
นี่แหละคือหัวใจของ PHP Object Injection ซึ่งสามารถนำไปสู่การโจมตีที่รุนแรง อย่างการรันคำสั่งจากระยะไกล (Remote Code Execution) หรือควบคุมข้อมูลในระบบได้
ช่องโหว่ใน CommentsWidget ของ Cotonti CMS
ช่องโหว่นี้ถูกค้นพบในส่วนของ CommentsWidget ของ Cotonti CMS ซึ่งเป็นโมดูลที่ใช้จัดการระบบคอมเมนต์บนเว็บไซต์
Widget นี้สามารถนำไปฝังไว้ในหน้าใดก็ได้ และจะมีการดึงค่าพารามิเตอร์ต่างๆ จาก URL ที่ผู้ใช้งานส่งเข้ามา
ประเด็นสำคัญอยู่ตรงที่ Widget มีการใช้ฟังก์ชัน cot_import() เพื่อรับพารามิเตอร์ โดยมีพารามิเตอร์ตัวหนึ่งชื่อ pfs และอีกตัวชื่อ comment_parser
ถ้าผู้โจมตีสามารถกำหนดค่า comment_parser ให้เป็นจริง และใส่ข้อมูล serialized data ที่เป็นอันตรายลงไปในพารามิเตอร์ pfs ได้
เมื่อโค้ดภายใน CommentsWidget ทำงาน มันจะมีการนำค่าพารามิเตอร์เหล่านี้ไป serialize แล้วเก็บไว้ชั่วคราว จากนั้นจึง unserialize กลับมาอีกครั้งโดยไม่มีการตรวจสอบความถูกต้องของข้อมูลที่เพียงพอ
นี่คือจุดที่อันตราย เพราะ unserialize() ได้รับข้อมูลที่ถูกปนเปื้อนจากผู้โจมตีนั่นเอง
ผลกระทบและความสำคัญของช่องโหว่
การค้นพบช่องโหว่นี้ตอกย้ำถึงความสำคัญของการเขียนโค้ดที่ปลอดภัย โดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับข้อมูลที่มาจากผู้ใช้งาน
เนื่องจากนี่ไม่ใช่ครั้งแรก แต่เป็น unserialize sink ตัวที่สี่ที่ถูกพบใน CMS เดียวกัน ซึ่งแสดงให้เห็นว่าปัญหาลักษณะนี้มีความฝังรากลึก
หากถูกโจมตีสำเร็จ แฮกเกอร์สามารถใช้ช่องโหว่นี้เพื่อรันโค้ดบนเซิร์ฟเวอร์ (Remote Code Execution) ได้ ซึ่งหมายความว่าพวกเขาสามารถควบคุมเว็บไซต์ได้อย่างสมบูรณ์ ไม่ว่าจะเป็นการขโมยข้อมูล ปรับเปลี่ยนเนื้อหา หรือติดตั้งมัลแวร์
คำแนะนำเพื่อความปลอดภัย
เพื่อป้องกันตัวเองจากภัยคุกคามลักษณะนี้ ผู้ดูแลระบบเว็บไซต์ที่ใช้ Cotonti CMS ควรรีบ อัปเดตระบบให้เป็นเวอร์ชันล่าสุดทันที ที่มีการแก้ไขช่องโหว่นี้
สำหรับนักพัฒนา การระมัดระวังการใช้ฟังก์ชัน unserialize() เป็นสิ่งสำคัญอย่างยิ่ง
ควรหลีกเลี่ยงการ unserialize() ข้อมูลที่ไม่น่าเชื่อถือ หรือข้อมูลที่มาจากผู้ใช้งานโดยตรง
หากจำเป็นต้องใช้งาน ควรมีการ ตรวจสอบและทำความสะอาด (sanitize) ข้อมูล อย่างเข้มงวดก่อนเสมอ เพื่อให้แน่ใจว่าข้อมูลนั้นปลอดภัยและไม่มีโค้ดอันตรายแฝงมาด้วย
การใส่ใจในรายละเอียดเล็กๆ น้อยๆ เหล่านี้ จะช่วยสร้างเกราะป้องกันที่แข็งแกร่งให้กับเว็บไซต์และข้อมูลสำคัญของเราได้