26feb
11

El fichero .htaccess es la primera línea de entrada de cualquier sistema web montado sobre Apache, así que también puede convertirse en la primera línea de defensa frente a ataques de hackers, inyecciones de código o intrusiones.

Además, como su construcción es ya veterana está muy documentada y fácil de configurar. Si usas WordPress y has cambiado la estructura de enlaces permanentes, ya tendrás (por lo menos) un fichero .htaccess en la carpeta raíz de tu instalación.

Las cadenas que añade WordPress suelen ser estas:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Y uno de los mejores, y más simples métodos de proteger tu WordPress es añadir reglas que bloqueen automáticamente peticiones basadas en cadenas en la URL.

Por ejemplo, no hay razón alguna (al menos buena) para que una URL empiece con un corchete “[". Solo hay dos motivos "normales", uno que sea un error de tecleo, y el otro que esté buscando agujeros de seguridad. Así que una primera regla a aplicar para evitar esto sería añadir una regla que provoque una página de error "403 Forbidden" a todo aquel que llegue a tu sitio con la URL comenzando con un corchete.

Añades esto al principio del archivo .htaccess y guardas los cambios:

RedirectMatch 403 \[

¿Quieres más?, pues estamos de suerte porque en Perishable Press han creado algo que han llamado el 5G Firewall, que viene a ser una lista de reglas para .htaccess que bloquea una buena cantidad de posibles atacantes que, en su versión actual, nos ofrece esto:

# 5G FIREWALL from PerishablePress.com

# 5G:[QUERY STRINGS]
<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /
 RewriteCond %{QUERY_STRING} (environ|localhost|mosconfig|scanner) [NC,OR]
 RewriteCond %{QUERY_STRING} (menu|mod|path|tag)\=\.?/? [NC,OR]
 RewriteCond %{QUERY_STRING} boot\.ini  [NC,OR]
 RewriteCond %{QUERY_STRING} echo.*kae  [NC,OR]
 RewriteCond %{QUERY_STRING} etc/passwd [NC,OR]
 RewriteCond %{QUERY_STRING} \=\\%27$   [NC,OR]
 RewriteCond %{QUERY_STRING} \=\\\’$    [NC,OR]
 RewriteCond %{QUERY_STRING} \.\./      [NC,OR]
 RewriteCond %{QUERY_STRING} \:         [NC,OR]
 RewriteCond %{QUERY_STRING} \[         [NC,OR]
 RewriteCond %{QUERY_STRING} \]         [NC]
 RewriteRule .* – [F]
</IfModule>

# 5G:[USER AGENTS]
<IfModule mod_setenvif.c>
 SetEnvIfNoCase User-Agent ^$ keep_out
 SetEnvIfNoCase User-Agent (casper|cmsworldmap|diavol|dotbot)   keep_out
 SetEnvIfNoCase User-Agent (flicky|ia_archiver|jakarta|kmccrew) keep_out
 SetEnvIfNoCase User-Agent (libwww|planetwork|pycurl|skygrid)   keep_out
 <Limit GET POST PUT>
  Order Allow,Deny
  Allow from all
  Deny from env=keep_out
 </Limit>
</IfModule>

# 5G:[REQUEST STRINGS]
<IfModule mod_alias.c>
 RedirectMatch 403 (https?|ftp|php)\://
 RedirectMatch 403 /(cgi|https?|ima|ucp)/
 RedirectMatch 403 (\=\\\’|\=\\%27|/\\\’/?|\)\.css\()$
 RedirectMatch 403 (\,|//|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\|)
 RedirectMatch 403 \.(cgi|asp|aspx|cfg|dll|exe|jsp|mdb|sql|ini|rar)$
 RedirectMatch 403 /(contac|fpw|install|pingserver|register)\.php
 RedirectMatch 403 (base64|crossdomain|localhost|wwwroot)
 RedirectMatch 403 (eval\(|\_vti\_|\(null\)|echo.*kae)
 RedirectMatch 403 \.well\-known/host\-meta
 RedirectMatch 403 /function\.array\-rand
 RedirectMatch 403 \)\;\$\(this\)\.html\(
 RedirectMatch 403 proc/self/environ
 RedirectMatch 403 msnbot\.htm\)\.\_
 RedirectMatch 403 /ref\.outcontrol
 RedirectMatch 403 com\_cropimage
 RedirectMatch 403 indonesia\.htm
 RedirectMatch 403 \{\$itemURL\}
 RedirectMatch 403 function\(\)
 RedirectMatch 403 labels\.rdf
</IfModule>

Estas reglas incluyen la protección contra URLs con corchetes y, como puedes ver, muchísimo más.

Para saber más:

  • http://twitter.com/yggdrasilfs Camelot

    Creo que lees la mente Fernando, justo después del problema que reporté en el blog sobre archivos PHP y JS sacas un artículo sobre el tema y ahora que estoy pensando poner un .htaccess más seguro vienes y ¡zas! publicas esto. Gracias mil.

  • http://twitter.com/t4bLeT Jordi

    +1

  • http://www.pachakamaq.com Fliberty Pérez

    Lamentablemente no he podido efectuar los cambios, me sale error 505.

  • Mat

    Esto creo que es lo que buscaba para impedir código en Base64. Lo que se hablaba en el post anterior sobre infección.

    RedirectMatch 403 (base64|crossdomain|localhost|wwwroot) 

    Mil gracias!

  • http://www.facebook.com/people/Pablo-Gustavo-Diaz/1359817924 Pablo Gustavo Diaz

    Fernando, efectué los cambios tal cual lo propones y también me sale error 505 al intentar acceder al sitio… ¿alguna pista del porqué?

    • Alfredo

      si tienes un pluging de cache seguramente no te funcione correctamente

  • http://twitter.com/dragondeluz Santos Guerra

    NO Funciona en WP MU, si alguien sabe como podría hacerlo funcionar les agradezco.

  • http://www.bajar-juegos-gratis.com.ar/ Naim

    Muchas gracias, siempre me hacen ataque doss o algo asi que me lo bloquea por unos minutos… ¿Esto me ayuda?

  • Clanel74

    Hola FERNANDO este es mi htaccess

    # BEGIN WordPress

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index.php$ – [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress
    –>La diferencia entre el mio y el ejemplo que tu pusistes al inicio es observa:
    Yo–> RewriteRule ^index.php$ – [L]
    Tu–> RewriteRule ^index.php$ – [L]

    MIs preguntas??????
    1-porque esta diferencia es grave?
    -quiero agregar–> RedirectMatch 403 [ <–
    2-donde lo devo colocar especificamente debajo de ?

    Gracias de antemano y disculpa las molestias.

  • Dragondeluz

    Tampoco funciona en instalaciones de WP 3.2.x y 3.1.x asi mismo con el WP MU me da error 500 (error interno del servidor)

  • Pingback: Los 3 modos más comunes de hackear WordPress y cómo evitarlo | Ayuda WordPress