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
来源:freebuf.com 2021-03-31 14:42:26 by: yibudengtian
请登录后发表评论
注册