前言

phpBB是一个论坛软件,使用PHP语言开发的并开放其源码。是模块化设计,具专业性、安全性高、支持多国语系、支持多种数据库和自定义的版面设计等优越性能,而且功能强大。

自2000年发布以来, phpBB已经成为世界上应用最广泛的开源论坛软件。

phpBB 3.2.7版以及之前版本中存在一处安全问题:当管理员从phpBB后台控制面板切换到前台时,系统会将session id存放于访问的前台功能的URL中使得攻击者可以窃取这个session id。由于phpBB的安全限制,攻击者不可以直接利用这个sid登录后台,但是可以协同phpBB后台编辑bbcode页面存在的CSRF漏洞,在目标服务器上实现存储型XSS。

漏洞分析

首先来看一下phpBB的后台,也就是ACP页面

1fade44d81cf91aadbfee6e8b9b64375.png

可以发现所有后台功能的url中都会携带着sid(session id)参数:

http://127.0.0.1/phpbb/phpBB/adm/index.php?sid=9c4869b4054e9ff8d4d588c32ffcf7e7&i=1

如果url中sid值错误,即使已经登录后台也无法正常的访问后台页面

phpbb程序这样做的确有着这样做的优点,但也存在着很严重的安全隐患

优点:

在后台功能url中加入sid,相当于增加了一层安全屏障,降低了后台页面出现CSRF漏洞的几率,为什么这样说呢?假使因为开发疏忽,一个表单提交页面没有利用随机数对用户提交的表单进行保护,这通常会导致CSRF漏洞的产生。但是在phpbb应用中,所有的后台功能url中都加入了sid参数且phpbb对sid参数值合法性进行校验,即使攻击者在后台发现了一处没有随机数保护的表单提交页面,但在不知道管理

员sid值的情况下,也无法构造出一个有效的恶意表单提交页面地址

安全隐患:

这样的操作相当于在url中存放了本来只应该出现在cookie中的session id。如果url中的sid被泄露,攻击者有机会利用这个值伪造管理员身份进行登录后台操作(但不一定可以直接利用,这里涉及到phpBB的一个安全机制,后文会讲到)。

注意看,url中的sid值与cookie中的值完全一样,它们都是此用户的session id值

a727bbfd9e99d8af7ce92eb59df51530.png

至于cookie中session值的key :phpbb3_qnsnz_sid

310095afae1334c5a88e37b2006aea71.png

这个值在系统安装完成之后是固定的,无论什么身份的用户访问都是这个值

因此,如果管理员访问的url中sid值被泄露,攻击者可以有机会利用这个值构造cookie以便使用管理员身份登录后台

但是如何获取这个暴露在url中sid值呢?

由于phpbb的设计特色:当管理员使用完后台功能后想要切换到前台,后台页面中提供了一个跳转到前台地址的按钮

e93afabea080285f472969e7ff95edca.png

当管理员点击这个按钮切换到前台时,url中会带有sid

4bb9c1259a5bffba9c5c7b0e08103f81.png

其实前台页面的访问并不需要在url中使用sid,但从后台切换过来后url中会默认带上这个值。这就导致本应该只在后台功能url中出现的管理员sid泄露到了管理员访问的前台功能url中,而这个存在于url中的sid值很容易在前台页面加载远程资源时在HTTP_REFERER中被泄露

例如:在一些phpbb站点中可能会开启远程头像选项

92ceab7d6b6ca8843b45bb2ac3c3d44c.png

这个功能并不是默认开启的,当此功能开启后,用户可以设置远程头像

6c5e2ff9e8f384dd1467826dd185fa0b.png

f382c69315eb5f9220cd80cfdf5ac6ef.png

程序会在使用这个远程头像的时候将其加载进来

aec8701acb8a37e80e276828058bf057.png

如果管理员此时访问的页面在渲染时加载了攻击者的远程头像,且此时管理员访问的url中带有sid,sid将会被泄露

44e1b0231b2d0466eb63be98864f1603.png

我们是否可以构造一个恶意的远程图片链接poc,用以接收管理员的sid呢?

首先看一下phpBB在后台程序如何校验远程图片链接,phpBB使用getImageSize对用户添加的远程图片链接进行校验

4b309cf7ce0df6e31d907c347010ba32.png

因此我们可以构造如下poc

80de40f27885c454864e2d4b1886bd2f.png

poc.php除了需要记录加载该图片请求中的HTTP_REFERER,同时需要将图片进行返回展示

48634b633fb82765027d6f8930308591.png

构造远程图片链接

http://x.x.x.x/poc.php?avatar.png

8fa0e04de5df1cdda948464ae4cc350d.png

攻击者的头像加载成功

但是如何使得管理员加载这个头像资源呢?

只要给管理员留言,或者评论管理员发布的文章即可

以评论文章为例:当针对管理员发布的文章发表一条评论之后,管理员在前端页面即可收到一个消息提示

e1213eef63131716b7710bb5c4ce0392.png

点看之后可以看到被加载的头像

8966297ebff91c3afdf6865cff15e346.png

但无论管理员点开与否,在phpbb首页加载时,都会远程加载这个资源,HTTP_REFERER都会被发送到攻击者的服务器上

e321b34e590a226b8abd3aa1b8262f9c.png

946f0ef1b05ee18165001d78fcd5a886.png

到此为止,攻击者可以顺利获得sid值。但为什么上文说获取了sid值也不一定可以盗用管理员身份登录系统呢?

在phpBB中有如下的安全策略

e661d57f2a320a6b09176dfd1f3d8dc0.png

Session IP validation选项用来验证当前用户会话绑定的IP;All选项代表匹配完整地址,A.B.C选项匹配前面的x.x.x段,A.B选项匹配x.x,None选项关闭IP检查。

这项安全策略是用来检验用户sid与IP的绑定关系,系统默认采用A.B.C选项,因此攻击者在获取了管理员sid后,想要冒用身份也是很困难的。

然而这也不是无解的:

phpBB后台管理中包含着编辑BBCode的功能。

BBCode是Bulletin Board Code的缩写,也有译为「BB代码」的,属于轻量标记语言(Lightweight Markup Language)的一种,如字面上所显示的,它主要是使用在BBS、论坛、Blog等网络应用上。BBcode的语法通常为 [标记] 这种形式,即语法左右用两个中括号包围,以作为与正常文字间的区别。系统解译时遇上中括号便知道该处是BBcode,会在解译结果输出到用户端时转换成最为通用的HTML语法。

285e9bb6f0740bb0c8f2c109500661ec.png

当然,作为后台管理功能,访问此处url也需要sid

d54b78b87df2e8186c7da1dd68b3b648.png

由于上文的利用,攻击者可以获取sid,因此这里可以确定管理员此处后台功能的确切url

在此页面上,管理员可以添加,删除和编辑自定义BBCode。假如定义了这样的BBCode

35e14edd5986fb0cf3cfd10f6dd58fa7.png

用户可以在PM、话题或者帖子中使用这个BBCode

c08656b2ebd26a2aec703d2cc825b620.png

结果如下

0e0de6e356c7d1d5390ad45804c3db75.png

然而phpBB中编辑BBCode的功能存在CSRF问题,首先看一下编辑BBCode功能的后台代码

e3d599d122532f6b9197f6d1912be7fe.png

可以看到,这里的确有对csrf进行防范

45c2fe3f8d30a68f42780e666a1d9c07.png

但是问题出在了前面的$submit参数:

a64a118a0f84975f378f6b70a61c5915.png

只有提交的POST请求中存在submit参数,系统才会检查CSRF nonce。反之不会

因此,只要构造csrf时,请求中不带submit参数即可

$action、$bbcode_id、$bbcode_match与$bbcode_tpl参数均有$request->variable方式获取而来

b413f7d8cc4e07f361d7b53770f9aa29.png

81801c2f696b331b523458c65342d9c1.png

variable方法不仅会获取POST中提交的变量,也会获取通过GET提交的变量,这意味着攻击者可以通过GET参数传参来进行CSRF攻击。

当csrf攻击成功后,恶意的bbcode将会被添加。之后攻击者可以滥用这个bbcode短代码,在消息、话题、帖子、回复中执行任意XSS代码。