2012-04-13 12 views
0

Ich habe vor kurzem einige Regexps auf einer BBC Code.php phpbb2 bearbeitet und ich frage mich, ob es Sicherheitsprobleme bringen würde (in Bezug auf Skript Injektion von href, hauptsächlich (wenn es überhaupt möglich ist)).Sicherheitsfragen bezüglich Links in PHPBB2

Ich bearbeitet nur die [url], [url =] und meine neu erstellten [url = ""] BBCode-Tags.

Ihre ursprünglichen Regexps (datiert auf 2008) erlaubten keine "ungültigen" Zeichen wie Klammern oder Leerstellen im URL-Wert (die für einige Wikipedia-Seiten und Datei-Hosting-Dienste URLs benötigt werden), also anstatt zu kodieren die Sonderzeichen der URLs, wie von anderen vorgeschlagen, ich habe gerade die Regex bearbeitet, um alphanumerische Zeichen in den Protokollen und im Prinzip jedes Zeichen in der Domäne/Rest der URL-Adresse zu erlauben.

Die neuen regexps innerhalb bbencode_second_pass Funktion der phpbb2 ($ text = text des post):

// matches a [url]xxxx://www.phpbb.com[/url] code.. 
$patterns[] = "#\[url\]([\w]+?://.*?)\[/url\]#is"; 
$replacements[] = $bbcode_tpl['url1']; 

// [url]www.phpbb.com[/url] code.. (no xxxx:// prefix). 
$patterns[] = "#\[url\]((www|ftp)\..*?)\[/url\]#is"; 
$replacements[] = $bbcode_tpl['url2']; 

// [url=xxxx://www.phpbb.com]phpBB[/url] code.. 
$patterns[] = "#\[url=([\w]+?://.*?)\]([^?\n\r\t].*?)\[/url\]#is"; 
$replacements[] = $bbcode_tpl['url3']; 

// [url=www.phpbb.com]phpBB[/url] code.. (no xxxx:// prefix). 
$patterns[] = "#\[url=((www|ftp)\..*?)\]([^?\n\r\t].*?)\[/url\]#is"; 
$replacements[] = $bbcode_tpl['url4']; 


// [url="xxxx://www.phpbb.com"]phpBB[/url] code.. 
$patterns[] = "#\[url="([\w]+?://.*?)"\]([^?\n\r\t].*?)\[/url\]#is"; //closes on first "] 
//$patterns[] = "#\[url="([\w]+?://.*?)"\](?![\w\n\s]*"\])([^?\n\r\t].*?)\[/url\]#is"; //closes on last "] //discarded, ambigous 
$replacements[] = $bbcode_tpl['url3']; 

// [url="www.phpbb.com"]phpBB[/url] code.. (no xxxx:// prefix). 
$patterns[] = "#\[url="((www|ftp)\..*?)"\]([^?\n\r\t].*?)\[/url\]#is"; 
$replacements[] = $bbcode_tpl['url4']; 


// [email][email protected][/email] code.. 
$patterns[] = "#\[email\]([a-z0-9&\-_.][email protected][\w\-]+\.([\w\-\.]+\.)?[\w]+)\[/email\]#si"; 
$replacements[] = $bbcode_tpl['email']; 


$text = preg_replace($patterns, $replacements, $text); 

// Remove our padding from the string.. 
$text = substr($text, 1); 

return $text; 

Und die ungeschnittenen phpbb2 Erklärungen:

$bbcode_tpl['url1'] = str_replace('{URL}', '\\1', $bbcode_tpl['url']); 
$bbcode_tpl['url1'] = str_replace('{DESCRIPTION}', '\\1', $bbcode_tpl['url1']); 

$bbcode_tpl['url2'] = str_replace('{URL}', 'http://\\1', $bbcode_tpl['url']); 
$bbcode_tpl['url2'] = str_replace('{DESCRIPTION}', '\\1', $bbcode_tpl['url2']); 

$bbcode_tpl['url3'] = str_replace('{URL}', '\\1', $bbcode_tpl['url']); 
$bbcode_tpl['url3'] = str_replace('{DESCRIPTION}', '\\2', $bbcode_tpl['url3']); 

$bbcode_tpl['url4'] = str_replace('{URL}', 'http://\\1', $bbcode_tpl['url']); 
$bbcode_tpl['url4'] = str_replace('{DESCRIPTION}', '\\3', $bbcode_tpl['url4']); 

Das mit meinem Debugging völlig in Ordnung, funktioniert so weit, jetzt Ich würde gerne fragen, ob ich durch das Zulassen eines beliebigen Charakters innerhalb des href-Attributs des A-Tags meine Benutzer oder mich einem Hackerangriff aussetzen würde?

Angenommen, ich habe den Javascript-URI-Hack (Javascript :) getestet und er scheint selbst im Internet Explorer nicht zu funktionieren, und ich weiß nichts über das href-Attribut eines A-Tags Wäre es möglich, meinen Benutzern zu erlauben, zu tippen, was auch immer sie möchten (solange es ein gültiges alphanumerisches Protokoll wie *: // oder www. gibt, dem vorher http: // vorangestellt wird) in der href von Tags?

Bitte beachten Sie, dass ich nicht in Betracht ziehe, auf schädliche Websites zu verlinken. Ich möchte wissen, ob Hacker Scripts/Cookies/was auch immer durch die href eines Tags injizieren können, ohne dass der Benutzer darauf klickt!

Jetzt klingt es ein wenig überflüssig, dass ein href-Attribut alles ausführt, ohne dass das Tag angeklickt wird, aber gibt es auch einen Weg für einen Hacker, bösartigen Code/Javascript über das href-Attribut in das Dokument zu injizieren?

+0

Leerzeichen und Wagenrücklauf sind in URLs und gegen die Spezifikation unzulässig. Leerzeichen sollten als '% 20' codiert sein.Wenn Sie Wagenrücklauf/Zeilenende einfügen müssen, können Sie dies mit '% 0A' und/oder'% 0D' nach Bedarf tun. – Cheekysoft

+0

Wenn Sie RFC-Spezifikationen angeben, wären sogar runde Klammern dann illegal und werden benötigt für einige Wikipedia-Seiten. Ich weiß, dass Encoding eine nette Lösung sein könnte, aber ich werde meine Endbenutzer nicht fragen, wie sie ihre eigenen URLs codieren können, und in phpbb würde es nicht viel anders sein als das, was implementiert wird: phpbb ermöglicht es dem Benutzer Tippe Leerraum mit meinem Mod, aber wenn der HTML-Code erzeugt wird, werden alle ungültigen Zeichen richtig kodiert - sagen wir, '[url = www.a.com/aa] ... [/ url]' wird zu '...'. –

Antwort

1

Ich habe es selbst nicht getestet, aber die folgenden funktionieren könnte noch:

[url]javascript://%0Aalert(1)[/url] 
[url=javascript://%0Aalert(1)]…[/url] 
[url="javascript://%0Aalert(1)"]…[/url] 

Diese sollten alle Ergebnisse in der folgenden JavaScript-Code als %0A zu einem Newline-Zeichen decodiert wird:

// 
alert(1) 

Nächste Schätzung: Da Sie ein beliebiges Zeichen einschließlich des Attributwerts " zulassen, funktionieren diese möglicherweise:

[url]http://example.com/" onclick="alert(1)[/url] 
[url=http://example.com/" onclick="alert(1)]…[/url] 
+0

Danke für die Hilfe. Ich habe es vorher getestet und, obwohl es eine ": //" Zeichenfolge hat, die ein Protokoll definieren sollte, akzeptiert das phpbb2 es nicht als eine gültige Adresse. Ich habe von Ihnen angegebene URL mit diesen Variationen getestet: '[url = "http: //% 0Aalert (1)"] ... [/ url]' ' [url =" java: //% 0Aalert (1) "] ... [/ url]' '[url =" aaaaaaaaaa: //% 0Aalert (1) "] ... [/ url]' das sind alle gültigen URLs zur phpbb, jedoch jede Variante von "javascript : // "wird einfach geblockt und aus irgendeinem Grund als reiner Text angezeigt (eine Sicherheitsüberprüfung, von der ich nichts weiß?) –

+0

@ FabrícioMatté Dies liegt wahrscheinlich an der Ersetzung von' script: 'durch' script : 'an der Beginn von 'bbencode_second_pass', der verhindert, dass das Muster' [\ w] + ?: 'von der Übereinstimmung kommt. – Gumbo

+0

über '[url = http: //example.com/" onclick = "alert (1)] ... [/ url]' es wird in '' umgewandelt, da alle speziellen (ungültigen) URL-Zeichen in HTML umgewandelt werden phpbb beim Erstellen der Links. Dazu gehören die HTML-Zeichen '<>" & 'sowie nicht-standardmäßige UTF-8-Zeichen. Vielen Dank für Ihre Hilfe. :) –

0

phpbb3.1 regex Muster Blick durch, es nimmt auch jedes Zeichen in dem URLs (die Verbindungen umgewandelt werden, wie in den folgenden Beispielen html) und es nimmt kein javascript: // Protokoll so Es ist ziemlich sicher für den Moment. Ich konzentriere mich jetzt mehr auf die Sicherheitsprobleme von phpbb3, wenn die Board-Software aktualisiert wird.

+0

Es gibt keine Sicherheitsprobleme in phpBB 3, aber es gibt in phpBB 2. Wenn Sie will sicher bleiben, upgraden! – callumacrae

Verwandte Themen