Wpbullet Un análisis de código estático para WordPress (y PHP)


Un análisis de código estático para WordPress Complementos / Temas (y PHP) 

Instalación
Simplemente clonar el repositorio, instalar los requisitos y ejecutar la secuencia de comandos
  • $ git clone https://github.com/webarx-security/wpbullet wpbullet
  • $ cd wpbullet
  • $ pip install -r requirements.txt
  • $ python wpbullet.py


Uso
Opciones disponibles:
--path (required) System path or download URL 
Examples:
--path="/path/to/plugin"
--path="https://wordpress.org/plugins/example-plugin"
--path="https://downloads.wordpress.org/plugin/example-plugin.1.5.zip"

--enabled (optional) Check only for given modules, ex. --enabled="SQLInjection,CrossSiteScripting"
--disabled (optional) Don't check for given modules, ex. --disabled="SQLInjection,CrossSiteScripting"
--cleanup (optional) Automatically remove content of .temp folder after scanning remotely downloaded plugin

$ python wpbullet.py --path="/var/www/wp-content/plugins/plugin-name"

La creación de módulos La
creación de un módulo es flexible y permite anular losBaseClassmétodos para cada módulo, así como crear sus propios métodos.
Cada módulo delModulesdirectorio está implementando propiedades y métodoscore.modules.BaseClass, por lo tanto, cada parámetro requerido es unaBaseClass
vez creado, el módulo debe importarse.modules/__init__.pyEl módulo y el nombre de la clase deben ser coherentes para que el módulo se cargue. 
Si está abriendo una solicitud de extracción para agregar un nuevo módulo, también proporcione pruebas unitarias para su módulo. 

Plantilla de módulo
Modules/ExampleVulnerability.py
from core.modules import BaseClass


class ExampleVulnerability(object):

    # Vulnerability name
    name = "Cross-site Scripting"

    # Vulnerability severity
    severity = "Low-Medium"

    # Functions causing vulnerability
    functions = [
        "print"
        "echo"
    ]

    # Functions/regex that prevent exploitation
    blacklist = [
        "htmlspecialchars",
        "esc_attr"
    ]

Anulación de patrón de coincidencia de
expresiones regulares El patrón de expresiones regulares se genera core.modules.BaseClass.build_patterny, por lo tanto, se puede sobrescribir en cada clase de módulo.
Modules/ExampleVulnerability.py
import copy


...
# Build dynamic regex pattern to locate vulnerabilities in given content
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

Pruebas de
unidad de prueba de prueba:$ python3 -m unittest


Comentarios