Проблемы безопасности, касающиеся ссылок в PHPBB2
Недавно я отредактировал некоторые регулярные выражения в файле bbcode.php в phpb2, и мне интересно, принесет ли это проблемы с безопасностью (в основном, относительно внедрения скриптов из href (если это вообще возможно)).
Я редактировал только теги [url], [url=] и мои недавно созданные теги [url=""] bbcode.
Их оригинальные регулярные выражения (датированные 2008 годом) не допускали использования "недопустимых" символов, таких как круглые скобки или пробелы в значении URL (которые необходимы для некоторых страниц Википедии и URL-адресов служб размещения файлов), поэтому вместо кодирования специальных URL-адресов символы, предложенные другими, я просто отредактировал регулярное выражение, чтобы разрешить буквенно-цифровые символы в протоколах и, в основном, любой символ в домене / остальной части URL-адреса.
Новые регулярные выражения внутри функции bbencode_second_pass в phpbb2 ($text = текст сообщения):
// 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]user@domain.tld[/email] code..
$patterns[] = "#\[email\]([a-z0-9&\-_.]+?@[\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 (javascript:), и он, похоже, не работает даже в Internet Explorer, и я не знаю ни одного способа внедрения скрипта через атрибут href тега A, будет ли есть ли риск позволить моим пользователям вводить все, что им нравится (при условии, что существует допустимый алфавитно-цифровой протокол, такой как *:// или www., который будет иметь http:// перед ним) в href тегов?
Обратите внимание, что я не рассматриваю ссылки на вредоносные сайты, я хочу знать, смогут ли хакеры внедрить сценарии / файлы cookie / что-либо еще через тег тега, не нажимая на него пользователя!
Теперь звучит немного избыточно, если атрибут href запускает что-либо без щелчка по его тегу, но в любом случае, есть ли способ для хакера внедрить вредоносный код / javascript в документ через атрибут href?
2 ответа
Я не проверял это сам, но следующее могло все еще работать:
[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]
Просматривая шаблоны регулярных выражений phpbb3.1, он также принимает любые символы в URL-адресах (ссылки преобразуются в html, как в примерах ниже) и не принимает протокол javascript://, поэтому сейчас он довольно безопасен. Я сосредоточусь больше на вопросах безопасности phpbb3 сейчас, когда обновляется программное обеспечение платы.