Remote File Inclusion (RFI) to Remote Code Execution (RCE)

Datafarm
3 min readJan 15, 2025

สวัสดีครับ… เพื่อน ๆ เคยได้ยินเกี่ยวกับช่องโหว่ที่เรียกว่า 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 และวิธีการป้องกันมันได้ง่ายและชัดเจนยิ่งขึ้นนะครับ

--

--

No responses yet