EasySNS_V1.7
服务器GetShell
开启bd_image选项
EasySNS_V1.7提供了远程图片本地化功能模块,攻击者可以在发帖功能模块中通过编辑html内容部分并通过img标签来远程加载恶意php文件到本地间接性的实现文件上传从而导致Getshell~
源码下载:https://www.a5xiazai.com/php/139194.html
使用phpstudy搭建环境进行安装:
网站前台:http://127.0.0.1/
网站后台:http://127.0.0.1/admin.php/Login/login.html
漏洞文件: /app/common.func.php
漏洞函数:getImageToLocal
函数说明:getImageToLocal函数首先通过正则匹配的方式从img标签里面获取链接,之后判断是否是本站地址,如果不是则远程下载图片并保存到本地:
之后跟进这里的getImage函数,在这里首先会将$url两侧的空格去除,之后检查保存路径是否为空、保存文件名称是否为空等,之后获取远程文件,从这里可以看到如果type不为0则会通过curl_exec的方式来获取,可以清楚的看到这里存在SSRF漏洞,而这里的type默认为0,所以此时会进入到else语句中,之后会通过readfile的方式来远程读取文件内容并保存到本地,当url参数可控时可以实现远程copy文件到本地,为远程getshell创造条件:
/*
*功能:php完美实现下载远程图片保存到本地
*参数:文件url,保存文件目录,保存文件名称,使用的下载方式
*当保存文件名称为空时则使用远程文件原来的名称
*/
function getImage($url,$save_dir='',$filename='',$type=0){
if(trim($url)==''){
return array('file_name'=>'','save_path'=>'','error'=>1);
}
$uid = is_login();
if(trim($save_dir)==''){
$save_dir='./uploads/picture/cache/'.$uid.'/';
}
if(trim($filename)==''){//保存文件名
$ext=strrchr($url,'.');
/* if($ext!='.gif'&&$ext!='.jpg'){
return array('file_name'=>'','save_path'=>'','error'=>3);
} */
$filename=$uid.'_'.generate_password(8).time().$ext;
}
if(0!==strrpos($save_dir,'/')){
$save_dir.='/';
}
//创建保存目录
if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
return array('file_name'=>'','save_path'=>'','error'=>5);
}
//获取远程文件所采用的方法
if($type){
$ch=curl_init();
$timeout=5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$img=curl_exec($ch);
curl_close($ch);
}else{
ob_start();
readfile($url);
$img=ob_get_contents();
ob_end_clean();
}
//$size=strlen($img);
//文件大小
$fp2=@fopen($save_dir.$filename,'a');
fwrite($fp2,$img);
fclose($fp2);
unset($img,$url);
return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
}
之后全局搜索调用了getImageToLocal的位置,发现在发帖功能模块存在一处可以利用的调用点,用户在发帖时可以通过img标签插入恶意远程文件链接,之后通过远程图片本地化的方式将文件读取到本地服务器端,从而实现写shell的操作:
Step 1:登录网站后台,开启远程图片本地化功能,之后清除缓存(否则无法正常生效)
Step 2:在攻击者本地使用Python启动一个web服务并托管以下php代码
<?php
phpinfo();
?>
Step 3:注册一个test1用户,在发帖功能模块中插入img标签并附上恶意文件链接
Step 4:点击发布后,查看我的帖子,获取上传后的文件名
http://es.imzaker.com/zaker/uploads/picture/cache/2_cLtU5uQD1626666926.php
Step 5:之后获取用户UID
Step 6:文件路径格式为—/uploads/picture/cache/'.uid.'/+filename,拼接之后为"/uploads/picture/cache/2/2_cLtU5uQD1626666926.php",之后添加服务器地址并访问
1、关闭远程图片本地化下载功能
2、对远程图片本地化下载的图片文件后缀进行检查~