Hallo Forum,
ich bin dabei die Sicherheit meines Systems zu überarbeiten. Dazu nehme ich mir gerade diese Liste zur Hilfe....
Somit besteht meine erste Aufgabe darin, erst einmal die klare Zeichen herzustellen (decoden).
Bin da auch schon recht weit, hätte aber ne kleine Frage zur Sicherheit.
Funktioniert soweit einwandfrei, habe aber noch folgende Zeichen die noch immer nicht umgewandelt wurden:
Wäre schön wenn man mir da noch fix helfen könnte, weshalb die nicht umgewandelt wurden, fehlendes Semikolon oder wieder ganz ne andere Formatierung/Sprache?
Ansonsten hätte ich noch ne Frage was mit den den codierten zeichen passiert mitten im Zeilen Umbruch?
wurde dann zu das hier:
Also sollte das Script eigentlich zuverlässig arbeiten oder? Denn es wurde ja trotz unterbrochener Zeichenfolge decodiert bzw. das & rutschte nach unten, das Zeichen wäre ein ' muss noch schauen wie ich mit diesem verfahre, aber ich denke werde es wohl auch decodieren müssen damit ich entsprechend tags und scripte hinterher besser raus filtern kann!?
MfG: Paykoman
ich bin dabei die Sicherheit meines Systems zu überarbeiten. Dazu nehme ich mir gerade diese Liste zur Hilfe....
Somit besteht meine erste Aufgabe darin, erst einmal die klare Zeichen herzustellen (decoden).
Bin da auch schon recht weit, hätte aber ne kleine Frage zur Sicherheit.
PHP-Code:
$desc = $_POST['description'];
// whitlist of html-elements
// 'abbr','acronym','cite','code','caption','dd','del','dfn','dl','dt','em','ins','kbd','pre','sub','sup','img',
$tagWithlist = ['style','script','a','b','blockquote','br','div','font','h1','h2','h3','h4','h5','h6','i','li','ol','p','s','span','strike','strong','table','tbody','td','tfoot','th','thead','tr','tt','u','ul'];
$desc = preg_replace('/^[ \t]*[\r\n]+/m', '', $desc); // remove blank lines
// as first find correct codes and replace to plain ("&<>')
$desc = urldecode(html_entity_decode($desc));
// remove manipulation on NCR-decimal with added zeros (zeros after &# will be removed, then we can run the next filter)
// $desc = preg_replace('/(&#X|&#x|&#)(0*)([A-z,0-9]{2})/i', '$1$3', $desc); // beachtet nicht ob Semikolon am Ende ist oder nicht
$desc = preg_replace('/(&#X|&#x|&#)(0*)([A-z,0-9]*)(;|)/i', '$1$3;', $desc); // NCR hex und dezimal mit und ohne endendes Komma
// replace case-insensitive to normalize this codes
$desc = str_ireplace(['"', '";'], '"', $desc); // "
$desc = str_ireplace(['&', '&;'], '&', $desc); // &
$desc = str_ireplace(['<', '<;'], '<', $desc); // <
$desc = str_ireplace(['>', '>;'], '>', $desc); // >
$desc = str_ireplace(['&apos', '';'], ''', $desc); // '
$desc = iconv('ASCII', 'UTF-8//IGNORE', $desc); // decode ascii
// is case-insensitive replacecing finished we can replace codes again to plain chars
$desc = html_entity_decode($desc);
$desc = htmlspecialchars_decode($desc, ENT_HTML5);
// $desc ist nun leserlich
Code:
\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029 \x3c \x3C \u003c \u003C
Ansonsten hätte ich noch ne Frage was mit den den codierten zeichen passiert mitten im Zeilen Umbruch?
Code:
<IMG SRC=javascript:a& #0000108ert('XSS')>
Code:
<IMG SRC=javascript:alert( 'XSS')>
MfG: Paykoman
Kommentar