Usar mod_rewrite como WAF

Iniciado por O_G_T, 6 Noviembre 2009, 05:53 AM

0 Miembros y 1 Visitante están viendo este tema.

O_G_T

 :D antes que nada saludos a todos!!

a no enfadarse por mi nick  ;D ... y tambien disculpas por revivir este post antiguo  :rolleyes:

Pero que os vendrá bien a todos ademas yo puedo aprender de algunas criticas, asi que si os parece bien voy a post algunos codigos que uso en algunas plataformas...
tratare de explicar tal como lo entiendo yo, que no quiere decir que sea como digo, pero funciona.... 

para evitaos un calambre cerebral o un pico de strees por un ataque tos, fiebre o xss  ;D

USEN EL .htaccess!!!!!!!!!!!!!!!!!!

claro que tambien deben usar cosas como
$muestra=htmlentities($_GET[muestra], ENT_QUOTES);
if (!preg_match("/^[a-z]+$/",$_GET[muestra])){
header ("Location: vola.htm");
exit();
}


vamos al .htaccess


RewriteEngine On
Options +FollowSymLinks

RewriteCond %{REQUEST_METHOD}  ^(HEAD|TRACE|DELETE|TRACK) [NC,OR]
RewriteCond %{THE_REQUEST}     ^.*(\\r|\\n|%0A|%0D).* [NC,OR]

RewriteCond %{HTTP_REFERER}    ^(.*)(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]
RewriteCond %{HTTP_COOKIE}     ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]
RewriteCond %{REQUEST_URI}     ^/(,|;|:|<|>|">|"<|/|\\\.\.\\).{0,9999}.* [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(libwww|curl|wget|python|nikto|scan).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]

RewriteCond %{QUERY_STRING}    ^.*(;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark).* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*(localhost|loopback|127\.0\.0\.1).* [NC,OR]

RewriteCond %{QUERY_STRING}    ^.*\.[A-Za-z0-9].* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC]

RewriteRule ^(.*)$ access_log.php


explicacion

con --> ServerSignature Off
ocultamo la versión de apache y los módulos instalados y sus versiones...

con lo siguiente llamaremos al uso de flags distintas
-->NC - No Case: No distingue mayúsculas o minúsculas
OR - Sip, O: Siguiente condición.

forma en que se conecta el cliente con nuestro servidor habilitamos GET o POST
RewriteCond %{REQUEST_METHOD}  ^(HEAD|TRACE|DELETE|TRACK) [NC,OR]

RewriteCond %{THE_REQUEST}     ^.*(\\r|\\n|%0A|%0D).* [NC,OR]
HTTP_REFERER evitamos Test de Intrusión a la web.

evitamos la injecion de archivos, validando los caracteres que sabemos que no contendran nuestros archivos:
RewriteCond %{HTTP_REFERER}    ^(.*)(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]

evitamos el almacenado de caracteres especial en
RewriteCond %{HTTP_COOKIE}     ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]

limitamos los caracteres especiales
RewriteCond %{REQUEST_URI}     ^/(,|;|:|<|>|">|"<|/|\\\.\.\\).{0,9999}.* [NC,OR]

analizamos el navegador para evitar ingreso a bots o automatizados
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(libwww|curl|wget|python|nikto|scan).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]

evitamos algunos XSS, algunos SQL Injection, y Remote Shell Injection
RewriteCond %{QUERY_STRING}    ^.*(;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark).* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*(localhost|loopback|127\.0\.0\.1).* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*\.[A-Za-z0-9].* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC]

si nuestra web recibe algunos de los bloqueos o mejor dicho si el servidor a realizado tareas de bloqueos antes escritos mandamos a los tios a
RewriteRule ^(.*)$ RewriteRule ^(.*)$ access_log.php
en este archivo se puede colocar lo que quieran yo uso uno que le hago creer que ha injectado luego me divierto con el tio ;D, amen de que antes le descargo sin que sepa algunas herramientas....

el ultimo
RewriteRule ^(.*)$ - [F]
evita los mensajes de acceso denegado....

UN EXTRA PARA NUESTRO HTACCESS


## Seguridad extra para PHP
php_flag safe_mode on
php_flag expose_php off
php_flag display_errors off

## Manejo de errores de Apache. Cuando se produzca uno de estos errores, redirigimos a una pagina especial desarrollada por nosotros.
ErrorDocument 401 /error401.html
ErrorDocument 403 /error403.html
ErrorDocument 404 /error404.html


RewriteEngine On

Options +FollowSymLinks
# Evitar escaneos y cualquier intento de manipulación malintencionada
# de la URL. Con esta regla es imposible lanzar ataques de inyección (SQL, XSS, etc)
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(-|\.|') [OR]
RewriteCond %{HTTP_USER_AGENT} ^(.*)(<|>|%3C|%3E)(.*) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget)(.*) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(.*)(libwww-perl|libwwwperl|snoopy|curl|wget|winhttp|python|nikto|scan|clshttp|archiver|loader|email|harvest|fetch|extract|grab|miner|suck|reaper|leach)(.*) [NC,OR]

RewriteCond %{REQUEST_URI} ^(/,|/;|/<|/>|/'|/`|/%2C|/%3C|/%3E|/%27|/////) [NC,OR]
RewriteCond %{HTTP_REFERER} ^(.*)(%00|%08|%09|%0A|%0B|%0C|%0D|%0E|%0F|%2C|<|>|'|%3C|%3E|%26%23|%27|%60)(.*) [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%00|%08|%09|%0A|%0B|%0C|%0D|%0E|%0F|%2C|%3C|%3E|%27|%26%23|%60)(.*) [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)('|-|<|>|,|/|\\|\.a|\.c|\.t|\.d|\.p|\.i|\.e|\.j)(.*) [NC,OR]
RewriteCond %{HTTP_COOKIE} ^(.*)(<|>|'|%3C|%3E|%27)(.*) [NC]

RewriteRule ^(.*)$ error.php [NC]
## No permitir acceso al .htaccess
order allow,deny
deny from all

## Evitar que se liste el contenido de los directorios
Options All -Indexes

## Lo mismo que lo anterior
IndexIgnore *

## Denegar el acceso a robots dañinos, browsers offline, etc
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^Anarchie [OR]
RewriteCond %{HTTP_USER_AGENT} ^ASPSeek [OR]
RewriteCond %{HTTP_USER_AGENT} ^attach [OR]
RewriteCond %{HTTP_USER_AGENT} ^autoemailspider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xenu [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus.*Webster [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
##redireccionar a los robots a otra web
RewriteRule ^.*$ http://www.otraweb.com [R,L]

# Protegerse contra los ataques DOS limitando el tamaño de subida de archivos
LimitRequestBody 10240000



Bueno el tema es amplio y casi todo se puede hacer desde el archivo htaccess

saludos que le sea de utilidad!!  :D



sirdarckcat

eso que propones es usar mod_rewrite como un WAF, y es una mala idea, porque:
1.- tendras falsos postivos si haces blacklist a tantos chars.
2.- casi todas tus reglas se pueden bypasear, o simplemente no son utiles en absoluto.. por ejemplo, union se puede escribir como UNI%6FN.. o

ademas hay aseveraciones falsas como:
CitarCon esta regla es imposible lanzar ataques de inyección (SQL, XSS, etc)
wtf? lo unico que hace esa regla es checar si tiene algunos chars la peticion? eso no lo hace imposible xDD

Haz un topic nuevo en el subforo de Nivel Web con estas reglas, y explica cada una de ellas. En cualquier caso mod_rewrite no es una herramienta de seguridad, en cualquier caso lo seria mod_security, aunque no es muy bueno..

Saludos!!

O_G_T

#2
pues -->sirdarckcat   :silbar: yo no dije que fuera una herramienta de seguridad, ademas mira que he puesto que deben usar otras cosas...

Pero como dije no se demasiado de esto, no soy webmaster, no soy programador... pero estoy aprendiendo!

con crear otro post sirdarckcat  porque si este esta bonito  :-\...

si lees mira que puse esto:

tratare de explicar tal como lo entiendo yo, que no quiere decir que sea como digo, pero funciona....  

asi que gracias por tus sugerencias es bueno aprender....

vamos a terminar el post para no dejarlo colgado...

primero el httaccess debe llevar un centenar mas de reglas pero con las que he colocado esta bien, faltaria colocar unas cincuentas lineas de IP proxy pero eso es mas complicado de explicar ademas no se como explicarlo por que lo aprendi al vuelo .....

luego tienen que implementar un filtro yo uso dos :

InputFilter, que es sencillo de utilizar :
http://blog.jotadeveloper.com/2008/02/27/filtra_tus_input_con_inputfilter/
pueden descarlo de aqui
http://www.phpclasses.org/browse/package/2189.html

luego uso

HTML Purifier
es tambien sencillo de utilizar hay tres vesiones una mas ordenada otra standar etcc

pueden bajarlo de aqui
http://htmlpurifier.org/

DAME EJEMPLOS sirdarckcat  de como saltar estos filtros....
teniendo encuenta ambos estan activos... sabes cual es la respuesta
... NO SE PUEDE!!  ;D hasta que me demuestres lo contrario


ahora para probar y test el sistema utilizo
Acunetix Web  y  CAL CAL9000

http://ha.ckers.org/

y por ultmo implementar un sistema https tambien ayuda

http://www.openssl.org/

Y cuando vean paginas que enseñan ha hacer daño, hagan como hago yo!! pratiquen en esas mismas paginas los que los tios dicen  :xD,  siempre que tengan un tiempito libre y quieran a prender mas, regresen a la pagina del supuesto hacker y sigan practicando  :xD :xD :xD, si le ha baneado el IP usen proxy si esto le funciona usen otras cosas.... y sobre todo manden mas gente a practicar a la pagina o foro del o los "hacker"  ;D ;D ;D

saludos




sirdarckcat

#3
Citarteniendo encuenta ambos estan activos... sabes cual es la respuesta
... NO SE PUEDE!! hasta que me demuestres lo contrario
lol.. te lo hubiera demostrado de no ser por esa actitud, sera tu palabra contra la mia xD, y creo que en credibilidad termino ganando =/

monta una pagina de prueba con el sistema que dices usar, y lo vemos.. ;)

Y como he decidido que este topic no es una respuesta al tutorial de xss, lo muevo a nivel web.

Saludos!!

O_G_T

jajaajaja

;D si tu lo dices !!

pero como te he dicho en el privado, seria bueno que muestres tus aportes, y si quieres demostrar que estoy equivocado adelante hackea esto

http://books.google.es/bkshp?hl=es&tab=wp

como te dije antes no se puede!!

saludos!!

sirdarckcat

#5
Me pides hackear google? Otra vez?
http://sirdarckcat.blogspot.com/search/label/google

Nah.. lo he hecho tantas veces que ya ni lo pongo en mi blog xD
http://www.google.com/corporate/security.html

CitarWe Thank You
People and organizations with an interest in security issues have made a tremendous contribution to the quality of the online experience. On behalf of our millions of users, we would like to acknowledge the following individuals and organizations for their valuable assistance.
2009

  • Inferno, SecureThoughts.com
  • Jason Carpenter, Chris Rohlf, Eric Monti–Matasano Security
  • Eduardo Vela Nava (sirdarckcat)
  • Mozilla Security
  • Will Dormann of CERT

Puedes subir tu pagina de "demo" para mostrarle al mundo lo unitil que es tener 2 filtros de xss encadenados para detener ataques de SQL injection con mod_rewrite?

Uno de los problemas principales que hay con la seguridad es gente que entra a foros y ve malas soluciones como esta, y luego piensan que son seguros cuando no es asi.

Fuera de eso, para demostrar que tu filtro es seguro enlazas a google? cuando ellos NO USAN mod_rewrite?

Parece ser que crees saber mucho, y aunque (citando tu mp) me quieras "dar unas clases", yo te recomendaria primero leas un poquito en wikipedia lo que es XSS porque parece que no lo tienes muy claro, y despues veas quien escribio ese articulo.. Si quieres realmente ver como evadir todos y cada uno de tus filtros, ve mi presentacion de blackhat..
http://www.blackhat.com/html/bh-usa-09/bh-usa-09-speakers.html#VelaNava

Por ahi demostre un bug de overlong unicode que hasta cierto punto afecta a htmlpurifier https://twitter.com/sirdarckcat/status/2648885322 y que obviamente no lo detectan tus super filtros anti <>... ni purifier ni injection checker.. por ser una vulnerabilidad en el core de PHP..

Ni me hagas empezar con SQL Injection, que hasta me cuesta trabajo pensar lo que no evadiria ese filtro..

Siendo nuevo en el foro parece que tienes una actitud medio prepotente, pero pues aqui no se convive asi.. Haz empezado con un mal pie, y tienes la oportunidad de redimirte, te recomiendo la aproveches.

Saludos!!

WHK

Hola, htmlputifier no es tan bueno, hay algunos mejores como phpids pero es como tener un antivirus en tu pc, nunca podrá asegurar la integridad de seguridad al 100%, solo se basan en reglas que son actualizadas siempre porque siempre se encuentra una forma nueva de bypasear un filtro o nacen nuevos RFC como html5 que fuerzan a la creación de nuevos filtros tal como lo hace no-script de firefox.

Yo antiguamente cuando tenía mi blog utilizaba reglas similares a las que expusiste pero cuandoc omenzaron a aparecer las inyecciones de wordpress con carácteres unicode debido a problemas de juegos de carácteres me di cuenta que era inutil y solo servía para intentos básicos de ataques. Si te fijas tampoco evita un csrf y puede que en alguna parte de tu sitio web tengas xss a traves de peticiones post tal como sucede en phpnuke con sentinel protect y si filtras todas las peticiones post terminas con falsos positivos ya que no podrías postear códigos de ejemplos ni nada que tuviera comillas y cosas por el estilo.

Otro ejemplo es la inyección sql cifrada en base64 que encontré en el buscador de usuarios en la sección de administración de smf, saltaría tudas tus reglas sin que me detubiera.

Yo pienso que si uno quiere hacer reglas deberían ser demasiado personalizadas y ni aun así bastaría.
Como dice sdc mod_security es mas efectivo porque es capaz de procesar otros tipos de ataques que no abarcas en un htaccess con mod_rewrite.

La mejor solución para estar siempre seguro es utilizar un ssitema que sea seguro (sabemos que no existe ninguno 100% seguro pero si saber elegir uno bueno) y estar siempre actualizado.
Si es un sistema propio entonces cuidarse de las inyecciones, csrf y xss con una buena programación y no utilizando filtros, como por ejemplo htmlspecialchars con ent_quotes, mysql real escape string, utilizar tokens, etc etc.

De todas formas esa información te ha servido y le puede servir a los demás para conocer lo básico de como evitar un ataque o como funciona un ataque y evasiones pero no sirve como un sistema de protección final para tu sistema web.

Tengo un amigo que tiene un foro bien oscuro (antes era blanco) y que a veces entra a este foro, lo conocí hace tiempo y por x motivo ya casi no nos hablamos; entré a su foro y decidí hacer algunos test de seguridad ya que tenía un sistema de foros desconocido para mi y pude encontrarle LFI, cuando bajé si .htaccess me di cuenta que se basaba en muchas reglas similares a las tuyas pero aun asi fue muy facil bypasearlo y pude avisarle que tan facil era robar sesiones de su phorum.

Si quieres seguir aprendiendo ps bienvenido!, nadie nace sabiendo las cosas, yo igual aprendí de muchos lados y especialemnte de este foro, ha.ckers.org y el foro de dragonjar mas un par de ezines por aqui y por ayá pero siempre siempre siempre ten presente que nunca nada es inhackeable o 100% seguro, ese es el mayor error de un programador o webmaster y siempre hay alguien que sabe mas que uno, yo lo reconozco y sdc tambien lo ha reconocido en mas de alguna ves y eso es lo que te recomiendo, nunca mires hacia abajo a alguien y nunca pienses que algo es invulnerable.

Saludos.

lamurga

#7
ps sirdarckcat y WHK lo han dejado bien claro... pero entonces podrian ayudar o poder compartir info actual sobre una mayor seguridad para evitar inyecciones, csrf y xss, ya que uds tienen mas experiencia en este tipo de vulnerabilidades y aveces personas como yo encontramos malas soluciones, espero me puedan ayudar para seguir avanzando en mis proyectos.

Saludos

sirdarckcat

mod_security con sus nuevas reglas de PHP-IDS no es tan malo

Saludos!!

WHK

Si es un proyecto WEB propio entonces es mejor hacer una programación segura evitando el xss, csrf, etc teniendo conocimientos de como reaizar acciones como por ejemplo mostrar datos en pantalla, si es html entonces usar htmlspecialchars con ent_quotes, si es una query mysql entonces usar mysql real escape string con comillas simples, evitar los saltos de linea, escapes y backslashses en javasript, etc etc.