สวัสดีครับ… เพื่อน ๆ เคยได้ยินเกี่ยวกับช่องโหว่ที่เรียกว่า Remote File Inclusion (RFI) กันบ้างไหมครับ? ถ้าเคยได้ยินเกี่ยวกับ Local File Inclusion (LFI) มาก่อน Remote File Inclusion (RFI) ก็จะเป็นอะไรที่คล้าย ๆ กัน แต่วันนี้ผมมีลูกเล่นที่เพิ่มขึ้นมาอีกนิดหน่อยมาแนะนำ แบบให้ลองนึกภาพว่าเราสามารถนำไฟล์ที่เป็นอันตรายจากเครื่องอื่นมาใส่ในเว็บแอปพลิเคชันที่มีช่องโหว่นี้ได้ มันเจ๋งขนาดไหน!
ความแตกต่างระหว่าง LFI และ RFI
ในขณะที่ Local File Inclusion (LFI) จะให้เรา โหลดไฟล์ หรือเรียกใช้ไฟล์ ที่อยู่บนเครื่องเซิร์ฟเวอร์เองเท่านั้น แต่ Remote File Inclusion (RFI) จะเปิดโอกาสให้แฮกเกอร์ โหลดไฟล์ หรือเรียกใช้ไฟล์ที่เป็นอันตราย จากระยะไกลได้ด้วย ซึ่งนี่แหละคือประเด็นสำคัญ! ถ้า แฮกเกอร์ สามารถเรียกใช้สคริปต์ที่เป็นอันตรายจากเครื่องของแฮกเกอร์ แล้วใช้กับเว็บที่มีช่องโหว่นี้ได้ แฮกเกอร์ก็สามารถรันโค้ดที่ต้องการได้เลย ยกตัวอย่างเช่น ถ้าเว็บมีช่องโหว่ในฟังก์ชัน PHP ที่ชื่อว่า include() หรือ file_get_contents() และฟังก์ชันเหล่านี้เปิดให้รวม URL จากภายนอกได้ มันก็เปิดโอกาสให้แฮกเกอร์ใส่สคริปต์อันตรายเข้าไปได้นั่นเอง
การตรวจสอบช่องโหว่ RFI
สมมติว่าเราเจอเว็บไซต์เป้าหมายที่มีปุ่มกดเปลี่ยนภาษานะครับเพื่อน ๆ
เมื่อเราคลิกเปลี่ยนภาษาแล้วมีการรวม URL ออกมาเป็นประมาณนี้ http://domain/index.php?language=es.php คือเว็บไซต์จะมีการไป include หน้าเว็บ es.php มาใช้เราก็อาจ เอ๊ะ!! และแอบยิ้มกรุ่มกริ่มได้ว่าเว็บนี้น่าจะมีช่องโหว่ Remote File Inclusion (RFI) นะ
ต่อไปเราอาจเริ่มต้นด้วยการตรวจสอบว่าเราสามารถใส่ URL ที่เป็น Localhost เข้าไปแทนการเรียกใช้หน้าเว็บไซต์ es.php ว่าหน้าเว็บไซต์มีการตอบกลับหรือไม่ เช่น http://127.0.0.1/index.php ถ้าหน้าเว็บไซต์นั้นถูกโหลดแล้วรันในเว็บไซต์ เพื่อน ๆ คิดว่าจะเกิดอะไรขึ้นกับเว็บนั้นกันครับ เพื่อไม่เป็นการรอช้า ไปกันต๊อออ!!
จากภาพจะเห็นว่ามีการเรียกใช้หน้าเว็บไซต์ index.php ซ้ำ ซึ่งตอนนี้เราอาจรู้แล้วว่าเว็บไซต์เป้าหมายมีช่องโหว่ Remote File Inclusion (RFI) แล้วจะเกิดอะไรขึ้นล่ะ ถ้าแฮกเกอร์สามารถเรียกใช้ไฟล์ที่เป็นอันตรายจากเครื่องแฮกเกอร์ และนำไปรันคำสั่งบนเว็บไซต์เป้าหมายได้ เรามาลองดูกันเลยไหมครับ
Okkk ลำดับถัดไปเราจะลองเรียกใช้ไฟล์ ศัพท์ที่แฮกเกอร์ระดับสูงเขาเรียกกันว่า “Webshell” กับเว็บไซต์เป้าหมาย
อู้วหูววว เพื่อน ๆ เห็นคำสั่งที่ผมเรียกใช้กับเว็บไซต์เป้าหมายไหมครับ “whoami คุณเป็นใคร แฮร่!” ฉันเป็นใคร แฮร่ ถูกแล้วนั่นแหละครับ คือตอนนี้ผู้ไม่ประสงค์ดี หรือแฮกเกอร์ ก็สามารถเรียกใช้คำสั่งบนเว็บไซต์ของเป้าหมายได้แล้ว แต่ความอันตรายยังไม่จบเท่านั้นน่ะสิเพื่อน ๆ เพราะในช่องโหว่นี้ความร้ายแรงที่สามารถยกระดับไปถึง Remote Code Execution หรือเรียกสั้น ๆ ว่า RCE ได้เลยนะเพื่อน ๆ
เอ๊า!! แล้ว RCE หรือ Remote Code Execution คืออะไร!! พูดให้เข้าใจง่าย ๆ คือ การสั่งให้คอมพิวเตอร์เครื่องอื่นทำงานตามที่เราต้องการได้จากระยะไกลยังไงล่ะ
ลองนึกภาพว่าคอมพิวเตอร์ของเพื่อน ๆ เป็นบ้านของเพื่อน ๆ เอง แล้ว RCE ก็เหมือนกุญแจสำรองที่คนอื่นสามารถเอาไปเปิดบ้านของเพื่อน ๆ ได้เลย โดยที่เพื่อน ๆ ไม่รู้ตัว พวกเขาสามารถเข้าไปในบ้านของเพื่อนๆแล้วทำอะไรก็ได้ตามใจชอบ ไม่ว่าจะเป็นการขโมยของสำคัญ แอบสลับข้าวของ หรือทำลายทรัพย์สิน น่ากลัวใช่ไหมครับ
ต่อไปเรามาดูภาพตัวอย่างกันดีกว่า เมื่อแฮกเกอร์เข้าไปอยู่ในบ้านของเพื่อน ๆ แล้วจะเป็นยังไง
จากภาพจะเห็นได้ว่า แฮกเกอร์สามารถเรียกดูไฟล์ในระบบได้ หรือนอกเหนือจากนั้นยังสามารถ ขโมยข้อมูล, ใช้คำสั่งทำลายระบบ, ควบคุมระบบ, หรือเรียกค่าไถ่ก็เป็นด๊ายยยนะเพื่อน ๆ
วิธีป้องกัน Remote File Inclusion (RFI)
เรามาพูดถึงเรื่องการป้องกัน Remote File Inclusion หรือ RFI กันดีกว่า! มันเป็นช่องโหว่ที่แฮกเกอร์ชอบใช้เจาะระบบเว็บแอปพลิเคชัน เพื่อดึงไฟล์จากระยะไกลมารันในเซิร์ฟเวอร์ของเรา ฟังดูน่ากลัวใช่ไหม? แต่ไม่ต้องห่วงนะ เดี๋ยวเรามาดูกันว่าเราจะป้องกันมันได้ยังไงบ้าง
1. ห้ามส่งข้อมูลจากผู้ใช้เข้าไปในฟังก์ชันที่โหลดไฟล์
ก่อนอื่นเลย สิ่งที่ง่ายที่สุดคือ อย่าส่งข้อมูลจากผู้ใช้เข้าไปในฟังก์ชันที่เกี่ยวข้องกับการโหลดไฟล์ อย่างพวก include() หรือ require() ใน PHP ถ้าจำเป็นต้องโหลดไฟล์ ให้เขียนโค้ดให้มันจัดการโหลดไฟล์ในฝั่งเซิร์ฟเวอร์เองโดยไม่ให้ผู้ใช้ยุ่งเกี่ยวเลย
ถ้าต้องการให้ผู้ใช้เลือกไฟล์ เช่น เลือกธีมเว็บหรือภาษา ให้ใช้ allowlist หรือ “รายการไฟล์ที่อนุญาต” แทน เช่น สร้าง JSON ที่เก็บคู่ชื่อไฟล์กับค่า ID ไว้ หรือใช้ฐานข้อมูลเก็บข้อมูลนี้ก็ได้ วิธีนี้ทำให้เราควบคุมได้ว่าไฟล์ไหนที่โหลดได้
2. ปรับตั้งค่าของเซิร์ฟเวอร์
อีกวิธีที่ช่วยป้องกัน คือการตั้งค่าเซิร์ฟเวอร์ให้ปลอดภัยขึ้น เช่น
- ปิดการใช้งานการโหลดไฟล์จาก URL (allow_url_fopen และ allow_url_include ใน PHP)
- ล็อกการเข้าถึงไฟล์ให้อยู่ในโฟลเดอร์เว็บเท่านั้น (เช่นใช้ open_basedir)
- ใช้ Docker หรือ Container เพื่อจำกัดพื้นที่ที่แอปพลิเคชันเข้าถึงได้
3. อย่าลืมตรวจสอบและทดสอบระบบอยู่เสมอ
สุดท้าย ระบบที่ปลอดภัยไม่ได้หมายความว่าเราจะเลิกสนใจมันได้! ต้องคอยตรวจสอบ Log และทดสอบระบบหลังจากมีข่าวเกี่ยวกับช่องโหว่ใหม่ ๆ เสมอ
เป็นไงกันบ้างครับเพื่อนๆ กับความรู้เล็ก ๆ น้อยๆ ที่ผมมีมาฝากในวันนี้ อ่านมาถึงตอนนี้ก็ขอบคุณทุกคนมากนะครับที่อ่านจนจบ แน่นอนว่าการป้องกัน RFI ไม่ใช่แค่ทำให้ระบบของเราดูแข็งแรงและปลอดภัยมากขึ้น แต่ยังช่วยเพิ่มเวลาและโอกาสให้เรารับมือกับปัญหาที่อาจเกิดขึ้นได้อย่างมีประสิทธิภาพมากกว่าเดิม หวังว่าบทความนี้จะช่วยให้เพื่อน ๆ เข้าใจเรื่อง RFI และวิธีการป้องกันมันได้ง่ายและชัดเจนยิ่งขึ้นนะครับ