1. La seguridad en WordPress
está sobrevalorada
Aprendiendo a vivir peligrosamente y feliz con tu web
Fernando Tellado
@fernandot
#PONTEWORDCAMP
2. Bio:
Culpable de Ayuda WordPress
Profesor, consultor, escritor
Admin es.WordPress.org
GTE WordPress España
Brand Ambassador SiteGround
España
Brand Ambassador YITH
Promotor CampusWP
Organizador WooCommerce
Madrid y WordCamp Madrid
Presidente ADEWEB
Autor de varios libros
WordPress
Fernando Tellado
@fernandot
#PONTEWORDCAMP
3. ¿Es wordpress seguro?
wordpress es Bastante seguro
Los plugins son peligrosos
Los temas son peligrosos
los usuarios son muy
peligrosos
Fernando Tellado
@fernandot
#PONTEWORDCAMP
4. hardening wordpress
actualiza, actualiza, actualiza
contraseñas seguras
plugin de seguridad
backup
Fernando Tellado
@fernandot
#PONTEWORDCAMPhttps://codex.wordpress.org/Hardening_WordPress
23. O.W.A.S.P. TOP 10
A1 - INYECCIÓN
A2 - PÉRDIDA DE AUTENTIFICACIÓN
A3 - EXPOSICIÓN DE DATOS
SENSIBLES
A4 - ENTIDADES EXTERNAS XML
(XXE)
A5 - PÉRDIDA DEL CONTROL DE
ACCESO
A6 - CONFIGURACIÓN DE
SEGURIDAD INCORRECTA
A7 - CROSS SITE SCRIPTING (XSS)
A8 - DESERIALIZACIÓN SEGURA
A9 - USO DE COMPONENTES CON
VULNERABILIDADES CONOCIDAS
A10 - REGISTRO Y MONITOREO
INSUFICIENTES
Fernando Tellado
@fernandot
#PONTEWORDCAMPhttps://www.owasp.org/images/5/5e/OWASP-Top-10-2017-es.pdf
25. a1 - inyección
siempre versiones seguras de
wordpress
plugins seguros y bien programados (no
versiones piratas)
temas seguros y bien programados (no
versiones piratas)
buenas contraseñas, sí
nada "por defecto" (usuario admin,
prefijo wp_, /?author=1)
moderación de comentarios
hosting de calidad, con medidas
específicas de seguridad para
wordpress
hosting con versiones seguras de
software y waf
PERMISOS 400 EN ARCHIVOS SENSIBLES
(.HTACCESS, WP-CONFIG.PHP)
mueve el archivo wp-config.php al
directorio superior
desactiva ejecución php
Fernando Tellado
@fernandot
#PONTEWORDCAMP
27. a1 - inyección
Fernando Tellado
@fernandot
#PONTEWORDCAMP
<FilesMatch “.(php|php.)$”>
Order Allow,Deny
Deny from all
</FilesMatch>
.htaccess
28. a1 - inyección
Fernando Tellado
@fernandot
#PONTEWORDCAMP
if (!is_admin()) {
if (preg_match('/author=([0-9]*)/i',
$_SERVER['QUERY_STRING'])) die();
add_filter('redirect_canonical',
'shapeSpace_check_enum', 10, 2);
}
function shapeSpace_check_enum($redirect, $request) {
if (preg_match('/?author=([0-9]*)(/*)/i', $request))
die();
else return $redirect;
}
functions.php
29. a2 - pérdida de autentificación
siempre versiones seguras
de TODO (NO VERSIONES
PIRATAS)
buenas contraseñas, sí
nada "por defecto" (usuario
admin, prefijo wp_, /?
author=1)
define las secret_keys de
wordpress en wp-config.php
no mostrar errores de login
solo 2 administradores, no
para tareas habituales
doble verificación
Fernando Tellado
@fernandot
#PONTEWORDCAMP
30. a2 - pérdida de autentificación
Fernando Tellado
@fernandot
#PONTEWORDCAMP
add_filter('login_errors',create_function('$a', "return null;"));
functions.php
31. a2 - pérdida de autentificación
Fernando Tellado
@fernandot
#PONTEWORDCAMP
<files wp-config.php>
order allow,deny
deny from all
</files>
<FilesMatch "^.">
Order allow, deny
Deny from all
</FilesMatch>
.htaccess
32. A3 - EXPOSICIÓN DE DATOS
SENSIBLES
¿te acuerdas del RGPD?
hosting rgpd
hosting pci compliance
aplica todo lo visto en a1 y
a2
buena gestión de permisos de
usuarios
borrado programado de
datos sensibles
ssl = https
Fernando Tellado
@fernandot
#PONTEWORDCAMP
33. A4 - ENTIDADES EXTERNAS XML
(XXE)
software original y de calidad (a1)
evita la carga de extensiones externas (DOM, XMLWRITER, XMLREADER)
EVITA CUALQUIER PARSER XML
Fernando Tellado
@fernandot
#PONTEWORDCAMP
34. A4 - ENTIDADES EXTERNAS XML
(XXE)
software original y de calidad (a1)
evita la carga de extensiones externas (DOM, XMLWRITER, XMLREADER)
EVITA CUALQUIER PARSER XML
EVITA PARSERS EN PHP:
Fernando Tellado
@fernandot
#PONTEWORDCAMP
libxml_disable_entity_loader(true);
35. A5 - PÉRDIDA DEL CONTROL DE
ACCESO
aplica las medidas para a1 y a2
controla las llamadas de las apis (json rest api
especialmente)
ten siempre a mano backups
desactiva xml-rpc
Fernando Tellado
@fernandot
#PONTEWORDCAMP
36. A5 - PÉRDIDA DEL CONTROL DE
ACCESO
Fernando Tellado
@fernandot
#PONTEWORDCAMP
<Files xmlrpc.php>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
</Files>
.htaccess
37. A5 - PÉRDIDA DEL CONTROL DE
ACCESO
Fernando Tellado
@fernandot
#PONTEWORDCAMP
RewriteCond %{REQUEST_METHOD} ^(GET|POST|
PUT|PATCH|DELETE) [NC]
RewriteCond %{REQUEST_URI} ^.*wp-json/wp/
[NC]
RewriteRule ^(.*)$ - [F]
.htaccess
38. A5 - PÉRDIDA DEL CONTROL DE
ACCESO
Fernando Tellado
@fernandot
#PONTEWORDCAMP
location = /xmlrpc.php {
deny all;
}
nginx
39. A6 - CONFIGURACIÓN DE SEGURIDAD
INCORRECTA
No uses nada por defecto, tampoco en tu router, móvil,
ordenador
no uses permisos de archivos y carpetas incorrectos (650 para
archivos, 750 para carpetas, 400 para .htaccess y wp-
config.php)
recuerda a1 y a2
Fernando Tellado
@fernandot
#PONTEWORDCAMP
40. A7 - CROSS SITE SCRIPTING (XSS)
es la vulnerabilidad más común y extendida
software actualizado y con garantías = a1
desarrollador: valida, sanea y escapa todo …
Fernando Tellado
@fernandot
#PONTEWORDCAMP
41. A7 - CROSS SITE SCRIPTING (XSS)
Fernando Tellado
@fernandot
#PONTEWORDCAMP
is_numeric()
preg_match()
filter_var()
in_array()
VALIDA todo sanea todo escapa todo
sanitize_email
sanitize_file_name
sanitize_html_class
sanitize_text_field
sanitize_textarea_field
esc_url_raw
sanitize_option
sanitize_meta
wp_kses
sanitize_key
sanitize_user
sanitize_mime_type
sanitize_title
wp_filter_post_kses
esc_html
esc_url
esc_js
esc_attr
esc_textarea
42. A8 - DESERIALIZACIÓN SEGURA
afecta a cachés, bases de datos, tokens de apis, a todo
wordpress
uso de objetos serializados desde fuentes inseguras
mantén todo actualizado
aplica a1 a muerte
Fernando Tellado
@fernandot
#PONTEWORDCAMP
43. A9 - USO DE COMPONENTES CON
VULNERABILIDADES CONOCIDAS
https://wpscans.com/
https://sitecheck.sucuri.net/
https://wpvulndb.com/
https://www.pluginvulnerabilities.com/
Fernando Tellado
@fernandot
#PONTEWORDCAMP
44. A10 - REGISTRO Y MONITOREO
INSUFICIENTES
BUSCA CÓDIGO OFUSCADO
BUSCA CÓDIGO BASE64
BUSCA LLAMADAS AL SISTEMA (exec,
passthru, system, shell_exec,
etc.)
BUSCA EJECUCIONES DE CÓDIGO PHP
(eval, assert, preg_replace, etc.)
BUSCA EXPOSICIONES DE
INFORMACIÓN (phpinfo, getenv,
getmygid/pid/uid, etc.)
BUSCA FUNCIONES DEL SISTEMA DE
ARCHIVOS (fopen, bz/gzopen,
chgrp/own/mod, etc.)
¿Te acuerdas del RGPD?: https://
es.wordpress.org/plugins/wp-
security-audit-log/
Fernando Tellado
@fernandot
#PONTEWORDCAMP
45. HOJA DE RUTA DESARROLLADORES
DEFINIR SEGURIDAD Y REQUISITOS DE SEGURIDAD (ASVS)
SEGURIDAD POR DISEÑO (MASTER CHEAT SHEET)
controles estándar de seguridad (proactive controls)
ciclo de vida de desarrollo seguro (Samm)
EDUCAR EN SEGURIDAD
Fernando Tellado
@fernandot
#PONTEWORDCAMPhttps://www.owasp.org/images/5/5e/OWASP-Top-10-2017-es.pdf