关于 PHPBB2 中链接的安全问题

Security issues regarding links in PHPBB2

提问人:Fabrício Matté 提问时间:4/13/2012 更新时间:4/17/2012 访问量:260

问:

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

我只编辑了 [url]、[url=] 和我新创建的 [url=“”] bbcode 标签。

他们最初的正则表达式(日期为 2008 年)不允许“无效”字符,例如 url 值中的括号或空格(某些维基百科页面和文件托管服务的 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][email protected][/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.哪个会在标签的 href 中有一个 http:// 放在它之前)?

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

现在,让 href 属性在不点击其标签的情况下运行任何东西听起来有点多余,但无论如何,黑客有没有办法通过 href 属性在文档中注入恶意代码/javascript?

PHP 安全 phpbb

评论

0赞 Cheekysoft 4/13/2012
空格和回车符在 URL 中是非法的,并且违反了规范。空格字符应编码为 。如果必须包含回车符/行尾,则可以根据需要和/或%20%0A%0D
0赞 Fabrício Matté 4/14/2012
如果你指的是RFC规范,那么即使是括号也是非法的,并且某些维基百科页面需要它们。我知道编码可能是一个很好的解决方案,但我不会要求我的最终用户知道如何对他们自己的 URL 进行编码,而且在 phpbb 中,它与实现的没有太大区别:phpbb 允许用户使用我的 mod 输入空格,但是当生成 HTML 时,所有非法字符都被正确编码 - 比如说, 变成 .[url=www.a.com/a a]...[/url]<a href="http://www.a.com/a%20a">...</a>

答:

1赞 Gumbo 4/14/2012 #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赞 Fabrício Matté 4/14/2012
感谢您的帮助。我之前测试过它,尽管它有一个“://”字符串,它应该定义一个协议,但 phpbb2 不接受它作为有效地址。我已经用这些变体测试了您给定的 URL:它们都是 phpbb 的有效 URL,但是,由于某种原因,“javascript://”的任何变体都被简单地阻止并显示为纯文本(我不知道的安全检查?[url="http://%0Aalert(1)"]…[/url][url="java://%0Aalert(1)"]…[/url][url="aaaaaaaaaa://%0Aalert(1)"]…[/url]
0赞 Gumbo 4/14/2012
@FabrícioMatté 这可能是由于在开头替换了 by,从而阻止了模式匹配。script:script&#58;bbencode_second_pass[\w]+?:
0赞 Fabrício Matté 4/15/2012
关于它被转换成 ,因为所有特殊(无效)的 URL 字符在创建链接时都由 phpbb 转换为 html。这包括 HTML 字符以及任何非标准的 UTF-8 字符。再次感谢您的帮助。:)[url=http://example.com/" onclick="alert(1)]…[/url]<a href="http://example.com/%22%20onclick=%22alert%281%29">…</a><>"&
0赞 Fabrício Matté 4/17/2012 #2

查看 phpbb3.1 的正则表达式模式,它也接受 URL 中的任何字符(链接被转换为 html,如下例所示),并且它不接受 javascript:// 协议,所以它现在相当安全。我现在将更多地关注 phpbb3 安全问题,以便在升级开发板软件时进行讨论。

评论

0赞 callumacrae 4/24/2012
在 phpBB 3 中没有安全问题, 但是在 phpBB 2 中存在.如果您想保持安全,请升级!