Kleiner Abstecher zur Inhalts-"Verschlüsselung" von Spiegel Online
19 Aug 2016Neben 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.
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.
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.
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.
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”.
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 ;-)