在 Macrob7 Macs 框架内容管理系统(CMS)1.1.4f 及更早版本中,对用户输入的不安全处理导致了 16 个 SQL 注入漏洞。能够执行任意 SQL 查询可能导致私有数据泄露,包括用户密码哈希,以及修改其他用户凭据和权限级别的能力。影响包括权限提升和潜在的远程代码执行(RCE)。
一份列出每个受影响端点、易受攻击参数以及易受攻击函数的电子表格可在此链接找到。
CWE 分类: CWE-89:SQL 命令中特殊元素的不当中和('SQL 注入')
报告者: Ally Petitt
受影响产品: Macrob7 Macs CMS
受影响版本: 1.1.4f 及更早版本
在我发现的 16 个实例中,用户输入在未进行适当清理或参数化的情况下被接收。例如,在此 CMS 的 "忘记密码" 功能中,会请求一个电子邮件地址。
Application/plugins/CMS/controllers/CMS.php:224
public function forgotPasswordProcess()
{
$this->loadModels();
$emailAddress = Post::getByKey('emailAddress');
$user = $this->usersModel->getUserByEmailAddress($emailAddress);
然后,电子邮件地址被传入方法 getUserByEmailAddress(),该方法将电子邮件传递给 selectSingle(),而 selectSingle() 是一个未能适当防范注入 SQL 查询的方法。
Application/plugins/CMS/models/Users_Model.php:41
public function getUserByEmailAddress($emailAddress)
{
return $this->selectSingle( $this->getCMSTableNameUsers(), array('EmailAddress'=>$emailAddress));
}
接着,selectSingle() 使用传入的用户输入调用 select()。
Application/core/DB.php:200
public function selectSingle($tableName, array $where = array(), array $fields = array('*'))
{
$return = $this->select($tableName, $where, $fields);
$single = NULL;
if( count($return) > 0 )
$single = $return[0];
return $single;
}
有漏洞的 select() 函数将传入的参数拼接成一个 SQL 查询,随后执行该查询。
Application/core/DB.php:186
public function select($tableName, array $where = array(), array $fields = array('*'))
{
$fieldsString = $this->generatePair($fields, ',');
$whereString = $this->generateKeyValuePair($where, '=', 'AND');
$sql = 'SELECT '.$fieldsString.' FROM '.$tableName;
if($whereString !='')
$whereString = ' WHERE '.$whereString;
$sql = $sql.' '.$whereString.';';
return $this->execute($sql)->fetchAll($this->returnType, $this->className);
}
由于缺乏输入清理、验证和参数化,此函数仍然容易受到 SQL 注入攻击。
不幸的是,此 CMS 缺乏维护意味着无法获得修补后的更新。个别用户可能会修改代码以包含参数化的 SQL 查询,而不是依赖拼接将用户输入传递给数据库。预编译语句(Prepared Statements)是实现这一缓解措施的示例。