2026年11月12日
2026年11月12日
WordPress के uploads डायरेक्टरी में PHP का चलना बंद करने का तरीका
यह लेख जापानी मूल लेख का स्थानीयकृत संस्करण है। जापानी मूल लेख पढ़ें
परिचय
wp-content/uploads/ वह डायरेक्टरी है जहाँ WordPress तस्वीरें जैसी मीडिया फ़ाइलें सहेजता है। अगर इस डायरेक्टरी में PHP फ़ाइलें रखी जा सकती हैं और चल भी सकती हैं, तो हमलावर वेब शेल (बैकडोर) अपलोड करके कोई भी कोड चला सकता है।
लक्षण और कारण
- मैलवेयर स्कैन में
wp-content/uploads/के अंदर PHP फ़ाइलें मिलीं - सिक्योरिटी प्लगइन ने चेतावनी दी कि “uploads डायरेक्टरी में PHP चलाया जा सकता है”
wp-content/uploads/2024/01/shell.phpजैसे पथ पर कोई संदिग्ध फ़ाइल मिली- फ़ाइल अपलोड सुविधा की कमज़ोरी का फ़ायदा उठाकर वेब शेल रख दिया गया
समाधान के चरण
चरण 1: मौजूदा संदिग्ध PHP फ़ाइलें ढूँढें
# uploads डायरेक्टरी की सभी PHP फ़ाइलें खोजें
find /var/www/html/wp-content/uploads -name "*.php" -type f
find /var/www/html/wp-content/uploads -name "*.phtml" -type f
find /var/www/html/wp-content/uploads -name "*.php5" -type f
# हाल की (7 दिन के भीतर) बनी या बदली PHP फ़ाइलें देखें
find /var/www/html/wp-content/uploads -name "*.php" -mtime -7
# फ़ाइल की सामग्री जाँचें (मैलवेयर के ख़ास पैटर्न)
grep -rl "eval(base64_decode" /var/www/html/wp-content/uploads/
grep -rl "system\|exec\|passthru\|shell_exec" /var/www/html/wp-content/uploads/
# संदिग्ध PHP फ़ाइलें हटाएँ
find /var/www/html/wp-content/uploads -name "*.php" -delete
find /var/www/html/wp-content/uploads -name "*.phtml" -delete
चरण 2: Apache में PHP का चलना बंद करें (.htaccess)
# wp-content/uploads/.htaccess बनाएँ
cat > /var/www/html/wp-content/uploads/.htaccess << 'EOF'
# PHP फ़ाइलों का चलना पूरी तरह रोकें
<FilesMatch "\.(php|phtml|php3|php4|php5|php7|phar|shtml)$">
Order Deny,Allow
Deny from all
</FilesMatch>
# PHP इंजन को ही बंद करें (mod_php इस्तेमाल होने पर)
<IfModule mod_php.c>
php_flag engine off
</IfModule>
# CGI का चलना भी रोकें
Options -ExecCGI
RemoveHandler .php .phtml .php5 .phar
# डायरेक्टरी लिस्टिंग भी बंद करें
Options -Indexes
EOF
chmod 644 /var/www/html/wp-content/uploads/.htaccess
# सेटिंग के बाद जाँच
# टेस्ट के लिए PHP फ़ाइल बनाकर उसे खोलने की कोशिश करें
echo "<?php echo 'test'; ?>" > /var/www/html/wp-content/uploads/test_block.php
curl -o /dev/null -s -w "%{http_code}" https://example.com/wp-content/uploads/test_block.php
# 403 लौटे तो सफल
rm /var/www/html/wp-content/uploads/test_block.php
चरण 3: Nginx में PHP का चलना बंद करें
# /etc/nginx/sites-available/example.com
server {
# ... मौजूदा सेटिंग ...
# uploads डायरेक्टरी में PHP का चलना रोकें
location ~* /wp-content/uploads/.*\.(php|phtml|php5|phar)$ {
deny all;
access_log off;
log_not_found off;
}
# इसे PHP-FPM वाले location से पहले लिखना ज़रूरी है
location ~ \.php$ {
# सामान्य PHP प्रोसेसिंग
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# Nginx सेटिंग जाँचकर लागू करें
sudo nginx -t && sudo systemctl reload nginx
# जाँच
curl -o /dev/null -s -w "%{http_code}" https://example.com/wp-content/uploads/shell.php
# 403 लौटे तो सफल
चरण 4: WordPress की तरफ़ से भी PHP अपलोड रोकें
// functions.php: PHP फ़ाइलों का अपलोड ही रोकें
// (1) PHP एक्सटेंशन को अपलोड-निषेध सूची में जोड़ें
add_filter('upload_mimes', function(array $mimes): array {
// PHP से जुड़े MIME टाइप हटाएँ (एहतियात के तौर पर)
unset($mimes['php'], $mimes['phtml'], $mimes['phar']);
return $mimes;
});
// (2) अपलोड की गई फ़ाइल में PHP की पहचान और अस्वीकृति
add_filter('wp_handle_upload_prefilter', function(array $file): array {
$dangerous_extensions = ['php', 'phtml', 'php3', 'php4', 'php5', 'phar', 'shtml'];
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (in_array($ext, $dangerous_extensions, true)) {
$file['error'] = 'PHP फ़ाइलों का अपलोड प्रतिबंधित है।';
}
// MIME टाइप से भी जाँचें
if (str_contains($file['type'], 'php')) {
$file['error'] = 'PHP फ़ाइलों का अपलोड प्रतिबंधित है।';
}
return $file;
});
चरण 5: नियमित निगरानी लगाएँ
# uploads के अंदर की PHP फ़ाइलों की नियमित निगरानी की स्क्रिप्ट
cat > /usr/local/bin/check-uploads-php.sh << 'EOF'
#!/bin/bash
UPLOADS_DIR="/var/www/html/wp-content/uploads"
ADMIN_EMAIL="admin@example.com"
PHP_FILES=$(find "$UPLOADS_DIR" -name "*.php" -o -name "*.phtml" -o -name "*.phar" 2>/dev/null)
if [ -n "$PHP_FILES" ]; then
echo "चेतावनी: uploads डायरेक्टरी में PHP फ़ाइलें मिली हैं:
$PHP_FILES" | mail -s "[आपातकालीन] WordPress में वेब शेल रखे जाने की आशंका" "$ADMIN_EMAIL"
# स्वचालित हटाना (सावधानी से इस्तेमाल करें)
# find "$UPLOADS_DIR" -name "*.php" -delete
fi
EOF
chmod +x /usr/local/bin/check-uploads-php.sh
# हर घंटे जाँचें
echo "0 * * * * root /usr/local/bin/check-uploads-php.sh" > /etc/cron.d/wp-uploads-php-check
ध्यान देने की बातें
.htaccessमेंphp_flag engine offसिर्फ़mod_phpइस्तेमाल होने पर काम करता है। अगर आपphp-fpm(FastCGI) इस्तेमाल करते हैं तोडायरेक्टिव या Nginx के location ब्लॉक से रोक लगाएँ- Nginx में
location ~ \.php$से पहले uploads का ब्लॉक नियम न लिखा जाए तो बाद वाला नियम प्राथमिकता पा सकता है और फ़ाइल चल सकती है। ब्लॉक नियम हमेशा ऊपर रखें - कुछ प्लगइन (जैसे Slider Revolution आदि) uploads के अंदर
.phpफ़ाइलें रख देते हैं। हटाने से पहले उनका उपयोग जाँचें और अनावश्यक प्लगइन हटाकर ही आगे बढ़ें
सारांश
uploads डायरेक्टरी में PHP का चलना बंद करने के पाँच कदम: (1) find wp-content/uploads -name ".php" से मौजूदा संदिग्ध फ़ाइलें ढूँढकर हटाना, (2) Apache में uploads/.htaccess में जोड़ना, (3) Nginx में location ~ /wp-content/uploads/.*\.php$ से deny all करना, (4) wp_handle_upload_prefilter हुक से PHP अपलोड को ही अस्वीकार करना, (5) हर घंटे के cron से uploads के अंदर PHP फ़ाइलों की निगरानी करना।
WordPress के बारे में सवाल हैं? इस साइट के प्रकाशक जापान में हैं और जापानी में जवाब देते हैं। संपर्क (जापानी)