diego sevilla’s weblog
it is better to remain silent and be thought a fool,
than to open your mouth and remove all doubt -- groucho marx

3/4/2005

Solución al acertijo sobre WP-Morph

Filed under: español, código/code — Diego Sevilla @ 21:05 — In English

El otro día lancé un reto basado en un plugin anti-spam que he realizado: WP-Morph. Dije que yo había encontrado tres maneras de romper el plugin anti-spam de forma automática. Una de ellas era trivial: que el spammer tuviera un intérprete JavaScript, algo difícil, pero posible. Otra de ellas la descubrió Juanjo en este comentario del weblog. La idea es que en cualquier momento, un par de valores, el calculado por el código javascript y el dado por md5, son válidos para siempre. Así que precalculando esos valores se pueden utilizar siempre para enviar un comentario. Hay varias formas de tratar eso, y lo haré para las próximas versiones del plugin. Resumiendo:

1. Que el spammer tenga un intérprete JavaScript.
2. Precalcular valores válidos del formulario, y
3. ¿Cuál es el tercero?

Este no lo descubrió nadie. La idea es mirar una segunda vez el código. Ese código JavaScript bien podría ser un código en C o casi en perl… Lo bueno de esos lenguajes como perl es que son capaces de interpretar código en tiempo de ejecución, y todos ellos incorporan una función exec que es capaz de interpretar código en tiempo de ejecución. ¿Por qué perl? Bueno, la mayoría de los spammers utilizan perl o python o ruby como lenguajes de scripting para lanzar comentarios spam, así que es natural proponer esta solución.

Sin embargo, el código JavaScript no es exactamente código Perl. Por ejemplo veamos los cambios que hay que hacer:

1. El valor calculado se tiene que extraer, y el código JavaScript que rellena el formulario no significa nada. Sólo es necesario el valor final.
2. Las variables en perl llevan añadido un “$” delante, así que hay que hacer esta transformación.

Imaginemos que somos capaces de extraer el código que hace el cálculo:

v0=1368;v1=1581;v2=927;v3=802;v4=1280;v5=968;v6=1745;v7=1147;v8=661;v9=1376;v10=2086;v11=1539;v12=165;v13=1380;v14=1407;v15=114;if ( v15 > 2059)
                                    { v7 = v15; }if ( v15 > 1735)
                                    { v10 = v12; }if ( v11 > 1503)
                                    { v12 = v8; }v10=(v13-v5)%2514;v4=Math.abs(v4);
                                   v4%=26; while (v4--) {
                                   v0++; }v0=(v8+v12)%2514;eElement.value = (v0+v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v11+v12+v13+v14+v15)%2514;

Así, las modificaciones que hay que hacer sobre ese código son:

1. s/v([0-9])+/\$v$1/g (sustituye todas las “vxx” con “$vxx” al estilo perl).
2. s/Math\.abs/abs/g (en perl la función es “abs”).
3. s/eElement.value/\$v/g (el valor final en $v).
4. Añadir al final: print “$v”.

Resultado:

$v0=1368;$v1=1581;$v2=927;$v3=802;$v4=1280;$v5=968;$v6=1745;$v7=1147;$v8=661;$v9=1376;$v10=2086;$v11=1539;$v12=165;$v13=1380;$v14=1407;$v15=114;if ( $v15 > 2059)
{ $v7 = $v15; }if ( $v15 > 1735)
{ $v10 = $v12; }if ( $v11 > 1503)
{ $v12 = $v8; }$v10=($v13-$v5)%2514;$v4=abs($v4);
$v4%=26; while ($v4--) {
$v0++; }$v0=($v8+$v12)%2514;$v = ($v0+$v1+$v2+$v3+$v4+$v5+$v6+$v7+$v8+$v9+$v10+$v11+$v12+$v13+$v14+$v15)%2514;
print $v;

y la salida: 957.

Voilà. He ahí la tercera solución. Ni siquiera se necesita una función md5 (que perl también trae de fábrica incluso).

7 Comments »

  1. Bueno, bueno. Construir un “traductor” de javascript a perl es algo en lo que no había pensado. De modo que el premio ha quedado desierto. De todas formas creo que le deberías pagar una cerveza virtual al mejor clasificado ;-)

    Comment by Juanjo Navarro — 3/4/2005 @ 23:35

  2. Y la solución de sistemasorp?

    Comment by Anonymous — 4/4/2005 @ 17:58

  3. Si es automatizada, entraría dentro de la solución (1), es decir, el programa interpreta JavaScript. El problema de la última solución que dio es que no era automatizada (necesitaba abrir una ventana de FireFox o Internet Explorer).

    Saludos,
    diego

    Comment by dsevilla — 4/4/2005 @ 18:07

  4. Como decías en los comentarios que la ibas a publicar también junto con las soluciones. Un saludo.

    Comment by Anonymous — 4/4/2005 @ 19:19

  5. Decía que diría cuáles son las soluciones, no que mostraría el código. De todas formas, realmente no tengo una idea rápida de cómo implementar la primera solución.

    Saludos,
    diego

    Comment by dsevilla — 4/4/2005 @ 20:36

  6. Bueno, Juanjo, pues sí!

    ¡¡¡UNA CERVEZA VIRTUAL PARA JUANJO POR ACERTAR LA MITAD DEL ACERTIJO!!! :)

    Saludos!
    diego

    Comment by dsevilla — 4/4/2005 @ 20:37


  7. Y sí, efectivamente, eran formas sin usas Javascript A ver si a alguien se le ocurre la última forma y le doy el premio final. Si no, mañana publico las soluciones, incluyendo la impresionante de sistemasorp.

    Me refería a que también publicarias la solución de sistemasorp, pero no lo veo por ningun lado del artículo. Pero buneo, dejalo, ya no tiene importancia.

    Un saludo.

    Comment by Anonymous — 6/4/2005 @ 19:15

RSS feed for comments on this post. TrackBack URI

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>


Anti-Spam by WP-Morph 

Creative Commons License
This work is licensed under a Creative Commons License.
EWWV  AWStats  Site Meter 24 queries. 0.079 seconds. Powered by WordPress
406022 email messages processed in this box. 10858 were spam

0