Scanarea de malware prin WP-CLI este o metodă esențială pentru situațiile în care un plugin…

Automatizarea scanării de securitate WordPress cu Python
Automatizarea scanării de securitate WordPress cu Python. Python este limbajul ideal pentru crearea de instrumente automatizate de scanare a securității WordPress, datorită bibliotecilor sale extinse pentru cereri HTTP, parsare HTML și analiză de date.
Scanarea manuală a securității este consumatoare de timp și predispusă la erori umane. Automatizarea cu Python vă permite să verificați zeci de site-uri în minute.
Automatizarea scanării de securitate WordPress cu Python
Un scanner de securitate WordPress automatizat verifică versiunile software-ului, configurările de securitate, header-ele HTTP, expunerea fișierelor sensibile și vulnerabilitățile cunoscute. Python oferă toate instrumentele necesare pentru construirea unui astfel de scanner.
Vom construi pas cu pas un scanner funcțional pe care îl puteți personaliza conform nevoilor dumneavoastră.
Configurarea mediului Python
Înainte de a începe, instalați bibliotecile necesare pentru scanare și analiză.
# Creare mediu virtual Python
python3 -m venv wp-scanner
source wp-scanner/bin/activate # Linux/Mac
# wp-scannerScriptsactivate # Windows
# Instalare biblioteci necesare
pip install requests beautifulsoup4 urllib3 colorama- requests: pentru efectuarea cererilor HTTP către site-ul WordPress
- beautifulsoup4: pentru parsarea și analiza codului HTML
- urllib3: pentru gestionarea avansată a conexiunilor HTTP
- colorama: pentru afișarea rezultatelor color în terminal
Detectarea versiunii WordPress
Versiunea WordPress expusă public permite atacatorilor să identifice vulnerabilitățile specifice acelei versiuni. Primul pas al scanării este detectarea versiunii.
import requests
from bs4 import BeautifulSoup
import re
def detect_wp_version(url):
"""Detectează versiunea WordPress prin multiple metode."""
versions_found = []
# Metoda 1: Meta generator tag
try:
response = requests.get(url, timeout=10, verify=True)
soup = BeautifulSoup(response.text, 'html.parser')
generator = soup.find('meta', attrs={'name': 'generator'})
if generator and 'WordPress' in generator.get('content', ''):
version = generator['content'].replace('WordPress ', '')
versions_found.append(('meta_generator', version))
except requests.RequestException as e:
print(f"Eroare cerere: {e}")
# Metoda 2: Feed RSS
try:
feed_url = f"{url.rstrip('/')}/feed/"
response = requests.get(feed_url, timeout=10)
match = re.search(r'generator>https://wordpress.org/?v=([d.]+)', response.text)
if match:
versions_found.append(('rss_feed', match.group(1)))
except requests.RequestException:
pass
# Metoda 3: readme.html
try:
readme_url = f"{url.rstrip('/')}/readme.html"
response = requests.get(readme_url, timeout=10)
if response.status_code == 200:
match = re.search(r'Version ([d.]+)', response.text)
if match:
versions_found.append(('readme_html', match.group(1)))
except requests.RequestException:
pass
return versions_found
# Utilizare
results = detect_wp_version("https://example.com")
for method, version in results:
print(f"Versiune detectată prin {method}: {version}")- Verificarea prin multiple metode crește acuratețea detectării
- Meta generator tag este cel mai comun indicator al versiunii WordPress
- Fișierul readme.html trebuie șters sau blocat pe site-urile de producție
- Versiunile vechi de WordPress au vulnerabilități cunoscute cu exploit-uri publice
Verificarea header-elor de securitate
Header-ele HTTP de securitate protejează site-ul împotriva unor categorii întregi de atacuri. Absența lor indică configurări de securitate incomplete.
def check_security_headers(url):
"""Verifică prezența header-elor de securitate HTTP."""
headers_to_check = {
'Strict-Transport-Security': 'HSTS - forțează HTTPS',
'X-Content-Type-Options': 'Previne MIME type sniffing',
'X-Frame-Options': 'Protecție clickjacking',
'X-XSS-Protection': 'Filtru XSS browser',
'Content-Security-Policy': 'Politică securitate conținut',
'Referrer-Policy': 'Control referrer',
'Permissions-Policy': 'Control funcționalități browser'
}
try:
response = requests.get(url, timeout=10)
print(f"nHeader-e securitate pentru {url}:")
print("=" * 60)
score = 0
for header, description in headers_to_check.items():
value = response.headers.get(header, None)
if value:
print(f" [OK] {header}: {value[:60]}")
score += 1
else:
print(f" [LIPSĂ] {header} - {description}")
print(f"nScor: {score}/{len(headers_to_check)}")
return score
except requests.RequestException as e:
print(f"Eroare: {e}")
return 0
check_security_headers("https://www.wpsecurity.ro")- Strict-Transport-Security forțează conexiunea HTTPS și previne atacurile downgrade
- X-Frame-Options previne încadrarea site-ului în iframe-uri pe alte domenii (clickjacking)
- Content-Security-Policy controlează sursele de conținut permise pe pagini
- Un scor de 7/7 indică o configurare completă a header-elor de securitate
Scanarea fișierelor sensibile expuse
Multe site-uri WordPress expun accidental fișiere care conțin informații sensibile. Verificarea automată a acestor fișiere este un pas important în audit.
def scan_sensitive_files(url):
"""Verifică accesibilitatea fișierelor sensibile."""
sensitive_paths = [
('/wp-config.php', 'Fișier configurare WordPress'),
('/wp-config.php.bak', 'Backup wp-config'),
('/wp-config.php.old', 'Versiune veche wp-config'),
('/.env', 'Variabile de mediu'),
('/readme.html', 'Readme WordPress cu versiune'),
('/license.txt', 'Licență WordPress'),
('/wp-admin/install.php', 'Script instalare WordPress'),
('/wp-content/debug.log', 'Log debug PHP'),
('/wp-content/uploads/', 'Director uploads listabil'),
('/wp-includes/', 'Director wp-includes listabil'),
('/.git/config', 'Repository Git expus'),
('/.htaccess', 'Fișier Apache configurare'),
('/xmlrpc.php', 'XML-RPC activ'),
('/wp-json/wp/v2/users', 'API utilizatori expus'),
('/wp-cron.php', 'WP-Cron accesibil')
]
base_url = url.rstrip('/')
exposed = []
print(f"nScanare fișiere sensibile: {url}")
print("=" * 60)
for path, description in sensitive_paths:
try:
test_url = f"{base_url}{path}"
response = requests.get(test_url, timeout=5, allow_redirects=False)
if response.status_code == 200:
size = len(response.content)
if size > 0:
print(f" [EXPUS] {path} ({size} bytes) - {description}")
exposed.append(path)
elif response.status_code == 403:
print(f" [PROTEJAT] {path} - Acces blocat (403)")
else:
print(f" [OK] {path} - Nu este accesibil ({response.status_code})")
except requests.RequestException:
print(f" [EROARE] {path} - Nu s-a putut verifica")
print(f"nFișiere expuse: {len(exposed)}/{len(sensitive_paths)}")
return exposed
scan_sensitive_files("https://example.com")- wp-config.php.bak sau .old sunt cel mai periculos tip de fișier expus
- debug.log poate conține erori PHP cu informații sensibile
- API-ul /wp-json/wp/v2/users expune lista de utilizatori WordPress
- Directoarele listabile permit atacatorilor să vadă structura fișierelor
Scanarea completă automatizată
Combinați toate verificările într-un script complet care generează un raport de securitate.
import json
from datetime import datetime
def full_security_scan(url):
"""Scanare completă de securitate WordPress."""
report = {
'url': url,
'scan_date': datetime.now().isoformat(),
'wordpress_version': [],
'security_headers_score': 0,
'exposed_files': [],
'ssl_valid': False,
'risk_level': 'necunoscut'
}
separator = "=" * 60
print("n" + separator)
print("SCANARE SECURITATE: " + url)
print("Data: " + report["scan_date"])
print(separator)
# Verificare SSL
try:
requests.get(url.replace('http://', 'https://'), timeout=5, verify=True)
report['ssl_valid'] = True
print("n[OK] Certificat SSL valid")
except Exception:
print("n[PERICOL] Certificat SSL invalid sau lipsă!")
# Detectare versiune
report['wordpress_version'] = detect_wp_version(url)
# Header-e securitate
report['security_headers_score'] = check_security_headers(url)
# Fișiere sensibile
report['exposed_files'] = scan_sensitive_files(url)
# Calculare nivel risc
risk_score = 0
risk_score += len(report['exposed_files']) * 2
risk_score += (7 - report['security_headers_score'])
if not report['ssl_valid']:
risk_score += 5
if risk_score <= 3:
report['risk_level'] = 'SCĂZUT'
elif risk_score <= 7:
report['risk_level'] = 'MEDIU'
else:
report['risk_level'] = 'RIDICAT'
separator = "=" * 60
print("n" + separator)
print("NIVEL RISC: " + report["risk_level"] + " (scor: " + str(risk_score) + ")")
print(separator)
# Salvare raport JSON
filename = f"scan_{url.replace('https://','').replace('/','_')}_{datetime.now().strftime('%Y%m%d')}.json"
with open(filename, 'w') as f:
json.dump(report, f, indent=2, default=str)
print(f"nRaport salvat: {filename}")
return report
# Scanare
full_security_scan("https://www.wpsecurity.ro")- Raportul JSON poate fi procesat automat de alte instrumente
- Nivelul de risc se calculează pe baza tuturor verificărilor combinate
- Scriptul poate fi extins cu verificări suplimentare specifice nevoilor dumneavoastră
- Programați scanarea zilnică prin cron pentru monitorizare continuă
Automatizarea scanării de securitate cu Python vă oferă control complet asupra verificărilor efectuate pe site-urile WordPress. Pentru mai multe instrumente de securitate, vizitați secțiunea de securitate cibernetică și blogul nostru. Echipa WPSecurity oferă servicii speciale de audit automat, contactați-ne pentru detalii.
Despre autor
Dorel Tănase este specialist în optimizarea site-urilor pentru motoarele de căutare. Lucrează în online din 1997 și în SEO din 2007, iar activitatea se desfășoară prin GO SEO MARKETING S.R.L. din Alba Iulia. Se ocupă de audit tehnic, arhitectura site-urilor, conținut și construirea legăturilor.