Wen es interessiert: Ein Beispiel, wie „einfach“ so ein Angriff auf den Salt in diesem Fall durchgeführt werden kann.
[php]<?php
$myAttackHref = ‚./?‘ . str_repeat(„\xFF“, 200);
// Angriffs-Href wird verschlüsselt (simuliert das, was die Webseite machen
// würde)
require_once ‚./GetObfuscator.php‘;
$obfuscator = new GetObfuscator();
$obfuscated = $obfuscator->obfuscate($myAttackHref);
// Die Rückgabe in $obfuscated kann ich aus dem Quellcode entnehmen
echo $obfuscated . „\n\n“;
// Alles hinter ./?data= sieht mir verdächtig nach Base64 aus, dekodieren wir
// das
$decoded = base64_decode(substr($obfuscated, 8));
echo $decoded . „\n\n“;
// Okay, gibt mir nichts sinnvolles zurück, gucken wir es im Hexeditor an
echo hexView($decoded);
echo „\n\n“;
// Da sehe ich wiederkehrende Byte-Folgen.
// Zum Beispiel: 9198 DF9A 938C 9AD1 AB97 968C
// (etwa ab Offset 60 und ab Offset 94)
// Das deutet darauf hin, dass hier eine Operation auf den Eingabedaten
// stattgefunden hat, die sich ab einer gewissen Eingabelänge wiederholt.
//
// Da greift sicherlich:
// - http://de.wikipedia.org/wiki/Polyalphabetische_Substitution#Kryptoanalyse
//
// Solche Operation werden – das weiß ich als Angreifer aus Erfahrung – gerne
// mit der bit-weisen Operation XOR verknüpft, da hier die doppelte Anwendung
// wieder verlustfrei den ursprünglichen Eingabestring erzeugt
// Probieren wir also einfach mal…
foreach (str_split($decoded) as $char) {
echo chr(ord($char) ^ ord(„\xFF“));
}
echo „\n\n“;
// Bingo
/**
-
Displays data in hexadecimal encoding
-
@param string $data Data to display in hex viewer
-
@return string Hex representation of input data
*/
function hexView($data)
{
$data = (string) $data;
$chunklen = 16;
$l = strlen($data);
if ($l === 0) {
return ‚‘;
}
$ret = '00000000 ';
$origLine = ‚‘;
$lc = 0; // line counter
$rc = 0; // row counter
for ($i = 0; $i < $l; $i++) {
$ret .= sprintf(‚%02X‘, ord(substr($data, $i, 1)));
$n = ord(substr($data, $i, 1));
if ($n <= 32 || $n === 127) {
$origLine .= '.';
} else {
$origLine .= substr($data, $i, 1);
}
$rc++;
if ($rc === 2) {
$origLine .= '';
$ret .= ' ';
$rc = 0;
}
if (($i + 1) % $chunklen === 0) {
$ret .= ' ' . $origLine;
$origLine = '';
$ret .= "\n";
$lc++;
if ($lc === 4) {
$ret .= "\n";
$lc = 0;
}
$rc = 0;
if ($i < $l - 1) {
$ret .= sprintf('%08X ', $i + 1);
}
}
}
if ($origLine !== ‚‘) {
$k = $chunklen - ($i) % $chunklen;
for ($i = 0; $i < $k; $i++) {
$ret .= ' ';
if ($i % 2 === 0) {
$ret .= ' ';
}
}
$ret .= ' ' . $origLine;
}
return $ret;
}[/php]
Ausgabe:
[code]./?data=q5eWjN+WjN+e34yek4vfiZ6TiprR37yXnpGYmt+Ll5aM34uQ34yQkpqLl5aRmN+ak4ya0auXlozflozfnt+MnpOL34mek4qa0d+8l56RmJrfi5eWjN+LkN+MkJKai5eWkZjfmpOMmtGrl5aM35aM357fjJ6Ti9+JnpOKmtHfvJeekZia34uXlozfi5DfjJCSmouXlpGY35qTjJrRq5eWjN+WjN+e34yek4vfiZ6TiprR37yXnpGYmt+Ll5aM34uQ34yQkpqLl5Y=
«—–Œß–ŒßžßŒž“‹ß‰ž“ŠšÑß¼—ž‘˜šß‹—–Œß‹ßŒ’š‹—–‘˜ßš“ŒšÑ«—–Œß–ŒßžßŒž“‹ß‰ž“ŠšÑß¼—ž‘˜šß‹—–Œß‹ßŒ’š‹—–‘˜ßš“ŒšÑ«—–Œß–ŒßžßŒž“‹ß‰ž“ŠšÑß¼—ž‘˜šß‹—–Œß‹ßŒ’š‹—–‘˜ßš“ŒšÑ«—–Œß–ŒßžßŒž“‹ß‰ž“ŠšÑß¼—ž‘˜šß‹—–Œß‹ßŒ’š‹—–
00000000 AB97 968C DF96 8CDF 9EDF 8C9E 938B DF89 «—–Œß–ŒßžßŒž“‹ß‰
00000010 9E93 8A9A D1DF BC97 9E91 989A DF8B 9796 ž“ŠšÑß¼—ž‘˜šß‹—–
00000020 8CDF 8B90 DF8C 9092 9A8B 9796 9198 DF9A Œß‹ßŒ’š‹—–‘˜ßš
00000030 938C 9AD1 AB97 968C DF96 8CDF 9EDF 8C9E “ŒšÑ«—–Œß–ŒßžßŒž
00000040 938B DF89 9E93 8A9A D1DF BC97 9E91 989A “‹ß‰ž“ŠšÑß¼—ž‘˜š
00000050 DF8B 9796 8CDF 8B90 DF8C 9092 9A8B 9796 ß‹—–Œß‹ßŒ’š‹—–
00000060 9198 DF9A 938C 9AD1 AB97 968C DF96 8CDF ‘˜ßš“ŒšÑ«—–Œß–Œß
00000070 9EDF 8C9E 938B DF89 9E93 8A9A D1DF BC97 žßŒž“‹ß‰ž“ŠšÑß¼—
00000080 9E91 989A DF8B 9796 8CDF 8B90 DF8C 9092 ž‘˜šß‹—–Œß‹ßŒ’
00000090 9A8B 9796 9198 DF9A 938C 9AD1 AB97 968C š‹—–‘˜ßš“ŒšÑ«—–Œ
000000A0 DF96 8CDF 9EDF 8C9E 938B DF89 9E93 8A9A ß–ŒßžßŒž“‹ß‰ž“Šš
000000B0 D1DF BC97 9E91 989A DF8B 9796 8CDF 8B90 Ñß¼—ž‘˜šß‹—–Œß‹
000000C0 DF8C 9092 9A8B 9796 ߌ’š‹—–
This is a salt value. Change this to something else.This is a salt value. Change this to something else.This is a salt value. Change this to something else.This is a salt value. Change this to somethi[/code]
Gut, ich wusste jetzt natürlich, wie es in diesem Fall geht.
Aber, na ja, es ist immer richtig, davon auszugehen, dass ein potentieller Angreifer cleverer ist als man selbst. Also Vorsicht mit hausgemachten „Verschlüsselungen“.
Und ja, ich weiß, dass das hier nicht sicherheitsrelevant ist und für den Anwendungsfall im Thread keine Rolle spielt. Ich wollte nur unangebrachte Illusionen zerstören. 