前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ECShop最新4.1.0前台免登录SQL注入0day漏洞披露与分析

ECShop最新4.1.0前台免登录SQL注入0day漏洞披露与分析

原创
作者头像
腾讯代码安全检查Xcheck
发布2020-12-02 10:57:04
3.6K0
发布2020-12-02 10:57:04
举报

0x00 漏洞概述

影响版本:ecshop4.1.0及以下 是否需要身份认证:否,前台漏洞 漏洞类型:SQL注入 CNVD编号:CNVD-2020-58823,https://www.cnvd.org.cn/flaw/show/2454613 漏洞来源:xcheck代码安全检查 源码获取:https://www.ecshop.com/,登录注册下载,最新版本为4.1.1(已修复)。

0x01 漏洞详情

漏洞代码:/source/ecshop/delete_cart_goods.php,16行

漏洞代码
漏洞代码

$_POST变量直接传入sql语句进行拼接,再进入数据库查询,触发漏洞。

如果有对ecshop进行过代码审计的话,应该会知道在includes/safety.php存在个waf,但是在这个版本并没有生效,这里漏洞触发可以不进入这里的过滤防护逻辑

includes/safety.php
includes/safety.php

本地搭建验证如下,配置默认是开了报错,线上的测试环境也是,不存在报错的话可以通过盲注验证。报错注入的截图证明如下。

本地漏洞验证
本地漏洞验证

漏洞修复:对请求参数进行过滤。

漏洞修复
漏洞修复

0x02 注入漏洞利用分析

思路一:获取注入获取管理员密码md5

ecshop默认密码不加盐,所以可以直接注入找到ecs_admin_user表获取管理员密码的md5.

思路二:获取管理员session

如果管理员使用了较为复杂的密码,md5解不出来时,可以考虑获取session。即cookie中ECSCP_ID的值。 登录用户的session存在ecs_sessions表,但是只有sesskey。

ecs_sessions表
ecs_sessions表

代码中登录成功后cookie设置:setcookie($this->session_name, $this->session_id . $this->gen_session_key($this->session_id), 0, $this->session_cookie_path, $this->session_cookie_domain, $this->session_cookie_secure, TRUE);.

其中$this->session_name 就是ECSCP_ID, $this->session_id . $this->gen_session_key($this→session_id)就是最终cookie的值,数据库中sesskey对应的是$this->session_id,至于后半部分是通过gen_session_key这个函数生成。

代码语言:javascript
复制
function gen_session_key($session_id)
    {
        static $ip = '';
        if ($ip == '')
        {
            $ip = substr($this->_ip, 0, strrpos($this->_ip, '.'));
        } 
        return sprintf('%08x', crc32(ROOT_PATH . $ip . $session_id));
    }

后半部分gen_session_key通过ip和ROOT_PATH来确认,ip也在session表中可以找到,至于ROOT_PATH,可以通过猜测或者部分路径的报错拿到。最后拼凑到的,就是最终的cookie。

思路三: ecshop/api/client/includes/lib_api.php 写入shell

api/client 的访问需要登录,位于ecshop/api/client/includes/lib_api.php的API_UserLogin接口。这里登录是直接校验密码md5,也就是说当思路一解不出来时,这里也能用上密码的md5。

api登录
api登录

登录成功后访问api接口,可以利用一个任意写入漏洞。触发点为upload_image函数,在API_AddBrand函数中被调用。

upload_image函数
upload_image函数
调用upload_image函数
调用upload_image函数

最后登录成功后写入文件的payload为:

代码语言:javascript
复制
URL: http://localhost/ecshop/api/client/api.php

POST: Json= {"Action":"AddBrand","brand_name":"test","brand_logo":{"Data":"xx,"Type":"xx"}}

最后getshell

ecshop后台能读写文件的地方,大多做了限制。现在找到能shell的地方,就是在利用smarty模板渲染来执行代码,可参考ecshop原来爆过的一个任意代码执行漏洞,这里简要概述下。

  1. 首先插入代码,在模板管理里找到邮件模板,修改为{str:{\$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJ3hjaGVjay5waHAnLCc8P3BocCBwaHBpbmZvKCk7Jyk7IA=='));//}x

payload
payload

2. 再回到管理密码找回页面,点击确定,即可触发。

触发页面
触发页面

分析如下:$template['template_content']为我们插入的数据。

触发入口
触发入口

跟进fetch函数,进入eval函数前还有个fetch_str函数,会对payload进行一些过滤,这里不展开细节。

fetch函数
fetch函数

_eval函数将过滤后的字符串拿过来进行执行。由于是无回显,所以payload采用的是写文件的方式。

eval执行
eval执行

0x03 结束语

这个前台SQL注入较为简单,但是危害较高,只通过一些简单字符匹配规则去找类似这种漏洞的话,整个项目大概有三百多个,其中前台的风险大多被单双引号包裹且开了GPC防护,对xcheck来说仅需要加一点字符串比对处理即可筛选找出。

这个漏洞由xcheck检出,已第一时间上报CNVD,现在官网版本已经修复。本文仅限技术研究与讨论,严禁用于非法用途。

0x04 参考

Ecshop 2.x/3.x SQL注入/任意代码执行漏洞分析:https://www.secrss.com/articles/4965


想了解Xcheck更多信息或者代码安全审计相关技术欢迎关注xcheck公众号~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 漏洞概述
  • 0x01 漏洞详情
  • 0x02 注入漏洞利用分析
    • 思路一:获取注入获取管理员密码md5
      • 思路二:获取管理员session
        • 思路三: ecshop/api/client/includes/lib_api.php 写入shell
          • 最后getshell
          • 0x03 结束语
          • 0x04 参考
          相关产品与服务
          代码审计
          代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档