
Un'analisi statica del codice per WordPress (e PHP)

Un'analisi statica del codice per plugin/temi WordPress (e PHP)
Basta clonare il repository, installare i requisiti ed eseguire lo script
$ git clone https://github.com/webarx-security/wpbullet wpbullet$ cd wpbullet$ pip install -r requirements.txt$ python wpbullet.pyOpzioni disponibili:
--path (obbligatorio) Percorso di sistema o URL di download
Esempi:
--path="/path/to/plugin"
--path="https://wordpress.org/plugins/example-plugin"
--path="https://downloads.wordpress.org/plugin/example-plugin.1.5.zip"
--enabled (opzionale) Controlla solo i moduli specificati, es. --enabled="SQLInjection,CrossSiteScripting"
--disabled (opzionale) Non controllare i moduli specificati, es. --disabled="SQLInjection,CrossSiteScripting"
--cleanup (opzionale) Rimuove automaticamente il contenuto della cartella .temp dopo la scansione di un plugin scaricato da remoto (booleano)
--report (opzionale) Salva il risultato nella directory reports/ in formato JSON (booleano)
$ python wpbullet.py --path="/var/www/wp-content/plugins/plugin-name"
La creazione di un modulo è flessibile e permette di sovrascrivere i metodi di BaseClass per ogni modulo, oltre a creare metodi propri.
Ogni modulo nella directory Modules implementa proprietà e metodi da core.modules.BaseClass,
quindi il parametro richiesto per ogni modulo è BaseClass.
Una volta creato, il modulo deve essere importato in modules/__init__.py. Il nome del modulo e della classe devono essere coerenti
affinché il modulo venga caricato.
Se apri una pull request per aggiungere un nuovo modulo, fornisci anche i test unitari per il tuo modulo.
Modules/ExampleVulnerability.py
from core.modules import BaseClass
class ExampleVulnerability(object):
# Nome della vulnerabilità
name = "Cross-site Scripting"
# Gravità della vulnerabilità
severity = "Low-Medium"
# Funzioni che causano la vulnerabilità
functions = [
"print"
"echo"
]
# Funzioni/regex che prevengono lo sfruttamento
blacklist = [
"htmlspecialchars",
"esc_attr"
]
Il pattern regex viene generato in core.modules.BaseClass.build_pattern e quindi può essere sovrascritto in
ciascuna classe del modulo.
Modules/ExampleVulnerability.py
import copy
...
# Costruisce un pattern regex dinamico per individuare le vulnerabilità nel contenuto dato
def build_pattern(self, content, file):
user_input = copy.deepcopy(self.user_input)
variables = self.get_input_variables(self, content)
if variables:
user_input.extend(variables)
if self.blacklist:
blacklist_pattern = r"(?!(\s?)+(.*(" + '|'.join(self.blacklist) + ")))"
else:
blacklist_pattern = ""
self.functions = [self.functions_prefix + x for x in self.functions]
pattern = r"((" + '|'.join(self.functions) + ")\s{0,}\(?\s{0,1}" + blacklist_pattern + ".*(" + '|'.join(user_input) + ").*)"
return pattern
Esecuzione dei test unitari: $ python3 -m unittest