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 में Deny from all जोड़ना, (3) Nginx में location ~ /wp-content/uploads/.*\.php$ से deny all करना, (4) wp_handle_upload_prefilter हुक से PHP अपलोड को ही अस्वीकार करना, (5) हर घंटे के cron से uploads के अंदर PHP फ़ाइलों की निगरानी करना।

WordPress के बारे में सवाल हैं? इस साइट के प्रकाशक जापान में हैं और जापानी में जवाब देते हैं। संपर्क (जापानी)

お気軽にご相談ください

お見積りへ お問い合わせへ
▲