เว็บไซต์ PHP ถูกแฮก – ช่องโหว่ PHP และการแก้ไข
PHP เป็นโครงสร้างพื้นฐานของ CMS ยอดนิยมเกือบทุกตัวในปัจจุบัน ด้วยความเรียบง่ายและลักษณะไร้ค่าใช้จ่ายใบอนุญาต PHP จึงเป็นตัวเลือกแรกสำหรับการพัฒนาเว็บไซต์ไดนามิก อย่างไรก็ตาม เนื่องจากมาตรฐานการเขียนโค้ดที่ไม่ดี ทำให้การบุกครอบเว็บไซต์ PHP กลายเป็นเรื่องค่อนข้างง่าย อินเทอร์เน็ตเต็มไปด้วยเธรดช่วยเหลือที่ผู้ใช้ร้องเรียนเกี่ยวกับเว็บไซต์ PHP แบบกำหนดเองถูกแฮก หรือ PHP website redirects hack สิ่งนี้นำไปสู่โปรปากันดาร่าหลายอย่างต่อ PHP เอง ซึ่ง PHP ไม่ได้เป็นฝ่ายที่ต้องรับผิดชอบ
ดังนั้น หาก PHP ไม่ใช่ฝ่ายที่ต้องรับผิดชอบ แล้วอะไรคือสาเหตุของ PHP website redirect hack? บทความนี้จะอธิบายช่องโหว่ด้านความปลอดภัยที่ทำให้เว็บไซต์ PHP ถูกบุกครอบ และวิธีป้องกัน
ตัวอย่างเว็บไซต์ PHP แบบกำหนดเองถูกแฮก
เจ้าของเว็บไซต์ส่วนใหญ่เน้นเฉพาะส่วนพัฒนา และไม่สนใจด้านความปลอดภัย ดังนั้น เมื่อเว็บไซต์ที่พัฒนาด้วย PHP ถูกแฮก เจ้าของเว็บไซต์ไม่มีที่ไหนจะไปขอความช่วยเหลือ เพราะพวกเขาจ่ายให้โปรแกรมเมอร์เฉพาะส่วนพัฒนาเท่านั้น ผู้ใช้ที่มีปัญหาสามารถพบได้บนฟอรัมออนไลน์และอ่านบทความอย่างนี้ นี่คือตัวอย่างบางส่วน:
อาการของเว็บไซต์ PHP แบบกำหนดเองถูกแฮก
- หน้าปลอม (phishing pages) ปรากฏบนเว็บไซต์ PHP พยายามหลอกลวงผู้ใช้ให้ใส่ข้อมูลละเอียดอ่อน
- ผู้ใช้คลิกลิงก์บนเว็บไซต์ของคุณและไปหยุดที่โดเมนอื่น ซึ่งมักเกิดจากการกำหนดค่าผิดหรือ PHP website redirect hack
- Adblockers ติดป้ายและบล็อกบางองค์ประกอบของเว็บไซต์สำหรับการขุดคริปโตเคอเรนซี
- PHP file managers ที่ไม่รู้จักปรากฏบนเว็บไซต์ และเว็บไซต์ PHP แสดงโฆษณาร้าย
- ไฟล์ PHP ถูกแก้ไขด้วยโค้ดไม่รู้จัก ทำให้เกิดการเปลี่ยนเส้นทางหรือสร้างแบ็คลิงก์สำหรับเว็บไซต์น่าสงสัย
- เนื้อหาแปลกๆ ปรากฏบนเว็บไซต์ PHP แบบกำหนดเอง ซึ่งอาจเกิดจาก Japanese Keyword Hack หรือ Pharma Hack ฯลฯ
- ข้อความเตือนระงับบัญชีปรากฏขณะใช้โฮสติ้งบุคคลที่สามสำหรับเว็บไซต์ PHP แบบกำหนดเอง
- เว็บไซต์ PHP แบบกำหนดเองแสดงข้อความเตือนถูกแบนโดย Google และเครื่องมือค้นหาอื่นๆ เนื่องจากมัลแวร์ สแปม ฯลฯ
- phpMyAdmin แสดงผู้ดูแลฐานข้อมูลใหม่และไม่รู้จัก
- อีเมลที่ส่งจากโดเมนของเว็บไซต์ PHP ของคุณถูกติดป้ายว่าเป็นสแปม
- ข้อความผิดพลาดที่ไม่คาดคิดบนเว็บไซต์ และเว็บไซต์ PHP ช้าลงและไม่ตอบสนอง
13 เหตุผลที่เว็บไซต์ PHP แบบกำหนดเองถูกแฮก
การกำหนดค่าเซิร์ฟเวอร์ผิดพลาด (Server Mis-configuration)
1. สิทธิ์ไฟล์อ่อนแอ (Weak File Permissions)
สิทธิ์ไฟล์ให้สิทธิประโยชน์ในการแก้ไขไฟล์ PHP 特定给某类用户 因此 如果 PHP 文件权限设置不当 可能允许攻击者向您的 PHP 文件注入恶意软件 垃圾邮件 等
2. รหัสผ่านเริ่มต้น (Default Passwords)
การใช้รหัสผ่านอ่อนแาหรือที่ใช้กันทั่วไปเป็นสาเหตุทั่วไปของการโจมตีเว็บไซต์ PHP แบบกำหนดเอง พจนานุกรมที่ปรับแต่งได้สามารถใช้ลองรหัสผ่านทุกชุดที่เป็นไปได้ เมื่อถูกบุกครอบแล้ว ขึ้นอยู่กับเวกเตอร์การโจมตี เช่น FTP brute force หรือ cPanel brute force โจมตีสามารถเข้าถึงพื้นที่ผู้ดูแลของเว็บไซต์ PHP แบบกำหนดเอง โจมตีจึงสามารถอัปโหลดมัลแวร์ PHP หรือ backdoor ได้
บทความเกี่ยวข้อง – วิธีลบ WordPress Backdoor?
3. เปิดใช้งาน Directory Indexing
การเปิดใช้งาน directory indexing อาจอนุญาตให้โจมตีอ่านไฟล์ PHP ที่ละเอียดอ่อน ซึ่งอาจรั่วไหลข้อมูลเกี่ยวกับเซิร์ฟเวอร์ให้โจมตี โจมตีสามารถใช้ข้อมูลนี้โจมตีทางไซเบอร์เว็บไซต์ PHP ของคุณ
4. พอร์ตเปิด (Open Ports)
พอร์ตเปิดอาจเป็นสาเหตุของการโจมตีเว็บไซต์ PHP แบบกำหนดเอง นอกจากนี้ พอร์ตเปิดสามารถใช้โดยโจมตีเพื่อ fingerprint บริการแบ็กเอนด์ของเว็บไซต์ PHP ด้วยข้อมูลนี้ โจมตีสามารถบุกครอบบริการแบ็กเอนด์หรือพอร์ตเปิดเองโดยใช้ exploits
5. โฮสติ้งคุณภาพต่ำ (Poor Hosting)
โดยทั่วไป โฮสติ้ง PHP ราคาถูกมาพร้อมกับราคาความปลอดภัยที่สูง โฮสติ้งคุณภาพต่ำลดลงในการดำเนินงานด้านความปลอดภัยเพื่อทำให้บริการถูกกว่า ดังนั้น เมื่อการติดเชื้อเริ่มแพร่บนเซิร์ฟเวอร์แบบนี้ อาจทำลายหลายเว็บไซต์รวมถึงเว็บไซต์ PHP ของคุณ แม้จะไม่ได้เป็นเป้าหมายโดยตรง
โค้ด PHP ที่มีช่องโหว่ (Vulnerable PHP Code)
6. PHP SQL Injection
SQL Injection ใน PHP เกิดขึ้นหลักจากการขาดการทำความสะอาดข้อมูลนำเข้า (unsanitized user input) เนื่องจากมาตรฐานการเขียนโค้ดที่ไม่ดี ข้อมูลนำเข้าที่ไม่ได้ทำความสะอาดเข้าถึงเซิร์ฟเวอร์ฐานข้อมูลโดยตรงและถูกนำไปรัน สาเหตุหลักของ SQLi ในหน้า PHP แบบกำหนดเอง ได้แก่:
- ขาดการกรองตัวอักษรเว้นวรรค (space characters)
- ใช้เครื่องหมายอัญประกาศเพื่อแบ่งสตริง
- ส่งข้อมูลนำเข้าที่ไม่ได้ทำความสะอาดไปยังฐานข้อมูล
- การใช้งาน Unicode encoding ที่ไม่ถูกต้อง
- การผสมโค้ดกับข้อมูล (Inter-mixing of code with data)
- การจัดการชนิดข้อมูล (Type handling) ที่ไม่ถูกต้อง
7. PHP Cross-Site Scripting (XSS)
XSS เป็นสาเหตุทั่วไปอันดับสองของเว็บไซต์ PHP แบบกำหนดเองถูกแฮก หลัง SQL Injection ทั้งสองการโจมตีนี้แพร่หลายบนเว็บมากจนปรากฏใน OWASP Top 10 ทุกปี XSS ก็เกิดจากขาดการทำความสะอาดข้อมูลนำเข้าเช่นกัน ในเว็บไซต์ PHP และทั่วไป XSS แบ่งเป็น 3 ประเภทหลัก:
- Stored XSS: ประเภทนี้ขึ้นอยู่กับแอดมินเว็บที่คลิกลิงก์เฉพาะ ซึ่งโหลดสคริปต์ร้ายเพื่อขโมยคุกกี้
- Reflected XSS: ประเภทนี้รุนแรงและพบได้ทั่วไปในเว็บไซต์ PHP ที่มีฟอรัม การอภิปราย ฯลฯ โค้ดร้ายจาก XSS ประเภทนี้ถูกเก็บบนเซิร์ฟเวอร์และรันทุกครั้งที่ผู้ใช้เข้าชมหน้า PHP นั้น
- DOM Based XSS: ประเภทนี้อาจเป็นหนึ่งในสองแบบด้านบน แต่การตรวจจับยาก และอาจหลุดพ้นแม้หลังการตรวจสอบโค้ด
เว็บไซต์ที่อ่อนไหวต่อ XSS มักเป็นเป้าหมายสำหรับ PHP website redirect hack หรือการขโมยคุกกี้แอดมิน
8. PHP Cross-Site Request Forgery (CSRF)
การโจมตี CSRF มุ่งหลอกผู้ใช้เว็บไซต์ PHP ให้ทำการกระทำที่ไม่พึงประสงค์ หากเว็บไซต์ PHP แบบกำหนดเองของคุณอนุญาตให้สมัครสมาชิก CSRF อาจอนุญาตให้คนลบบัญชีสุ่มหรือทำการกระทำอื่นๆ แม้ผลลัพธ์ของการกระทำไม่มองเห็นโดยตรงจากโจมตี CSRF ก็สามารถลบผู้ใช้ของเว็บไซต์ PHP ทำให้トラフィกเว็บไซต์ลดลง
9. PHP Local File Inclusion (LFI)
ช่องโหว่การรวมไฟล์ท้องถิ่น เกิดขึ้นเมื่อโจมตีสามารถเข้าถึงไฟล์นอกไดเรกทอรีรูท 'www' ได้ สาเหตุหลักคือสคริปต์ที่เขียนไม่ดีที่รับชื่อไฟล์เป็นพารามิเตอร์ ช่องโหว่นี้อนุญาตให้โจมตีอ่านไฟล์การตั้งค่าและรหัสผ่านที่ละเอียดอ่อนของเว็บไซต์ PHP ของคุณ ข้อมูลที่ได้จากไฟล์เหล่านี้สามารถใช้โดยโจมตีเพื่อล็อกอินด้วยสิทธิ์แอดมิน นำไปสู่การโจมตีเว็บไซต์ PHP
ช่องโหว่ Zero-Day ใน PHP
10. ปลั๊กอินหรือธีมที่มีบั๊ก (Buggy Plugins or Themes)
ปลั๊กอินหรือธีม PHP ที่เขียนโค้ดไม่ดี เป็นช่องโหว่ที่อยู่บนเซิร์ฟเวอร์ของคุณรอถูก exploit มีกรณีที่โจมตีเจาะจงปลั๊กอินที่มีบั๊กเพื่อโจมตีเว็บไซต์ PHP แบบจำนวนมาก หากเว็บไซต์ PHP ของคุณถูกแฮก มีโอกาสสูงที่เป็นปลั๊กอินหรือธีมที่เขียนโค้ดไม่ดี
11. PHP Package ที่ถูกบุกครอบ (Compromised PHP Package)
ยังมีความเป็นไปได้ว่าไลบรารีและแพ็กเกจ PHP อาจมีช่องโหว่ สิ่งเดียวกันอาจเกิดขึ้นกับภาษาอื่นๆ ไม่กี่วันมานี้ PHP PEAR package manager ถูกบุกครอบโดยโจมตี โจมตีแทนที่ตัวต้นฉบับด้วยโค้ดที่ฉีดเข้าไป ซึ่งถูกดาวน์โหลดโดยผู้ใช้ที่ไม่รู้ตัว แพ็กเกจนี้ถูกใช้บนเว็บไซต์ของพวกเขาสำหรับค้นหาและดาวน์โหลดไลบรารีฟรีที่เขียนด้วย PHP แม้กรณีเช่นนี้จะพบได้นادر แต่ความเป็นไปได้ของการโจมตีเว็บไซต์ PHP แบบกำหนดเองจากช่องโหว่ zero-day ไม่สามารถมองข้ามได้
การโจมตีทางสังคมวิศวกรรม (Social Engineering Attacks)
12. Phishing
แอดมินของเว็บไซต์ PHP แบบกำหนดเองของคุณได้รับเมลจาก принซ์ไนจีเรียเมื่อเร็วๆ นี้ไหม? การโจมตีแบบนี้ออกแบบมาเพื่อหลอกแอดมินเว็บให้เปิดเผยข้อมูลละเอียดอ่อนของเว็บไซต์ PHP นำไปสู่การโจมตีเว็บไซต์ PHP ดังนั้น เพื่ออยู่ปลอดภัยจาก phishing ให้กรองอีเมลไปยังโดเมนของเว็บไซต์ PHP!
13. Tailgating
Tailgating เป็นอีกรูปแบบของการโจมตี phishing ภายใต้การโจมตีนี้ โจมตีจะบุกครอบบัญชีผู้ใช้ระดับต่ำก่อน แล้วใช้มันเพื่อขยายสิทธิ์ (escalate privileges) Tailgating ถูกพบในกรณีศึกษาของนักวิจัยของเรา และใช้กันทั่วไปเพื่อหลบเลี่ยงการตรวจจับ ผลของ tailgating อาจแตกต่างกัน ตั้งแต่การขโมยข้อมูลจนถึงเว็บไซต์ PHP ถูกแฮก
การรักษาความปลอดภัยเว็บไซต์ PHP แบบกำหนดเอง
ตั้งค่าสิทธิ์ให้ถูกต้อง (Set Correct Permissions)
PHP มีฟังก์ชัน 3 ตัวสำหรับตรวจสอบสิทธิ์ไฟล์:
- is_readable(): คืนค่า true หากผู้ใช้ได้รับอนุญาตให้อ่านไฟล์ PHP
- is_writable(): คืนค่า true หากผู้ใช้ได้รับอนุญาตให้เขียนไฟล์ PHP
- is_executable(): คืนค่า true หากผู้ใช้ได้รับอนุญาตให้รันไฟล์ PHP
เช่นเดียวกัน ฟังก์ชัน chmod() ของ PHP สามารถใช้แก้ไขสิทธิ์ไฟล์ได้ เพียงใส่ชื่อไฟล์พร้อมสิทธิ์ เช่น "chmod($RandomFile, 0644);" ในรูปภาพด้านล่างเป็นรายการสิทธิ์ไฟล์ครบและสิ่งที่มันทำ นอกจากนี้ ต้องแน่ใจว่าเพิ่ม '0' นำหน้าสิทธิ์ไฟล์ เพื่อระบุให้ PHP interpreter ทราบว่าค่าอินพุตเป็นฐานแปด (octal)
ตั้งรหัสผ่านที่ปลอดภัย (Set A Secure Password)
ให้แน่ใจว่ารหัสผ่านของเว็บไซต์ PHP แบบกำหนดเองของคุณปลอดภัย ทำให้เป็นการผสมผสานที่ดีของตัวเลข ตัวอักษร และสัญลักษณ์ นอกจากนี้ ก่อนตั้งรหัสผ่าน ขั้นตอนป้องกันคือตรวจสอบพจนานุกรมรหัสผ่านยอดนิยมอย่าง Rockyou.txt ว่ารหัสผ่านที่จะตั้งไม่อยู่ในนั้น สำหรับผู้ใช้ Linux คำสั่ง Grep สามารถช่วยค้นหาในไฟล์ขนาดใหญ่ได้ง่าย เพียงค้นหา grep -i '*YourNewpass*' rockyou.txt นอกจากนี้ เพื่อหลีกเลี่ยงความยุ่งยากในการสร้างรหัสผ่านใหม่ เครื่องมือออนไลน์อื่นๆ ก็สามารถใช้ได้เพื่อสร้างรหัสผ่านที่ปลอดภัย ยาว และสุ่ม
ปิดใช้งาน Directory Indexing
เพื่อปิด indexing ในไดเรกทอรีเฉพาะ ให้เพิ่มโค้ดต่อไปนี้ลงในไฟล์ .htaccess (หากไม่มี .htaccess ให้สร้างใหม่):
Options -Indexes
ใช้โฮสติ้งที่ปลอดภัย (Use Secure Hosting)
โดยทั่วไปขณะหาบริการโฮสติ้ง ให้แน่ใจว่ามีไฟร์วอลล์หรือโซลูชันความปลอดภัย เช่น Astra Security ที่มีพันธมิตรโฮสติ้งรวม นอกจากนี้ ให้แน่ใจว่ามี subnetting เพื่อแยกเว็บไซต์ของคุณจากเว็บไซต์อื่นที่รันบนเซิร์ฟเวอร์เดียวกัน
ตรวจสอบโค้ด PHP (PHP Code Audit)
เมื่อเว็บไซต์ PHP แบบกำหนดเองถูกสร้างแล้ว การสร้างใหม่จากศูนย์จะไม่คุ้มค่าทางเศรษฐกิจ ดังนั้น การตรวจสอบโค้ด (code auditing) จึงเป็นวิธีที่ดีที่สุดในการจับช่องโหว่ในเว็บไซต์ PHP ก่อนที่โจมตีจะทำ Astra Security มีชุมชนแฮกเกอร์ที่ยอดเยี่ยมสำหรับการ audit และ pentest ความปลอดภัยของเว็บไซต์ของคุณ