הקובץ /wp-admin/install.php הוא מסך ההתקנה הראשונה של WordPress - שם בוחרים את שם האתר, שם המשתמש ואת הסיסמה הראשונים. אחרי שהאתר חי, הקובץ אמור להחזיר 'Already installed' אבל בעבר היו פרצות שאפשרו להפעיל אותו מחדש בתנאים מסוימים.
למה זה משנה
הסיכון הקריטי של install.php פתוח: אם בסיס הנתונים מתאפס (מחיקה בטעות, התקפה, או deploy לקוי שמייבא DB ריק), התוקף הראשון שיגיע ל-install.php יקבל את חשבון המנהל הראשון של האתר - עם הסיסמה שלו. אחרי שהוא הגדיר את עצמו כמנהל, הוא בעל הבית. גם בלי תרחיש קצה כזה: בעבר התגלו פגיעויות שאפשרו להפעיל את הסקריפט גם כשבסיס הנתונים מאוכלס - פרצות אבטחה ידועות הייתה אחת כזו, וייתכן שיהיו כאלה בעתיד. בנוסף, הקובץ מציג מידע על הגדרות wp-config.php אם יש שגיאת חיבור: שם DB, שם user, שם host. גם ללא ניצול ישיר, זוהי דליפת מידע. הקובץ הזה לא נדרש לפעולה תקינה של אתר חי - אין סיבה להשאיר אותו פתוח.
איך לזהות
הבדיקה מבצעת HTTP HEAD ל-https://example.com/wp-admin/install.php. תשובה 200 (גם אם התוכן הוא 'Already installed') = פתוח. תשובה 403 או 404 = חסום. ידנית: גש בדפדפן ל-https://example.com/wp-admin/install.php במצב גלישה פרטית - אם רואה תוכן כלשהו (טופס התקנה, הודעת 'Already installed', או שגיאת DB) הקובץ נגיש. גם curl:
curl -I https://example.com/wp-admin/install.phpאיך לתקן
- חסום ברמת השרת, לא על ידי מחיקה - מחיקה ידנית תיכנע בעדכון הליבה הבא, כי WordPress יחזיר את הקובץ.
- Apache: צור או ערוך .htaccess בתיקיית /wp-admin/:
<Files install.php> Require all denied </Files> <Files upgrade.php> Require all denied </Files> - Nginx בקונפיג ה-server:
location = /wp-admin/install.php { deny all; return 404; } location = /wp-admin/upgrade.php { deny all; return 404; } - חסום גם את upgrade.php - הוא רץ אחרי עדכון ליבה ויש לו וקטור דומה לניצול. אם יש פגיעות עתידית בו, אותו עיקרון.
- טעינת קונפיג Nginx מחדש: 'sudo nginx -s reload' או דרך הלוח של ספק האחסון.
- בדוק: גש ל-https://example.com/wp-admin/install.php במצב גלישה פרטית - אמור להחזיר 403 או 404, לא טופס.
- בעת עדכון ליבה: WordPress יוריד את הקובץ מחדש, אבל הכלל ב-.htaccess או בקונפיג ה-Nginx יישאר. אין צורך לחזור על התהליך.
טעויות נפוצות
אל תמחק את install.php ידנית - בעדכון הליבה הבא הוא יחזור, וההגנה שיצרת תעלם. השתמש בחסימה ברמת השרת. אל תחסום את כל /wp-admin/ - זה ינתק אותך מלוח הבקרה. החסימה צריכה להיות ספציפית לשני הקבצים. אל תניח שהליבה לבדה דואגת לזה - WordPress עצמו מחזיר 'Already installed' אבל זה לא אומר שלא יהיו פרצות עתידיות. אל תפספס את ה-upgrade.php שהוא לא פחות מסוכן.
בדיקה לאחר תיקון
curl -I https://example.com/wp-admin/install.php - אמור להיות 403 או 404. גם curl על upgrade.php. בדוק שלוח הבקרה הרגיל עדיין עובד (https://example.com/wp-admin/) - אם הוא לא, חסימה רחבה מדי. הרץ שוב את האודיט.
שיקולים נוספים
חסימה דומה רלוונטית גם לקבצים אחרים בתיקיית /wp-admin/ שלא נחוצים בייצור: install-helper.php, ms-delete-site.php (ב-multisite שלא בשימוש), customize.php אם אינך משתמש ב-Customizer. כל אחד מהם הוא וקטור פוטנציאלי. עדיף לעבור על כל קובצי ה-PHP ב-wp-admin/ ולחסום את אלה שאינך משתמש בהם, מאשר להשאיר הכל פתוח.
קישורים לבדיקות קשורות
- קבצים רגישים חשופים - בודק חשיפת קבצים נוספים בשורש האתר.
- דפדוף תיקיית uploads - מונע directory listing שיכול לחשוף קבצים נסתרים.
- הרשאות wp-config - השכבה הבאה אם תוקף הצליח להגיע ל-install.php.