Autor Beitrag
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mo 27.10.08 22:56 
Hab mal irgendwo folgende Zusammenstellung gefunden. In wie fern ist die gegen XSS sicher genug? Was ist völlig unnötig und was sollte noch hinzugefügt werden?

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
<?php
  if (!empty($_GET)) extract($_GET);
  if (!empty($_POST)) extract($_POST);

  function kill_tags_deep($value) {
    $value = is_array($value) ? array_map('kill_tags_deep', $value) : trim(strip_tags(stripslashes($value)));

    $bad = array ('@<script[^>]*?>.*?</script>@si''@<[\/\!]*?[^<>]*?>@si''@&(quot|#34);@i',
                       '@&(amp|#38);@i''@&(lt|#60);@i''@&(gt|#62);@i''@&(nbsp|#160);@i''@&(iexcl|#161);@i',
                       '@&(cent|#162);@i''@&(pound|#163);@i''@&(copy|#169);@i''@&#(\d+);@e'); 

    $good = array ('''''"''&''<''>'' ', chr(161), chr(162), chr(169), 'chr(\1)');

    return preg_replace($bad, $good, $value);
    return $value;
  }

  $_POST = kill_tags_deep($_POST);
  $_GET = kill_tags_deep($_GET);

  set_magic_quotes_runtime(0);

  // Tricks
  if (isset($HTTP_POST_VARS['GLOBALS']) || isset($HTTP_POST_FILES['GLOBALS'])) die("Hacking attempt");
  if (isset($HTTP_GET_VARS['GLOBALS']) || isset($HTTP_COOKIE_VARS['GLOBALS'])) die("Hacking attempt");
  if (!isset($HTTP_SESSION_VARS) || !is_array($HTTP_SESSION_VARS)) $HTTP_SESSION_VARS = array();
  if (isset($HTTP_SESSION_VARS) && !is_array($HTTP_SESSION_VARS)) die("Hacking attempt");

  $not_unset = array('HTTP_GET_VARS''HTTP_POST_VARS''HTTP_COOKIE_VARS''HTTP_SERVER_VARS''HTTP_SESSION_VARS''HTTP_ENV_VARS''HTTP_POST_FILES''phpEx''phpbb_root_path');

  $input = array_merge($HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_SERVER_VARS, $HTTP_SESSION_VARS, $HTTP_ENV_VARS, $HTTP_POST_FILES);

  unset($input['input']);
  unset($input['not_unset']);

  while (list($var,) = @each($input))
    if (!in_array($var, $not_unset))
      unset($$var);

  unset($input);
?>

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 28.10.08 00:17 
Dieses Teil ist grausam zu lesen ...

1. In den Zeilen 2-3 werden erstmal ALLE (ungeprüften) Variablen entpackt --> Name Space Poisoning!!!!!!!!!!!!)

2. Das Kill_Tags_Deep kommt zu spät

3. Es wird Register_Globals emuliert (!!!!!!!!!!)

4. Die preg_matches für Tags sind zu ungenau (die fangen bestimmte Angriffs-Vektoren für XSS nicht ab, die zwar kein valides HTML sind, dafür aber von Browsern erlaubt werden.

5. Es fehlen Prüfungen von Java-Script-Handlern in Tags, die als unkritisch angesehen werden

6. Ich kann mit wenigen Schritten deinen Server in die Ecke fahren ;-) Wenn Du wirklich so ein Script laufen hättest, würd ich da einfach mal ne POST-Anfrage mit ?a[][][]...500k Mal...[][][]=foo hinschicken und dein Server würde es in die Ecke jagen. Davon mal eben 10 Anfragen binnen einer Sekunde hinschieben und dein Server ist in der Ecke; wenn Du Pech hast, erholt er sich nicht mehr davon und darf neu gebottet werden. (Gut, beim GeSHi gab es mal nen Bug, da ging das mit einem Byte Input, der wurde aber dafür auch ziemlich schnell gefixt, ich verrat aber nicht die verwundbare Version, bzw. wie der Test dafür aussah.)

Diverse Angriffsvektoren gibt es unter ha.ckers.org/xss.html

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 28.10.08 17:31 
Dann misten wir mal aus....

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
<?php
  function kill_tags_deep($value) {
    $value = is_array($value) ? array_map('kill_tags_deep', $value) : trim(strip_tags(stripslashes($value)));

    $bad = array ('@<script[^>]*?>.*?</script>@si''@<[\/\!]*?[^<>]*?>@si''@&(quot|#34);@i',
                       '@&(amp|#38);@i''@&(lt|#60);@i''@&(gt|#62);@i''@&(nbsp|#160);@i''@&(iexcl|#161);@i',
                       '@&(cent|#162);@i''@&(pound|#163);@i''@&(copy|#169);@i''@&#(\d+);@e'); 

    $good = array ('''''"''&''<''>'' ', chr(161), chr(162), chr(169), 'chr(\1)');

    return preg_replace($bad, $good, $value);
    return $value;
  }

  $_POST = kill_tags_deep($_POST);
  $_GET = kill_tags_deep($_GET);
?>


...und bleiben bei der Funktion. Vielleicht könnte man die so erweitern, dass man sie als Script anbieten kann. Dazu müssten dann aber erstmal alle Einträge auf ha.ckers.org eingebaut werden.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 28.10.08 17:44 
Habe ich nicht gesagt, dass ich Dir den Webserver abschieße, wenn Du diese Funktion in einem Script verwendest???

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 28.10.08 17:49 
Du hast ja nicht gesagt, was das Problem auslöst, bin da mehr vom extract oder ähnlichem ausgegangen. Dann kürzen wir halt und als Schutz bleibt übrig:

ausblenden C#-Quelltext
1:
					

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 28.10.08 18:00 
Also so schieß ich Dir zumindest mit deinen Schutzmaßnahmen nicht den Server weg :mrgreen:

Und nein, ich habe erwähnt, was dir den Server bei kill_tags_deep wegschießt ... Deeply Nested Arrays im Input ;-) Daher nutz ich z.B. den Suhosin-Patch für Input-Filterung, da dieser Nested Arrays ab einer bestimmten Schachtelungstiefe einfach filtert und PHP diese gar nicht erst zu Gesicht bekommt.

Deine kill_tags_deep-Funktion müsste also eine Rekursionstiefen-Behandlung bekommen. Bei ungünstiger Konfiguration kann ich Dir dann aber immer noch den Server crashen, in dem ich ihn mit dem durch string_replace alloziierten temporären Speicher gegen das Mem-Limit von PHP fahr (das geht aber nur, wenn Max Input Size, Max Input Timeout und MemLimit von PHP nicht korrekt eingestellt sind.

Ach ja ... fällt mir jetzt grad erst auf: Deine Kill_tags_deep-Funktion nutzt den /e-Modifier, den man u.U. auch nett für eine Arbitary Remote Code Execution missbrauchen kann ;-) In dem Fall kann man da aber nur PHP zu einer Warnung bewegen, dass XY keine gültige Zahl ist ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.