[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞

WordPress WP Easy Slideshow Plugin 1.0.3 - Multiple Vulnerabilities
漏洞编号为36612;OSVDB-ID:121270/121271


存在漏洞的为wordpress的一个插件,下载地址为
https://wordpress.org/plugins/wp-easy-slideshow/
https://downloads.wordpress.org/plugin/wp-easy-slideshow.zip


此插件中存在CSRF漏洞
首先可以删除任意的图片

在http://10.0.3.110/wordpress/wp-admin/admin.php?page=wss-add-image中上传一个图片

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第1张图片

在http://10.0.3.110/wordpress/wp-admin/admin.php?page=wss-images中可以看到上传的结果。

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第2张图片

在10.0.3.9上起一个服务器,上面有个网页名为deleteimage1.html,内容为


请求这个网页,浏览器上会显示一个图片受损的图标

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第3张图片

回头再看,可见图片已经被删除

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第4张图片

在这个请求图片标签的过程中,实际上是发出一个GET请求

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第5张图片

还有一种利用的方法就是提交表单,比如要删除id为3的图片

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第6张图片

可以构造一个网页,内容如deleteimage2.html。


  CSRF Delete Operation
  
    

再次将其放到10.0.3.9的机器上访问,结果被删除

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第7张图片



也可以利用此CSRF漏洞上传文件
在名为addfile.html文件中添加相应的javascript代码,完成相应的上传文件动作。

  WP CSRF File Upload
  
    
    

相应的数据包为

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第8张图片

访问这个页面之后,可见确实有新文件添加

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第9张图片


源码分析

处理图片上传的文件为/wp-easy-slideshow/includes/add_image.php,其中第3~5行代码为

if(!empty($_POST['submit'])){
	$result = $obj->add_image($_POST,$_FILES['wss_image']);
}

可知处理上传的操作的具体函数为add_image。此函数所处的位置为/wp-easy-slideshow/includes/class.php在第28~61行为函数的具体实现
	function add_image($postArray, $fileArray){
		global $wpdb;
		$prefix = $wpdb->prefix;
		
		$content = $postArray['desc_content'];
		$link = $postArray['image_link'];
		
		if($fileArray['error']) { 
			$res['status'] = 'error'; $res['msg'] = 'Upload a image'; 
		}
		else{
			$wpdb->insert($prefix.'wss_images', array( 'content' => $content, 'link' => $link ));
			
			if(($fileArray["type"] == 'image/jpeg') || ($fileArray["type"] == 'image/pjpeg'))	{
				$suf = ".jpg";
			}
			elseif($fileArray["type"] == 'image/gif')	{
				$suf = ".gif";
			}
			elseif($fileArray["type"] == 'image/png')	{
				$suf = ".png";
			}
			
			$filename = WSS_UPLOADS_DIR.'/'.$wpdb->insert_id.$suf;
			move_uploaded_file($fileArray['tmp_name'], $filename);
			image_resize($filename,296,120,false,'thumb',WSS_UPLOADS_DIR);
			
			$wpdb->update($prefix.'wss_images',array( 'guid' => $wpdb->insert_id.$suf ), array( 'id' => $wpdb->insert_id ) );
			
			$res['status'] = 'success'; $res['msg'] = 'Image added successfully';
		}
		
		return $res;
	}

先从CSRF的角度分析这段代码:
首先其未作任何防止CSRF的操作,比如强制验证码,Referer Check以及Token。
再从安全上传的角度来看,首先,其只对后缀名为jpeg、png、gif的文件进行处理,如果跳出这个范围,那么上传文件保存在服务器本地的文件没有后缀名,只有ID号。

代码的最后又通过image_resize()函数对图片进行二次渲染处理。这会破坏图片中的脚本代码。比如之前通过COPY将webshell添加在图片的尾部,经过处理后发现图片结尾出的php代码已经不见了。

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第10张图片

[漏洞分析] WordPress WP Easy Slideshow Plugin 1.0.3 CSRF漏洞_第11张图片

你可能感兴趣的:(漏洞分析)