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) >= 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

Me encanta recibir “buenas noticias” (con Python)

Acá les dejo un pequeño programa en Python que busca “buenas noticias” en los feeds RSS de Clarín, InfoBAE y La Nación.

Es altamente configurable (pueden agregar o quitar palabras clave y feeds editando FEEDS y KEYWORDS).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: utf-8 -*-
 
import feedparser
import re
 
FEEDS = {
    u'Clarín': 'http://www.clarin.com/diario/hoy/um/sumariorss.xml',
    u'InfoBAE': 'http://www.infobae.com/adjuntos/html/RSS/hoy.xml',
    u'La Nación': 'http://www.lanacion.com.ar/herramientas/rss/index.asp',
}
 
KEYWORDS = ['muerto', 'caos', 'inseguridad']
 
def main():
    regexps = [re.compile(keyword, re.IGNORECASE) for keyword in KEYWORDS]
    for feed_name, feed_source in FEEDS.iteritems():
        for entry in feedparser.parse(feed_source).entries:
            for r in regexps:
                if r.search(entry.title):
                    print '%s: %s - %s' % (feed_name, entry.title, entry.link)
                    break 
 
if __name__ == '__main__':
    main()

Acá tienen unos resultados de ejemplo:

1
2
3
4
5
6
7
mahadeva@blue:~$ python buenasnoticias.py
InfoBAE: Un muerto y miles de evacuados por una explosión en Rusia - http://www.infobae.com/mundo/484082-101275-0-Un-muerto-y-miles-de-evacuados-por-una-explosión-en-Rusia
La Nación: Varios muertos en Rusia tras una explosión en un arsenal militar - http://www.lanacion.com.ar/nota.asp?nota_id=1199099
Clarín: Inseguridad: en medio de los cruces, el oficialismo se despega de D'Elía - http://www.clarin.com/diario/2009/11/13/um/m-02040147.htm
Clarín: 12:35 - Detienen a tres chicos por el caso del empresario muerto por una pedrada - http://www.clarin.com/diario/2009/11/13/um/m-02040124.htm
Clarín: Otro choque en la General Paz provocó un caos en el tránsito - http://www.clarin.com/diario/2009/11/13/um/m-02040083.htm
Clarín: Detienen a tres chicos por el caso del empresario muerto por una pedrada - http://www.clarin.com/diario/2009/11/13/um/m-02040124.htm