2012-04-13 2 views
0

Недавно я редактировал некоторые регулярные выражения на bbcode.php phpbb2, и мне интересно, могут ли они вызвать проблемы с безопасностью (в том числе в случае смены скрипта из href, если это возможно).Вопросы безопасности, связанные с ссылками в PHPBB2

Я отредактировал только [url], [url =] и мои недавно созданные [url = ""] теги bbcode.

Их оригинальные регулярные выражения (датированные 2008 годом) не допускают «недопустимых» символов, таких как круглые скобки или белые пробелы в значении URL (которые необходимы для некоторых страниц в Википедии и URL-адресов хостов), поэтому вместо кодирования специальные символы URL-адресов, как это было предложено другими, я только что отредактировал регулярное выражение, чтобы разрешить буквенно-цифровые символы в протоколах и в основном любой символ в домене/остатке URL-адреса.

Новые регэкспы внутри функции bbencode_second_pass PHPbb2 (в $ текст = текст Поста):

// 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; 

И неопубликованные декларации PHPbb2:

$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']); 

Это отлично работает с моей отладки до сих пор, в настоящее время Я хотел бы спросить, разрешаю ли любой персонаж помещаться в атрибут href тега A, чтобы подвергать себя или пользователей любой хакерской атаке?

Скажем, я протестировал javascript URI hack (javascript :), и он, похоже, не работает даже в Internet Explorer, и я не знаю, каким образом вводить скрипт через атрибут href тега A , будет ли риск, позволяющий моим пользователям набирать то, что им нравится (до тех пор, пока существует допустимый буквенно-цифровой протокол, такой как *: // или www, который будет иметь http: //, размещенный до него) в href из тегов?

Обратите внимание, что я не собираюсь ссылаться на вредоносные сайты, я хочу знать, смогут ли хакеры вставлять скрипты/куки-файлы/через href тега без щелчка на нем!

Теперь звучит немного избыточно, чтобы атрибут href выполнял что-либо без щелчка его тега, но в любом случае, есть ли способ для хакера внедрить вредоносный код/​​javascript в документ через атрибут href?

+0

Пробелы и возврат каретки являются незаконными в URL-адресах и против спецификации. Символы пробела должны быть закодированы как '% 20'.Если вы должны включить возврат каретки/окончание строки, вы можете сделать это с помощью '% 0A' и/или'% 0D' по мере необходимости – Cheekysoft

+0

Если вы имеете в виду спецификации RFC, даже скобки будут незаконными тогда, и они понадобятся для некоторых страниц Википедии. Я знаю, что кодирование может быть хорошим решением, но я не буду просить своих конечных пользователей знать, как кодировать свои собственные URL-адреса, а в phpbb это будет не совсем иначе, чем то, что реализовано: phpbb позволяет пользователю напечатайте пробел с моим модом, но когда HTML сгенерирован, все незаконные символы правильно закодированы - скажем, '[url = www.a.com/aa] ... [/ url]' превращается в '...'. –

ответ

1

Я не проверял это сам, но следующий может работать:

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

Они должны все результаты в следующем коде JavaScript, как %0A декодируется с новой строки:

// 
alert(1) 

Следующее предположение: поскольку вы разрешаете любой символ, включая значение атрибута, разделяющее ", они могут работать:

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

Спасибо за помощь. Я тестировал его раньше и, хотя у него есть строка:: //, которая должна определять протокол, phpbb2 не принимает его как действительный адрес. Я проверил свой заданный URL с этими изменениями: '[URL = "HTTP: //% 0Aalert (1)"] ... [/ URL]' ' [URL =" Java: //% 0Aalert (1) "] ... [/ url]' '[url =" aaaaaaaaaa: //% 0Aalert (1) "] ... [/ url]', которые являются действительными URL-адресами для phpbb, однако, любая вариация «javascript : // "просто заблокирован и по какой-либо причине показан как чистый текст (проверка безопасности, о которой я не знаю?) –

+0

@ FabrícioMatté Возможно, это связано с заменой' script: 'на' script : 'на начало 'bbencode_second_pass', которое предотвращает совпадение шаблона' [\ w] + ?: '. – Gumbo

+0

о '[url = http: //example.com/" onclick = "alert (1)] ... [/ url]' он преобразуется в '', так как все специальные (недопустимые) URL-адреса преобразуются в html посредством phpbb при создании ссылок. Это включает символы HTML '<>" & ', а также любые нестандартные символы UTF-8. Спасибо за вашу помощь еще раз. :) –

0

Просматривая регулярных выражений шаблонов phpbb3.1, он делает также принимать любые символы в URL (ссылки преобразуются в HTML, как в примерах ниже), и он не принимает JavaScript: // протокол так сейчас это довольно безопасно. Сейчас я сосредоточусь больше на проблемах безопасности phpbb3, когда обновляется программное обеспечение платы.

+0

В phpBB 3 нет проблем с безопасностью, но есть в phpBB 2. Если вы хотите оставаться в безопасности, обновить! – callumacrae

Смежные вопросы