MyBB远程代码执行攻击链(下)——SQL注入导致RCE(CVE-2021-27890)

0x00 前言

本文承接上文MyBB远程代码执行攻击链(上)——存储型XSS(CVE-2021-27889),旨在将这个有点复杂的SQL注入导致的RCE的形成原理讲清楚,先放从全文提炼的关键部分

1、模板取值使用危险函数eval(“字符串”),字符串的一部分是从数据库取值,从数据库所取的值是由用户输入

2、想使用如下形式执行代码

eval('echo "hi, ybdt!";');

碰到过滤一:对插入到数据库的双引号进行了转义,导致不能代码不能执行,如下所示

eval('echo "passthru(\"dir\")";');

3、想要在模板值中不使用双引号,即使用如下这种形式

eval('echo "${passthru(dir)}";');

碰到过滤二:MyBB会阻止将模板改为这种形式

4、通过导入模板时,模板某个属性存在二阶SQL注入漏洞,以此绕过3中的过滤

0x01 远程代码执行攻击链概述

国外著名论坛软件MyBB在1.8.16<=版本<=1.8.25受2个漏洞影响,在默认的MyBB配置下,这2个漏洞能被连在一起使用最终导致远程代码执行。第1个漏洞(“内嵌的自动URL”导致持久型XSS——CVE-2021-27889)发生在MyBB的渲染过程,允许任何普通论坛用户来嵌入存储型XSS攻击代码到帖子甚至私信中。

第2个漏洞(“主题属性中的SQL注入”导致RCE——CVE-2021-27890)是由于主题属性中存在SQL注入最终导致RCE,漏洞被触发需要管理员权限

一个经验丰富的攻击者能够开发一个针对存储型XSS的利用,然后发送一个私信给管理员,管理员登录论坛后打开私信,漏洞被触发,一个RCE的利用代码将在后台自动执行,最终完全接管MyBB服务器

0x02 “主题属性中的SQL注入”导致的RCE(CVE-2021-27890)技术细节

上一篇文章提到的XSS漏洞是针对MyBB论坛管理员的攻击。如果攻击者成功注入JavaScript代码到正在登录论坛的管理员浏览器,他将能够执行任何管理员能执行的动作。但是MyBB限制比较严格,甚至阻止了管理员执行任意PHP代码,因此我们将呈现一个需要管理员权限的授权的RCE漏洞

MyBB管理员能访问的特性之一是MyBB论坛的主题管理器。一个MyBB主题包括一系列键值对,键指向当前页面的内容,值包含当前页面的内容。

下列是一个例子对于MyBB如何显示一个主题

eval('$modcplink = "'.$templates->get('header_welcomeblock_member_moderator').'";');

上述例子中表示主题中的键header_welcomeblock_member_moderator被请求。相应的,主题内容的值如下

<div id='welcomeblock_back'><b>{$mybb->user['username']}</b></div>

这意味着最终传递给eval()的字符串如下

$modcplink = "<div id='welcomeblock_back'><b>{$mybb->user['username']}</b></div>";

正如你能看到,字符串是被包含在双引号中的,且PHP变量{$mybb->user[‘username’]}是被插入到字符串中。由于{$mybb->user[‘username’]}被存储到数据库中时,MyBB会转义其中的双引号,因此没办法跳出双引号,也就没法导致远程代码执行

另外一个能导致RCE的PHP技巧是,攻击者修改模板,添加一个$到变量前,变成字符串内插,如下所示

$modcplink = "<div id='welcomeblock_back'><b>${arbitrary_function()}</b></div>";

然而,MyBB也会通过阻止管理员插入这样的形式来阻止这种特有的PHP技巧。

这意味着如果我们能够发现一种方式绕过MyBB过滤器,我们将依旧能够执行任意PHP代码。我们将通过一个SQL注入实现绕过

MyBB主题能被导入通过XML文件,这个XML文件包含一系列主题属性(例如图像目录或版本),即一系列键值对,这一系列键值对将被读取,其中name是和键相关的,value是内容。这是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<theme name="Theme Example" version="1405">
   <properties>
      <templateset><![CDATA[10]]></templateset>
      <imgdir><![CDATA[images/]]></imgdir>
      <logo><![CDATA[images/logo.png]]></logo>
   </properties>
   <stylesheets></stylesheets>
   <templates>
      <template name="header_welcomeblock_member_moderator" version="1404"><![CDATA[
         <div id='welcomeblock_back'><b>{$mybb->user['username']}</b></div>
      ]]></template>
   </templates>
</theme>

当一个管理员导入这样一个主题,XML是被解析,然后主题属性被存储到数据库。templateset属性存在二阶SQL注入

当这些主题被上传时,它们是被插入到MyBB的数据库实例中,并且在之后的其他SQL查询中没有任何过滤

我们已经知道了MyBB模板内容的值将传递给eval(),因此一个能控制主题属性值的攻击者将能够导致任意PHP代码执行。下列段落描述了SQL注入,让一个攻击者能够注入恶意模板代码到eval()调用中。

在每一个页面被载入的开始,MyBB会从数据库中取出全部的模板值,并存储它们到一个缓存中,其中SQL查询会使用templateset属性取到全部的模板值,这个templateset属性是被嵌入到查询字符串中,因此一个SQL注入漏洞发生了:

$query = $db->simple_select("templates", "title,template",
    "title IN (''$sql) AND sid IN ('-2','-1','".$theme['templateset']."')",
    array('order_by' => 'sid', 'order_dir' => 'asc')

正如被展示,查询会简单的拼接templateset属性。使用一个恶意的主题,一个人能够控制这个属性,然后让这个缓存函数返回攻击者控制的值。这是一个例子对于这样一个构造的主题使用一个SQL注入payload:

<?xml version="1.0" encoding="UTF-8"?>
<theme name="Default" version="1821">
   <properties>
      <templateset>') AND 1=0 UNION SELECT title, '${passthru(\'ls\')}' from mybb_templates -- </templateset>
   </properties>
</theme>

最终的SQL查询将看起来如下:

SELECT title, template FROM mybb_templates WHERE 
   title IN (‘header_welcomeblock_member_moderator’, ‘...’) AND SID IN (‘-2’, ‘-1’, ‘’) 
   AND 1=0 UNION SELECT title, '${passthru(\'ls\')}' from mybb_templates -- ’)

通过这个SQL注入,使用攻击者控制的数据来施毒模板缓存,其没有经过任何转义或过滤,这些模板值是完全攻击者控制的,然后被传递给eval()的双引号字符串中,因此我们能执行任意PHP代码在${}语法中。最终,一个攻击者能够执行任意PHP代码,然后拿下服务器

0x03 思考总结

现代高级攻击,越来越趋向:“多个特性+多个问题造成漏洞,多个漏洞chain成RCE”

0x04 参考链接

https://blog.sonarsource.com/mybb-remote-code-execution-chain

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
大佬不来一句? 抢沙发

请登录后发表评论