SAM
ehemaliger Administrator Beiträge: 1361 Registriert: 2.4.2003 Status: Offline |
erstellt am: 14.9.2006 um 11:51 Uhr: |
Anlässlich unseres aktuellen Sicherheitsproblems (siehe hier) bitte ich jene, die reguläre Ausdrücke im Schlaf beherrschen, mal um Mithilfe...
Das Forum filtert nicht allen Schadcode zuverlässig heraus. Unser Hacker hatte so etwas eingeschleust:
code: <font color="green" sty1e=background-image:url(Java5cript:window.open(...));">
Gefährlich ist dabei das JavaScript im style-Attribut. Eigentlich sollten alle style-Attribute komplett herausgefiltert werden. Dazu gibt es in der Forumssoftware diesen regulären Ausdruck:
code: |STYLE\s*=\s*"[^"]*"|si
Wie man sieht, erwischt der aber obige Konstruktion nicht, weil dort nach dem = das " fehlt. Hat jemand eine Idee, mit was für einer RegExp man auch solche Fälle erschlagen könnte? ____________________ |
|
|
Pata
Beiträge: 1836 Registriert: 3.12.2003 Status: Offline |
erstellt am: 14.9.2006 um 12:24 Uhr: |
Hi Sam!
Ichkenne PHP nicht (progge mehr mit Perl) aber in RegExps bedeutet das Cirumflex immer, dass ein String mit dem danach Deklarierten beginnen _muss_
In dem Fall würde ich versuchen, das [^"] herauszunehmen, und erstmal testen, was passiert.
PHP-RegExp-Tutorial: http://weblogtoolscollection.com/regex/regex.php
Pata
[Editiert am 14/9/2006 von Pata] ____________________
die schönsten Kurven sind nicht die vom Roadster ;-)
|
|
Pata
Beiträge: 1836 Registriert: 3.12.2003 Status: Offline |
erstellt am: 14.9.2006 um 12:26 Uhr: |
Noch was: Hacker liest bestimmt mit.
Alle, die dazu etwas sagen können, sollten Sam vielleicht lieber PNs schreiben.
Sam: Für die Antworten auch!
Pata
[Editiert am 14/9/2006 von Pata] ____________________
die schönsten Kurven sind nicht die vom Roadster ;-)
|
|
irishman
Beiträge: 3645 Registriert: 7.11.2003 Status: Offline |
erstellt am: 14.9.2006 um 12:50 Uhr: |
Was Ihr mach, ist egal, aber macht was!!!
Sonst ergeht es uns am Ende noch so -> http://www.granadaundscorpioforum.de/ ____________________ greetz Irishman...
Wer nicht überzeugen kann, sollte wenigstens Verwirrung stiften... |
|
Skeptiker
* Moderator * Beiträge: 2907 Registriert: 9.6.2004 Status: Offline |
erstellt am: 14.9.2006 um 13:08 Uhr: |
____________________
Leben bedeutet Veränderung -
ob man will oder nicht. |
|
SAM
ehemaliger Administrator Beiträge: 1361 Registriert: 2.4.2003 Status: Offline |
erstellt am: 14.9.2006 um 13:39 Uhr: |
Zitat: ... in RegExps bedeutet das Cirumflex ...
Wenn ich das richtig sehe, dann bedeutet
code: |STYLE\s*=\s*"[^"]*"|si
1. das Wort STYLE
2. eine beliebige Anzahl Leerzeichen
3. ein =
4. eine beliebige Anzahl Leerzeichen
5. ein "
6. eine beliebige Anzahl an Zeichen, die kein " sind
7. ein "
Selbst umgangssprachlich formuliert, fällt mir gerade nichts ein, wie man eventuell nicht vorhandene " mit berücksichtigen könnte. Vielleicht von STYLE bis zum Ende des HTML-Tags bei > einfach alles rauswerfen, und dabei in Kauf nehmen, dass eventuell auch gewünschte Attribute mit eliminiert werden?
Zitat: Noch was: Hacker liest bestimmt mit.
Hmm, kann sein. Aber die neue Lösung sollte dann eigentlich so wasserdicht werden, dass man sie nicht geheimhalten muss. "Security through obscurity is no security at all." Und das, was ich bis jetzt hier geschrieben habe, ist ohnehin bekannt. ____________________ |
|
SAM
ehemaliger Administrator Beiträge: 1361 Registriert: 2.4.2003 Status: Offline |
erstellt am: 14.9.2006 um 13:48 Uhr: |
Zitat: Was Ihr mach, ist egal, aber macht was!!!
KEINE PANIK! (in großen freundlichen Buchstaben)
Es ist hier nicht das Forum gehackt worden*), sondern "nur" eine JavaScript-Sicherheitslücke in bestimmten Browsern (IE gehört auf jeden Fall dazu, Firefox 1.5 nicht und Opera 9 auch nicht) ausgenutzt worden, um die Logindaten von Benutzern auszuspähen. Wer den IE benutzt, sollte JavaScript besser abschalten.
*) *aufholzklopf* Wer weiß, was für Schwachstellen das Forum so haben mag... ____________________ |
|
SAM
ehemaliger Administrator Beiträge: 1361 Registriert: 2.4.2003 Status: Offline |
erstellt am: 14.9.2006 um 14:28 Uhr: |
Zitat: Vielleicht von STYLE bis zum Ende des HTML-Tags bei > einfach alles rauswerfen, und dabei in Kauf nehmen, dass eventuell auch gewünschte Attribute mit eliminiert werden?
So, genau das habe ich jetzt gemacht. Sicherheitshalber. Zumindest bis jemand hier noch eine bessere Idee hat... ____________________ |
|
Pata
Beiträge: 1836 Registriert: 3.12.2003 Status: Offline |
erstellt am: 14.9.2006 um 14:42 Uhr: |
Hallo Sam!
>> So, genau das habe ich jetzt gemacht. Sicherheitshalber. Zumindest bis jemand hier noch eine bessere Idee hat...
Hauptsache, die Möglichkeit ist erst mal weg. Wäre noch zu prüfen und zu testen, da in der von Dir zitierten RegExp das Wort style uppercase ist (großgeschrieben), ob die RegExp auch matcht, wenn style lowercase steht.
Pata ____________________
die schönsten Kurven sind nicht die vom Roadster ;-)
|
|
SAM
ehemaliger Administrator Beiträge: 1361 Registriert: 2.4.2003 Status: Offline |
erstellt am: 14.9.2006 um 15:14 Uhr: |
Um upper/lowercase zu ignorieren ist das i am Ende der RegExp zuständig. ____________________ |
|
Cobold
Beiträge: 2385 Registriert: 16.4.2003 Status: Offline |
erstellt am: 14.9.2006 um 15:49 Uhr: |
Ich kenne das i in RegExp nicht, aber bin der Meinung, dass es so funktionieren sollte:
code:
(STYLE|style)\s*=\s*"[^"]*"
Erklärung:
(STYLE|style) Zeichenkette STYLE oder style
\s* Whitespaces 0 bis n-mal
= =
\s* Whitespaces 0 bis n-mal
" Anführungszeichen
[^"]* Zeichen außer Anrführungszeichen beliebig oft
" Anführungszeichen
____________________
|
|
Pata
Beiträge: 1836 Registriert: 3.12.2003 Status: Offline |
erstellt am: 14.9.2006 um 15:53 Uhr: |
>> Um upper/lowercase zu ignorieren ist das i am Ende der RegExp zuständig.
...steht das i-Flag doch für ignore case - hatte ich übersehen, sorry.
Ich muss eben mal weg, melde mich wieder, wenn ich die RegExp austeste.
Pata ____________________
die schönsten Kurven sind nicht die vom Roadster ;-)
|
|
Pata
Beiträge: 1836 Registriert: 3.12.2003 Status: Offline |
erstellt am: 14.9.2006 um 15:57 Uhr: |
>>
code:
(STYLE|style)
Nein, das i-Flag ist besser. Nur auf STYLE ode style zu prüfen bringt deswegen wenig, weil der Hacker ja auch sTYle schreiben könnte, was einige Browser durchaus interpretieren würden.
Pata ____________________
die schönsten Kurven sind nicht die vom Roadster ;-)
|
|
Pata
Beiträge: 1836 Registriert: 3.12.2003 Status: Offline |
erstellt am: 14.9.2006 um 17:37 Uhr: |
Solele, ich glaube, ich habe was brauchbares:
code:
|STYLE\s*=\s*"*[^"]*"|si
Durch das i-Flag wird nicht nach Groß-/Kleinschreibung unterschieden (STYLE, style, StyLe werden gematcht).
Die RegExp "bedeutet":
Match mir jeden String bestehend aus:
STYLE gefolgt von
\s* keins oder beliebig viele Leerzeichen, gefolgt von
= einem Istgleichzeichen, gefolgt von
\s* keins oder beliebig viele Leerzeichen, gefolgt von
"* keins oder beliebig viele Anführungszeichen gefolgt von
[^"]* alle mögliche, beliebig vorkommene Zeichen, die kein Anführungszeichen sind, gefolgt von
" einem abschließenden Anführungszeichen
Getestet mit einem kleinen Perl-Script und einem Array besetehend aus drei verschiedenen, möglichen Tags mit Attributen (auch hinter dem style-Attribut) nach dem Muster, wie SAM es zuerst gepostet hatte: diese anderen Attribute bleiben unberührt, es wird nur nach style und seinem Inhalt gesucht.
Pata ____________________
die schönsten Kurven sind nicht die vom Roadster ;-)
|
|
HSINC
Beiträge: 49 Registriert: 6.5.2005 Status: Offline |
erstellt am: 14.9.2006 um 18:08 Uhr: |
das problem geht meiner meinung nach tiefer als das reine style ersetzen, da gibt es noch andere möglichkeiten durch den code.
desweiteren fällt mir grad kein (sinnvolles^^) regexp ein der das filtern könnte was der typ benutzt hat (naemlich ne style anweisung die nicht in " gesetzt war)
ich werd mich also heute abend mal hinsetzen und guggen was man da alles verändern muss, um das sicher zu bekommen.
alternativ wäre ein anderes forum, bei dem auch noch von seiten der entwickler bugfixing betrieben wird, durchaus sinnvoll
@pata dein regexpt filtert zb kein style=color:green;
[Editiert am 14/9/2006 von HSINC] |
|
Pata
Beiträge: 1836 Registriert: 3.12.2003 Status: Offline |
erstellt am: 14.9.2006 um 18:45 Uhr: |
>> @pata dein regexpt filtert zb kein *** (wird schon ersetzt, kann dich also nicht zitieren)
Ja, die Ursprungs-RegExp aber auch nicht. In Perl würde ich es so machen:
code:
$teststring =~ s|STYLE\s*=\s*"*[^"]*"{0,1} (.*)|matched_and_replaced $1|si;
Matcht aber auch nur, wenn der Tag nicht unmittelbar nach der style-Angabe geschlossen wird... Daher:
Um richtig was zu machen, müsste man natürlich mehr über den Code wissen (obwohl, wie gesagt, ich kenne PHP nicht im geringsten), wie was wo wie oft abgefragt wird usw.
Pata
[Editiert am 14/9/2006 von Pata] ____________________
die schönsten Kurven sind nicht die vom Roadster ;-)
|
|
Cobold
Beiträge: 2385 Registriert: 16.4.2003 Status: Offline |
erstellt am: 14.9.2006 um 21:07 Uhr: |
ein pragmatischer Ansatz wäre alle Strings, die die Zeichenfolge beinhalten zu filtern, egal ob im Style-Attribut oder nicht. ____________________
|
|
Pata
Beiträge: 1836 Registriert: 3.12.2003 Status: Offline |
erstellt am: 14.9.2006 um 23:02 Uhr: |
Hallo Cobold!
Nicht vergessen: onclick, onmouseover und alle möglichen Event-Handler! Aber ich glaube, die werden eh schon gefiltert, sonst hätte wir viel öfters böse(TM) Hacks.
Pata ____________________
die schönsten Kurven sind nicht die vom Roadster ;-)
|
|
DinA5
Beiträge: 295 Registriert: 12.8.2005 Status: Offline |
erstellt am: 15.9.2006 um 09:57 Uhr: |
@SAM: ich weiss jetzt nicht genau, warum und wie Du das Zeugs genau matchst und was alles erlaubt ist, aber warum machst Du nicht eine Positivliste? |
|
DinA5
Beiträge: 295 Registriert: 12.8.2005 Status: Offline |
erstellt am: 15.9.2006 um 09:58 Uhr: |
Achja, ich kann auch hernehmen, Dein Test auf " glaub ich funktioniert nicht. |
|
DinA5
Beiträge: 295 Registriert: 12.8.2005 Status: Offline |
erstellt am: 15.9.2006 um 10:15 Uhr: |
Ich hab da nochmal nachgedacht. Statt ewig herumzugrasen was man alles sperren muss würd ich (in Perl) sowas wie
(
p => [align => 1, valign => 1, ...],
ul => [],
img => [src => 1, alt => 1, ...]
)
machen, dann die <.+?> Sachen rausholen, den Tag anschaun, die Attribute nach Leerzeichen und = splitten und dann nur übernehmen, wenn $hash{$tag}{$attrib}. Alles andere einfach weglöschen.
[UPDATE]
Also wenns ist, ich kann Dir sowas in Perl (ich kann leider kein PHP) schreiben, sollt aber in PHP recht ähnlich ausschaun.
[Editiert am 15/9/2006 von DinA5] |
|
SAM
ehemaliger Administrator Beiträge: 1361 Registriert: 2.4.2003 Status: Offline |
erstellt am: 15.9.2006 um 12:54 Uhr: |
Erst mal vielen Dank für Eure Mithilfe.
@ DinA5:
Alles mittels Positivliste zu behandeln wäre sicher die beste Lösung. Nur ist die Forumssoftware leider anders strukturiert.
Es gibt zwar eine - sogar über GUI bedienbare - Positivliste der erlaubten HTML-Tags. Deren Attribute kann man aber nur komplett verbieten oder erlauben. Also müssen wir Attribute erlauben, sonst kann man z.B. nicht verlinken.
Dann gibt es als zweite Maßnahme noch eine Negativliste zum Ausfiltern alles Bösen. Die ist eher rudimentär...
@ Pata:Zitat: alle möglichen Event-Handler! Aber ich glaube, die werden eh schon gefiltert
Nö.
Um nicht alles mögliche im Code umwerfen zu müssen, habe ich jetzt nur die Negativliste (RegExp's) um das erweitert, was Ihr hier erwähnt habt, und was mir noch eingefallen ist. Im Zweifelsfall filtere ich dabei eher mit der Holzhammermethode.
Zusätzlich zu den Originalfiltern aus der Forumssoftware eliminiere ich jetzt noch:
- das STYLE-Attribut (immer! jetzt auch zuverlässig!)
- alle Event-Handler-Attribute
- den String JAVA5CRIPT: (egal, wo auch immer er steht --> Holzhammer )
- den String .C00KIE (auch egal, wo immer er steht) ____________________ |
|
DinA5
Beiträge: 295 Registriert: 12.8.2005 Status: Offline |
erstellt am: 15.9.2006 um 13:43 Uhr: |
@SAM: achso, da kann man nicht eigenen Code reinwurschteln? |
|
SAM
ehemaliger Administrator Beiträge: 1361 Registriert: 2.4.2003 Status: Offline |
erstellt am: 15.9.2006 um 13:57 Uhr: |
Doch, kann man. Das mache ich ja schon. Nur habe ich keine Lust auf großflächige Änderungen. ____________________ |
|
DinA5
Beiträge: 295 Registriert: 12.8.2005 Status: Offline |
erstellt am: 15.9.2006 um 14:11 Uhr: |
Weiss zwar nicht, obs hier ins Forum gehört, aber ich denk es geht ja letztendlich mehr als 2 Personen an.
Das hab ich grad in Perl gebastelt, das tut soweit ganz gut. Den Nachteil dens noch hat ist, dass es HTML-Tags kaputtmacht, wenn man sowas <img src="test>"> macht, weil er den test> als Tag-abschluss sieht. Sollt aber eigentlich eh nicht vorkommen.
# hier mal als Beispiel fuer die Config
my %tags =
(
a => { href => 1, target => 1 },
p => { align => 1, valign => 1},
img => { src => 1, width => 1, height => 1 },
div => { class => 1 },
);
sub subst_helper
{
my $tag = shift(@_); # der komplette Tag
$tag = substr($tag, 1, -1); # ohne < und >
my ($tagname, $attrib_tmp) = split(/\s+/, $tag, 2);
$tagname = lc $tagname;
if (substr($tagname, 0, 1) eq '/') # schliessen tag
{
return '' unless exists $tags{substr($tagname, 1)}; # substr wegen /
return "<$tagname>";
}
else # oeffnen tag
{
return '' unless exists $tags{$tagname};
my $returntag = "<$tagname";
while (length $attrib_tmp) # die einzelnen Attribute wegschnipseln
{
my $key;
($key, $attrib_tmp) = split(/\s*=\s*/, $attrib_tmp, 2); # der Attributname ist alles bis zum =
my $value;
if (substr($attrib_tmp, 0, 1) eq "'") # wenn value in ' steht
{
$attrib_tmp = substr($attrib_tmp, 1);
($value, $attrib_tmp) = split(/'\s*/, $attrib_tmp, 2);
}
elsif (substr($attrib_tmp, 0, 1) eq '"') # wenn value in " steht
{
$attrib_tmp = substr($attrib_tmp, 1);
($value, $attrib_tmp) = split(/"\s*/, $attrib_tmp, 2);
}
else # wenn der valuestring ohne Anfuehrungszeichen dasteht geht er bis zum naechsten space
{
($value, $attrib_tmp) = split(/\s+/, $attrib_tmp, 2);
}
$returntag .= " $key=\"$value\"" if ($tags{$tagname}{$key});
}
$returntag .= '>';
return $returntag;
}
}
$html =~ s/(<.+?>/subst_helper($1)/ge;
[UPDATE]
Wenns wer braucht, um das in PHP umzuschreiben oder so kann ichs auch per Mail und richtig formatiert schicken.
[Editiert am 15/9/2006 von DinA5] |
|
bernihexe
Beiträge: 2144 Registriert: 6.8.2003 Status: Offline |
erstellt am: 15.9.2006 um 14:53 Uhr: |
Kein Wunder das ich mit meinem hohen Alter immer Kopfschmerzen vor dem PC kriege
Viel Spaß beim weiterbasteln......... wenns fertig ist will ich das dann aber auch haben.
Wird der Roady dadurch schneller......, tiefer....., breiter oder gar noch Sicherer
Naja wenns soweit ist wirds SAM schon verraten ____________________
s> |
|
DinA5
Beiträge: 295 Registriert: 12.8.2005 Status: Offline |
erstellt am: 15.9.2006 um 15:27 Uhr: |
> Kein Wunder das ich mit meinem hohen Alter immer Kopfschmerzen vor dem PC kriege
Also soooo schlecht programmier ich nun auch wieder nicht ;-)
Und ob der Roady schneller wird muss man noch testen. |
|
HSINC
Beiträge: 49 Registriert: 6.5.2005 Status: Offline |
erstellt am: 15.9.2006 um 16:07 Uhr: |
joar scheint zu funzen, auch wenn man durch die eingabe von " immernoch aus dem zugewiesenen kasten ausbrechen kann
[Editiert am 15/9/2006 von HSINC] |
|