"Hackeando" los QR del supermercado

Nacho - - Tiempo de lectura 5 mins

Si vivís en Uruguay, posiblemente estés familizarizado con las promociones de los stickers de Geant, Devoto, y Disco (ese hermoso casi-monopolio disfrazado que tenemos). La cosa funciona así: cuando comprás algo, dependiendo del costo, y de si son productos “participantes” en la promoción, se aplica una fórmula mágica, y te da una cierta cantidad de stickers, que los vas juntando en una cartilla, y cuando llenás la cartilla vas con eso y comprás un producto en promoción con descuento. Por ejemplo, en este momento lo que está de promoción son vasos, y antes de eso era una colección de platos.

Durante mucho tiempo, los stickers te los daban directamente en la caja. Después, cuando pusieron las cajas de “self-checkout”, empezaron a imprimirte un ticket con un QR, que podías llevar a un puestito donde lo escaneabas y te “imprimía” los stickers. La máquina dice “imprimir”, pero la “impresora” es un dispensador que cuenta los stickers y te los da. Es transparente, se ve que está el rollo de stickers adentro, no engañan a nadie con lo de “impresora”. Hoy en día, si vas por las cajas normales, es cada vez más común que te den el mismo ticket con el QR y vayas a la “impresora”, aunque todavía a veces te los dan en la mano.

El tema es que me dio curiosidad ver cómo funciona ese QR, qué información tiene, y si se puede “engañar” a la impresora.

Cómo funciona el QR

Un QR no es algo muy mágico, lo que es es una forma de codificar información. En lugar de tener un texto, que es más complejo de leer por una computadora, y puede tener errores, el formato QR lo codifica en un cuadrado con cuadraditos blancos y negros. Tiene unos cuadraditos especiales en las esquinas para que sea claro cuál es el lado “de arriba” (lo que le permite a quien lee el QR procesarlo sin ambigüedades) y tiene bastante corrección de errores. El resultado es que un QR es fácil de detectar y leer por un software incorporado a la cámara del teléfono. Si vos agarrás la cámara de tu teléfono y la apuntás a un QR, lo va a leer y decodificar en seguida.

En el caso del QR de los stickers, el texto codificado es una serie de números con un guión en el medio.

un ticket con QR para canjear stickers

Por ejemplo, el de la foto es 52012026011701500000394690-00017. Contrastando eso con otra información del ticket, y con otros tickets similares, se puede dividir en varias partes:

  • 5201: Identificador de sucursal. 5201 es Geant Parque Roosevelt, 3005 es Devoto Calcagno. Me estoy doxeando un poco con la zona en la que vivo, ¿no?
  • 20260117: La fecha, en formato YYYYMMDD.
  • 015: El número de caja. Si no me equivoco, los números de caja mayores a 80 son las cajas de self-checkout.
  • 00000394690: El número de transacción. Es secuencial dentro de una misma caja, y parece ser una secuencia diferente para cada caja.
  • 00017: Cantidad de stickers. Es interesante que sean cinco dígitos, me pregunto qué porcentaje del PBI tenés que gastar para hacerle overflow.

Modificar el QR

La pregunta obvia es “¿qué pasa si lo cambio?”. El proceso es fácil: escaneá el QR con tu teléfono, copiá el código, buscá “qr generator” en tu buscador favorito, entrá a alguno de los resultados, pegá el QR y modificá los valores que quieras, y después dale generar, y escaná la pantalla de tu teléfono con la maquinita. La pregunta es si funciona.

Dame más stickers

La primera prueba es generar más stickers que lo que dice el ticket. Modificale la cantidad de stickers por los que vos quieras (en mi caso puse uno más, un poco porque no necesito más, y un poco porque mi pareja estaba al lado mío y me miraba raro). La respuesta es sí, funciona. Me dio un sticker más que lo que decía el ticket.

Promoción sin obligación de compra

Ok, pero eso fue usando un número de transacción válido. ¿Qué pasa si cambio el número de transacción, por ejemplo agregando un 1 al principio? Lo hice modificando el número que tenía, pero podés simplemente inventarte un número de transacción, y es lo mismo. Simplemente siguiendo el formato de arriba. Otra vez, probé con sólo un sticker, por las mismas razones. Mi pareja ya empezaba a darme miradas asesinas. Y sí, también funcionó, la máquina me dio un sticker alegremente.

Las cosas obvias que no probé

No probé lo más obvio de todo: usar el mismo QR dos veces. No sé si funciona, y si no funciona, no sé si funcionaría cambiando de máquina (en el Geant de Parque Roosevelt, por ejemplo, hay dos una al lado de la otra). Por las pruebas que hice, es evidente que no hay ninguna validación del código QR: tanto la cantidad de stickers como el número de transacción los podés cambiar, y la máquina te cree sin problema. Pero capaz que sí validan que un mismo QR se haya usado (por ejemplo, guardando en una tabla en una base de datos centralizada). O capaz que validan que la transacción se haya usado (y entonces dos QRs con misma transacción pero distinto número de stickers no se podrían repetir). Me olvidé de probarlo, y me avivé recién después de salir del supermercado. En mi cabeza ingenua, tenía la idea de que obviamente iban a validar que no reutilices el mismo QR, pero la verdad es que no tengo razón ninguna para asumir que es así. Así que la próxima vez, voy a tener que probar eso.