Kleiner Abstecher zur Inhalts-"Verschlüsselung" von Spiegel Online

Neben einigen frei zugänglichen Artikeln bietet die Nachrichtenplattform von Spiegel Online auch bezahlpflichtige Artikel (Spiegel Plus) zum online Lesen mittels LaterPay an. Nicht angemeldeten Nutzern wird dabei jeweils nur ein kurzer Teil des Artikels zu Verfügung gestellt, der restliche Artikel erscheint verschwommen und unleserlich. Wie sich nun raus stellte ist diese “Inhaltsverschlüsselung” mit Leichtigkeit zu überlisten.

Versteckter Inhalt: Zum Weiterlesen muss man ggf. für den Artikel zahlen oder einen Wochenpass bei Spiegel Online kaufen.

Umgehen in nur 2 Schritten

Der Schutz muss dafür in 2 Schritten umgangen werden. Betroffen ist jeweils nur die Region die von der CSS-Klasse obfuscated-content eingeschlossen wird. Der erste Schritt ist dabei recht simpel - der Effekt, der die verschwommene Schrift erzeugt, ist der CSS-Filter blur. Dieser lässt sich Beispielweise über die Developer-Tools abschalten. Alternativ geht das auch per Javascript:

obfuscated_content = document.getElementsByClassName('obfuscated-content')[0];
obfuscated_content.style = "blur: none !important; opacity: 1 !important; filter: none !important;";
obfuscated_content.parentNode.style = "blur: none !important; opacity: 1 !important; filter: none !important;";

Dabei werden jeweils für das Element mit der CSS-Klasse obfuscated-content und das übergeordnete Elternelement die CSS-Attribute blur, filter und opacity zurückgesetzt.

Nur CSS: Dieser Effekt ist nur CSS und lässt sich wie hier gezeigt einfach über die Developer Tools abschalten (Strg + Umschalt + I).

Anschließend muss noch das LaterPay Overlay entfernt werden. Das HTML-Element hat leider keine permanente ID oder Klasse zugewiesen bekommen, sondern eine (pro Aufruf) variierende Klasse. Deshalb ist es ein wenig schwieriger an das Element ran zu kommen. Aber auch das ist möglich - wir navigieren einfach relativ zu einem bekannten Element, .obfuscated-content, also zu dem Overlay-Element. Passenderweise ist dies recht simpel, es handelt sich dabei um das nächste Kindelement hinter dem Elternknoten des .obfuscated-content-Elements.

LaterPay Overlay: Das Overlay befindet sich hinter (nextSibling) der parentNode des .obfuscated-content.

Auch das lässt sich mit Javascript einfach ansprechen. Wir blenden das Element mit der CSS-Eigenschaft display: none einfach aus:

obfuscated_content.parentNode.nextSibling.style = "display: none;";

Ist dies erledigt offenbart sich dem Nutzer ein Wirrwarr aus Buchstaben, Zahlen und Sonderzeichen.

Buchstaben-Wirrwarr: Auffällig ist, dass der Text keine Zufallskombination zu sein scheint, Leerzeichen sind an stimmigen Stellen positioniert und auffällig viele Sätze enden auf / oder beinhalten ein -.

Dabei fällt auf, dass Leerzeichen passend gesetzt scheinen. Ebenso fällt auf, dass erstaunlich viele Sätze auf einen einfachen Slash / enden. Ein kurzer Blick auf man ascii erschien hier angebracht - und tatsächlich: der Slash steht in der ASCII-Tabelle mit dem Index 0x2F eine Position direkt hinter dem Punkt. Beim Bindestrich verhält es sich ähnlich. Dieser steht an der Position 0x2D; eine Stelle darüber in der ASCII-Tabelle, an Position 0x2C findet sich das Komma ;-). Verifiziert man diese Annahme nun mit dem ersten Wort “Ejf” erhält man als Klartext “Der”.

man ascii: Ein Blick auf die ASCII-Tabelle offenbart den Mechanismus.

Um es nicht unnötig kompliziert zu machen entschied man sich bei Spiegel offenbar für eine sehr simple Variante der Caesar-Chiffre in der jeweils nur um 1 Zeichen verschoben wird. Auch diese Obfuscation lässt sich sehr simpel mittels etwas Javascript umkehren.

Aber eins nach dem anderen… zunächst müssen wir erst mal auf den Text zugreifen. Dieser steht in Absätzen mit der Klasse .obfuscated:

obfuscated_tags = document.getElementsByClassName('obfuscated');

An den Textinhalt des ersten Absatzes kommen wir nun recht bequem mittels:

obfuscated = obfuscated_tags[i];
ciphertext = obfuscated.innerText;

Um nun jedes Zeichen durch das in der ASCII-Tabelle darüber stehende zu ersetzen, müssen wir auf den Index der ASCII-Tabelle zugreifen. dies ist mittels .charCodeAt(j) für das Zeichen j möglich. Um den veränderten Indexwert anschließend wieder zurück in ein Textzeichen zu wandeln benötigen wir die entsprechende Umkehrmethode String.fromCharCode():

String.fromCharCode(ciphertext.charCodeAt(j) - 1 % 0xFF);

Insgesamt lässt sich so ein simples Javascript erstellen, welches beispielsweise mittels dem Firefox-Plugin Greasemonkey automatisch auf die Spiegel-Online Website anwenden lässt:

// ==UserScript==
// @name        Spiegel Online decrypt
// @namespace   bueddl
// @include     http://www.spiegel.de/*
// @version     1
// @grant       none
// ==/UserScript==

window.onload = function()
{
  obfuscated_content = document.getElementsByClassName('obfuscated-content')[0];
  obfuscated_content.style = "blur: none !important; opacity: 1 !important; filter: none !important;";
  obfuscated_content.parentNode.style = "blur: none !important; opacity: 1 !important; filter: none !important;";
  obfuscated_content.parentNode.nextSibling.style = "display: none;";

  obfuscated_tags = document.getElementsByClassName('obfuscated');
  for (i in obfuscated_tags)
  {
    obfuscated = obfuscated_tags[i];
    ciphertext = obfuscated.innerText;
    if (ciphertext == undefined)
      continue;
    plaintext = '';
    for (j = 0; j < ciphertext.length; j++)
      if (ciphertext[j] == ' ')
        plaintext += ' ';
      else
       plaintext += String.fromCharCode(ciphertext.charCodeAt(j) - 1 % 0xFF);
    obfuscated.innerText = plaintext;
  }
};

Selbstverständlich ist das ganze ein rein hypothetischer Gedanke. Interessant ist die ganze Sache allerdings auf jeden Fall ;-)