前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasySNS_V1.6远程图片本地化Getshell

EasySNS_V1.6远程图片本地化Getshell

作者头像
Al1ex
发布2021-07-22 15:41:39
9590
发布2021-07-22 15:41:39
举报
文章被收录于专栏:网络安全攻防
影响范围

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创造条件:

代码语言:javascript
复制
/* 
*功能: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代码

代码语言:javascript
复制
<?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、对远程图片本地化下载的图片文件后缀进行检查~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七芒星实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 影响范围
  • 漏洞类型
  • 利用条件
  • 漏洞概述
  • 环境搭建
  • 漏洞分析
  • 漏洞利用
  • 安全建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档