(CVE-2019-13376)PhpBB从session id泄露到CSRF到XSS

一、漏洞简介

该漏洞源于WEB应用未充分验证请求是否来自可信用户。攻击者可利用该漏洞通过受影响客户端向服务器发送非预期的请求。

二、漏洞影响

PhpBB 3.2.7

三、复现过程

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

1.png

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

http://www.0-sec.org/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值

2.png

至于cookie中session值的key :phpbb3_qnsnz_sid

3.png

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

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

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

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

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

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

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

6.png

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

7.png

8.png

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

9.png

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

10.png

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

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

11.png

因此我们可以构造如下poc

12.png

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

13.png

构造远程图片链接

http://wwww.0-sec.org/poc.php?avatar.png

14.png

攻击者的头像加载成功

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

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

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

15.png

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

16.png

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

17.png

18.png

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

在phpBB中有如下的安全策略

19.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语法。

20.png

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

21.png

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

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

22.png

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

23.png

结果如下

24.png

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

25.png

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

26.png

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

27.png

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

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

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

28.png

29.png

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

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

参考链接

https://xz.aliyun.com/t/7829