คำตอบสั้น ๆ: ขั้นตอนรับมือเมื่อเว็บ WordPress ถูกแฮก ตั้งแต่ควบคุมความเสียหาย เก็บหลักฐาน ทำความสะอาดไฟล์และฐานข้อมูล ไปจนถึงปิดช่องโหว่
คู่มือนี้อธิบาย WordPress ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
อาการของเว็บ WordPress ที่ถูกแฮกมีหลายแบบ เช่น หน้าเว็บถูกเปลี่ยนเป็นข้อความแปลกๆ ผู้เข้าชมจากมือถือถูกพาไปเว็บพนันหรือเว็บหลอกลวง Google แสดงคำเตือน "เว็บไซต์นี้อาจถูกแฮก" มีบัญชีผู้ดูแลที่ไม่รู้จักโผล่ขึ้นมา หรือโฮสต์ส่งอีเมล Spam ออกไปเป็นจำนวนมาก
บทความนี้เป็นลำดับขั้นตอนตั้งแต่ควบคุมความเสียหาย เก็บหลักฐาน ทำความสะอาด ไปจนถึงปิดช่องโหว่ไม่ให้โดนซ้ำ สิ่งสำคัญคือต้องทำให้ครบทุกขั้น เพราะถ้าลบแค่ไฟล์ที่เห็นแต่ไม่ปิดทางเข้าหรือไม่เปลี่ยนรหัสผ่าน เว็บมักถูกแฮกกลับมาภายในไม่กี่วัน
สิ่งที่ต้องเตรียม
- สิทธิ์เข้าแผงควบคุมโฮสติ้ง (Plesk หรือ DirectAdmin) หรือสิทธิ์ SSH ที่ใช้
sudoได้ สำหรับ Cloud Server - WP-CLI (แนะนำอย่างยิ่ง ดู จัดการ WordPress ด้วย WP-CLI)
- ไฟล์สำรองที่แน่ใจว่าสร้างก่อนถูกแฮก ถ้ามี
- รายชื่อปลั๊กอินและธีมที่ใช้งานจริง พร้อมแหล่งดาวน์โหลดที่ถูกต้อง
- เครื่องคอมพิวเตอร์ที่สะอาดและสแกนไวรัสแล้ว สำหรับใช้เปลี่ยนรหัสผ่าน
ขั้นตอนที่ 1: ควบคุมความเสียหายก่อน
เป้าหมายคือหยุดไม่ให้ผู้เข้าชมได้รับอันตรายเพิ่ม และไม่ให้ผู้บุกรุกทำอะไรต่อ
- ถ้าเว็บกำลังพาผู้ใช้ไปเว็บอันตราย ให้ปิดเว็บชั่วคราวด้วยหน้า Maintenance แบบไฟล์ HTML ธรรมดา หรือจำกัดการเข้าถึงเฉพาะ IP ของคุณ
- ตรวจว่ามีโปรเซสแปลกๆ ทำงานอยู่หรือไม่ (สำหรับ Cloud Server) ด้วย
ps aux --sort=-%cpu | headโปรเซสที่รันจาก/tmpหรือชื่อสุ่มควรตรวจสอบเป็นพิเศษ - ถ้าเครื่องส่งอีเมล Spam ออกไป ให้หยุดคิวอีเมลและตรวจว่า IP ติด Blacklist หรือไม่ ดู ตรวจสอบและขอถอด IP ออกจาก Blacklist อีเมล
ขั้นตอนที่ 2: สำรองสภาพปัจจุบันไว้เป็นหลักฐาน
ก่อนลบหรือแก้อะไร ให้สำรองทั้งไฟล์และฐานข้อมูลในสภาพที่ถูกแฮกแยกไว้ ใช้สำหรับตรวจย้อนหลังว่าเข้ามาทางไหน และกู้ข้อมูลที่อาจลบผิด
cd /var/www/example.com
wp db export /root/hacked-db-$(date +%F).sql
tar czf /root/hacked-files-$(date +%F).tar.gz .
เก็บไฟล์เหล่านี้ไว้นอกโฟลเดอร์เว็บ (อย่าวางไว้ใน public_html เพราะจะดาวน์โหลดได้จากภายนอก) บน Plesk และ DirectAdmin ใช้ระบบสำรองของแผงควบคุมได้ ดู สำรองและกู้คืนเว็บไซต์ด้วย Backup Manager บน Plesk หรือ สำรองและกู้คืนข้อมูลบน DirectAdmin
ขั้นตอนที่ 3: ตัดสินใจว่าจะกู้จากไฟล์สำรองหรือทำความสะอาด
| สถานการณ์ | แนวทางที่เหมาะ |
|---|---|
| มีไฟล์สำรองที่แน่ใจว่าสะอาด และเนื้อหาหลังจากนั้นเปลี่ยนไม่มาก | กู้จากไฟล์สำรอง แล้วอัปเดตทุกอย่างและเปลี่ยนรหัสผ่านทันที |
| ไม่รู้ว่าถูกแฮกตั้งแต่เมื่อไร หรือไม่มีไฟล์สำรอง | ทำความสะอาดตามขั้นตอนที่ 4-7 |
| เว็บร้านค้าที่มีคำสั่งซื้อใหม่ทุกวัน | ทำความสะอาด เพื่อไม่ให้ข้อมูลคำสั่งซื้อล่าสุดหาย |
แม้จะกู้จากไฟล์สำรอง ก็ยังต้องทำขั้นตอนที่ 7 และ 8 เพราะช่องโหว่เดิมยังอยู่
ขั้นตอนที่ 4: ตรวจไฟล์ Core, ปลั๊กอิน และธีม
WP-CLI เทียบไฟล์ของ WordPress กับค่า Checksum ทางการได้
wp core verify-checksums
wp plugin verify-checksums --all
ถ้าผลแสดง File doesn't verify against checksum หรือ File should not exist คือไฟล์ถูกแก้หรือถูกเพิ่มเข้ามา ส่วนปลั๊กอินที่ไม่ได้มาจาก WordPress.org (ปลั๊กอินเสียเงิน) จะตรวจด้วยคำสั่งนี้ไม่ได้ ต้องดาวน์โหลดชุดใหม่จากผู้พัฒนาโดยตรง
วิธีที่ปลอดภัยที่สุดคือแทนที่ไฟล์ Core ทั้งหมดด้วยชุดใหม่ในเวอร์ชันเดิม โดยไม่แตะโฟลเดอร์ wp-content
wp core download --version=$(wp core version) --force --skip-content
คำสั่งนี้ไม่ลบไฟล์แปลกปลอมที่ถูกเพิ่มเข้ามาใน wp-admin หรือ wp-includes ให้ลบไฟล์ที่ verify-checksums รายงานว่า should not exist ด้วยตนเอง
สำหรับปลั๊กอินจาก WordPress.org ติดตั้งทับด้วยชุดใหม่ได้ทีละตัว
wp plugin install contact-form-7 --force
ลบปลั๊กอินและธีมที่ไม่ได้ใช้ทิ้งทั้งหมด รวมถึงธีมหรือปลั๊กอินเถื่อน (Nulled) ซึ่งเป็นทางเข้าที่พบบ่อยมาก
ขั้นตอนที่ 5: ค้นหาไฟล์ PHP ที่น่าสงสัย
โฟลเดอร์ uploads ไม่ควรมีไฟล์ PHP เลย
find wp-content/uploads -type f -name '*.php'
หาไฟล์ PHP ที่ถูกแก้ภายใน 7 วันที่ผ่านมา (ปรับตัวเลขตามช่วงที่สงสัย)
find . -type f -name '*.php' -mtime -7 -ls
ค้นรูปแบบโค้ดที่มักใช้ซ่อน Backdoor
grep -rlE 'eval\(base64_decode|eval\(gzinflate|str_rot13\(|assert\(\$_(POST|GET|REQUEST)' --include='*.php' .
ผลที่ได้ต้องใช้วิจารณญาณ ปลั๊กอินที่ถูกต้องบางตัวก็ใช้ base64_decode ตามปกติ ให้เปิดดูไฟล์ก่อนลบ และตรวจไฟล์ต่อไปนี้ด้วยตาเสมอ
wp-config.phpมีโค้ดแทรกด้านบนหรือล่างสุดหรือไม่.htaccessมีกฎ Redirect ไปโดเมนแปลกๆ โดยเฉพาะเงื่อนไขตามHTTP_USER_AGENTหรือHTTP_REFERERwp-content/mu-plugins/ซึ่งทำงานอัตโนมัติและไม่แสดงในหน้าปลั๊กอินปกติindex.phpของธีมและfunctions.php