有关PHPBB2中链接的安全问题

时间:2012-04-13 11:58:14

标签: php security phpbb

我最近在phpbb2的bbcode.php上编辑了一些regexp,我想知道它是否会带来安全问题(关于来自href的脚本注入,主要是(如果它甚至可能))。

我只编辑了[url],[url =]和我新创建的[url =“”] bbcode代码。

他们的原始正则表达式(日期为2008年)不允许url值中的括号或空格中的“无效”字符(某些维基百科页面和文件托管服务的URL需要),因此不是编码其他人建议使用URL的特殊字符,我只是编辑了正则表达式以允许协议中的字母数字字符,以及域/其余网址中的任何字符。

phpbb2的bbencode_second_pass函数中的新正则表达式($ text = 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]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']); 

到目前为止,这对我的调试完全正常,现在我想问一下,是否允许将任何字符放在A标记的href属性中,我将我的用户或我自己暴露给任何黑客攻击?

说,我测试了javascript URI hack(javascript :),它似乎在Internet Explorer上似乎不起作用,我不知道通过A标记的href属性注入脚本的任何方式,允许我的用户输入任何他们喜欢的内容(只要有一个有效的字母数字协议,例如*://或www。将在其之前放置一个http://),就会有任何风险标签

请注意,我不考虑链接到恶意网站,我想知道黑客是否能够通过标签的href注入脚本/ cookies /而无需用户点击它!

现在,如果没有单击标签,href属性会运行任何东西听起来有点多余,但无论如何,黑客是否有办法通过href属性在文档中注入恶意代码/ javascript?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

通过phpbb3.1的正则表达式模式,它也接受URL中的任何字符(链接转换为html,如下面的示例所示)并且它不接受javascript://协议因此它相当安全现在。我现在将更多地关注phpbb3安全问题,以便在升级主板软件时使用。