21-PHP代码审计——jizhicms1.9.5文件上传漏洞

Posted songly_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21-PHP代码审计——jizhicms1.9.5文件上传漏洞相关的知识,希望对你有一定的参考价值。

影响版本:

jizhicms_Beta1.9.5

漏洞环境:

php5.6.27

jizhicms_Beta1.9.5

 

 

本次分析4月份左右jizhicms的1.9.5版本爆出来的文件上传漏洞。

 

文件上传漏洞点在后台的扩展管理 --> 插件列表中,如下所示

 

选择一个插件点击下载,burpsuite工具抓到如下数据

    post请求包有一个下载插件的url,并且这个下载的url是可控的,上传的漏洞点也是由这个url触发的,漏洞产生的具体原因继续分析update方法。

 

然后根据post请求的找到PluginsController中的update方法

//更新插件
function update(){
//对提交的数据过滤
	$filepath = $this->frparam('filepath',1);
	if(strpos($filepath,'.')!==false){
		JsonReturn(array('code'=>1,'msg'=>'参数存在安全隐患!'));
	}
	if($filepath){
		if($this->frparam('action',1)){
			$action = $this->frparam('action',1);
			// 自己获取这些信息,获取download的url地址
			$remote_url  = urldecode($this->frparam('download_url',1));
			$remote_url = strpos($remote_url,'?')!==false ? $remote_url.'&version='.$this->webconf['web_version'] : $remote_url.'?version='.$this->webconf['web_version'];
			$file_size   = $this->frparam('filesize',1);
            //临时的插件下载路径
			$tmp_path    = Cache_Path."/update_".$filepath.".zip";
			switch ($action) {
			    case 'prepare-download':
			    	$code = 0;
					ob_start(); 
					$ch=curl_init($remote_url); 
					curl_setopt($ch,CURLOPT_HEADER,1); 
					curl_setopt($ch,CURLOPT_NOBODY,1); 
					$okay=curl_exec($ch); 
					curl_close($ch); 
					$head=ob_get_contents(); 
					ob_end_clean(); 
					$regex='/Content-Length:\\s([0-9].+?)\\s/'; 
					$count=preg_match($regex,$head,$matches); 
					$filesize = isset($matches[1])&&is_numeric($matches[1])?$matches[1]:0; 

			        JsonReturn(array('code'=>0,'size'=>$filesize));
			        break;
			    case 'start-download':
			        // 这里检测下 tmp_path 是否存在
			        try {
			            set_time_limit(0);
			            touch($tmp_path);
			            // 做些日志处理
                        //打开下载url的文件开始下载
			            if ($fp = fopen($remote_url, "rb")) {
			                if (!$download_fp = fopen($tmp_path, "wb")) {
			                    exit;
			                }
			                while (!feof($fp)) {
			                    if (!file_exists($tmp_path)) {
			                        // 如果临时文件被删除就取消下载
			                        fclose($download_fp);
			                        exit;
			                    }
                                //将下载的文件写入到本地临时下载路径
			                    fwrite($download_fp, fread($fp, 1024 * 8 ), 1024 * 8);
			                }
                            //关闭文件流,到这一步已经下载完成
			                fclose($download_fp);
			                fclose($fp);

      update函数内部只是单纯的检查了download_url的url格式是否正确,没有进一步校验url来源的合法性,接着就开始创建临时的下载路径并下载download_url指定的插件,因此攻击者可以将url指定为特定的远程服务器的url下载恶意文件。

 

 

这里为了方便演示,将download_url格式指定为另一个站点的插件,可以看到响应消息页面上传成功。

漏洞分析完毕。

以上是关于21-PHP代码审计——jizhicms1.9.5文件上传漏洞的主要内容,如果未能解决你的问题,请参考以下文章

e语言代码如何审计

代码审计那些代码审计的思路

当前市面上的代码审计工具哪个比较好?

代码审计思路之PHP代码审计

代码审计利器-Seay源代码审计系统

代码审计系列:审计思路学习笔记