CubeCart 6.1.12 – 管理员身份验证绕过 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

CubeCart 6.1.12 – 管理员身份验证绕过

申博_安全工具 申博 239次浏览 已收录 0个评论

CubeCart 6.1.12 – 管理员身份验证绕过

CubeCart 6.1.12 - 管理员身份验证绕过

CubeCart是一个开源的电子商务解决方案,用于轻松安装的网上商店包。在我们最新的安全性分析之一中,我们发现此Web应用程序存在两个漏洞,允许攻击者绕过以管理员身份登录所需的身份验证机制。一旦被绕过,攻击者就可以在Web服务器上执行任意代码并窃取所有敏感文件和数据。在这篇技术博客文章中,我们将仔细研究这些有趣的漏洞,并了解自定义数据库抽象层如何反对您。

我忘记了我的密码!

这两个漏洞都可以通过CubeCarts“我忘记了密码!”功能进行利用。classes/cubecart.class.php在方法中的文件中实现_recovery()当用户忘记密码时,他可以使用此功能输入他的电子邮件地址,通过电子邮件收到的有效密码重置令牌,以及用于重置的新密码。

类/ cubecart.class.php

27612762276327642765276627672768
private function _recovery() {
	if (isset($_POST['email']) 
	&& isset($_POST['validate']) 
	&& isset($_POST['password'])) {
 $GLOBALS['user']->passwordReset($_POST['email'], 						$_POST['validate'], 
						$_POST['password']);
	}

在此方法的开头,这三个用户控制的参数将传递给位于passwordReset()其中的User方法classes/user.class.php该方法负责帐户检索。

类/ user.class.php

679680681682683684685686687688689690691692693694695
public function passwordReset($email, $verification, $password) {
	if (filter_var($email, FILTER_VALIDATE_EMAIL) 
	&& !empty($verification) &&!empty($password['password'])
	&& !empty($password['passconf']) 
	&& ($password['password'] === $password['passconf'])) {

 if (($check = $GLOBALS['db']->select('CubeCart_customer',  array('customer_id', 'email'),  array('email'=>$email, 'verify'=>$verification)))!==false) { 			
				// Password reset successful 			
		}
	}	
	
	return false;	// Password reset failed }

passwordReset()方法开始检查电子邮件是否是有效的电子邮件地址,所有参数是否为非空,以及密码是否在线等680-683如果其中一个检查失败,密码重置进度将在线失败694否则,下一次检查是由行中的select()调用发出的数据库查询685-687这里,用户提供的$email$verification令牌用作参数。

类/ database.class.php

569570571572573574575576
public function select($table, $columns = false, $where = false) {
	$table_where = $table;
	
	$parent_query = "SELECT $sql_cache $calc_rows ".
	implode(', ', $cols).	" FROM $wrapper{$prefix}$table$wrapper ".
 $this->where($table_where, $where)." $group $orderString $limit;"; 	
	$this->_execute($cache);

select()方法构造一个SQL查询,然后将其发送到数据库(行576)。为了构建SELECT查询的WHERE子句,应用程序使用的方法容易where()在管线574在接下来的两节中,我们将分析此where()方法并提供两个单独检测到的漏洞

未经验证的盲SQL注入

使用PHP内置函数完美地处理第二个参数中提供where()database.class.php清理值方法但是,如果值是一个数组(行),那么数组的每个值都会被联合到一行的SQL查询中$whereArraymysql_real_escape_string()811816

类/ database.class.php

807808809810811812813814815816817818819820821822823824
public function where($table, $whereArray = null, $label = false) {
	
	foreach ($whereArray as $key => $value) {
		
		if (is_array($value)) {
			foreach ($value as $val) {
				
 $or[] = "`$key` IN (".implode(',', $value).')'; 				
			}
			if (isset($or) && is_array($or)) {
 $where[] = implode(' OR ', $or); 				unset($or);
			}
		}
	
	}
 return 'WHERE '.implode(' AND ', $where);

作为攻击者,我们现在可以将数组作为用户输入传递。这将允许我们将SQL语法注入构造的SQL查询中并执行SQL注入攻击以从数据库中提取敏感信息。恶意POST请求可能如下所示:

email=contact@ripstech.com 验证[] = 0)+ OR +睡眠(10 密码[口令] = secretnewpassword 密码[passconf] = secretnewpassword 标记= 15f84b621a9982d65f82d6f12764ecdb

注意validate输入参数现在是一个不再包含有效密码重置令牌的数组,而是我们的SQL有效负载。构造的SQL查询可以在下面看到(注入的部分标记为红色)。

SELECT`customer_id`,`email` FROM`cc6111_CubeCart_customer` WHERE  cc6111_CubeCart_customer.email ='contact@ripstech.com' 
和`验证`IN(0)或睡眠(10);

因此,攻击者可以修改SQL查询并开始提取所有用户的密码哈希值,或者针对在数据库上转向底层操作系统的更复杂的攻击。但是,有一种更简单的方法来进行身份验证,而不是窃取和破解管理员的密码哈希。

  见RIPS报告

身份验证绕过

我们的第二个漏洞距离我们的SQL注入漏洞只有几行,这表明我们实际上不需要注入SQL语法来获得管理员的访问权限。文件where()方法database.class.php还引入了搜索修饰符

类/ cubecart.class.php

807808809810811812813814815816817818819820821822823824825826827828829830831
public function where($table, $whereArray = null, $label = false) {
	
	foreach ($whereArray as $key => $value) {
		
		if (isset($value) && !ctype_alnum($value) || $value=='NULL' || 
			is_null($value) || $value=='NOT NULL') {
			if(preg_match('#^([<>!~\+\-]=?)(.+)#',$value, $match)){
				switch ($match[1]) {
					case '~':
						// Fuzzy searching  $symbol = 'LIKE';  $value = "%{$match[2]}%"; 						break;
					default:
						$symbol = $match[1];
						$value = trim($match[2]);
				}
			}
		}
		$full_key = ($label ? $label : $this->_prefix.$table).".".$key;
		
		$where[] = "$full_key $symbol ".$this->sqlSafe($value, true);
		
	
	return 'WHERE '.implode(' AND ', $where);

基本上,该where()方法检查特殊字符(<>〜!+ – )的输入值,最终影响将在SQL查询的WHERE子句中使用哪个比较运算符。例如,值中的前缀波形符(~)将使用LIKE语法(行817-818构造SQL查询LIKE操作不需要数据库中的完全匹配,但允许使用通配符(%)。这可能会被滥用以绕过检查有效的密码重置令牌。我们所要做的就是为我们的密码重置令牌添加一个~字符前缀,并将尽可能多的通配符放入密码重置令牌中,与预期的令牌长度相同。这将导致以下SELECT查询:

 从CubeCart_customer中选择*,其中email ='contact@ripstech.com' 
并验证LIKE '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

需要正确验证令牌的WHERE条件将使用我们精心设计的验证令牌几乎始终评估为true,因此会被绕过。这允许攻击者在几秒钟内重置管理员密码并以管理员身份登录。在管理面板中,攻击者可以滥用管理功能来执行任意PHP代码。

摘要

我们检测到两个关键问题,允许攻击者绕过CubeCart的身份验证并以管理员身份登录。安全问题基于自定义数据库抽象层,该层以不安全的方式编译SQL查询。由于缺少预准备语句和自定义SQL并置功能,攻击者可能会错误地使用用于身份验证的SQL查询以绕过它。

我们要感谢CubeCart团队对这些问题的快速和专业处理。他们立即回复了我们的报告并迅速发布了固定版本。我们建议立即更新到CubeCart 6.1.13。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明CubeCart 6.1.12 – 管理员身份验证绕过
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址