ECShop 4.0 前台SQL注入漏洞分析(需用户注册)

#00 前言

前两天看到有公众号发了ECShop的注入分析漏洞,所以想看下与笔者挖的是否重复,看完还是非常佩服作者的分析水平,基于Nday然后对整个利用链进行回溯分析,从而发现0day,对代码审计人员帮助颇多,不过这个漏洞需要用户注册,严格意义上来讲需要进行用户认证,因此危害性还不至于那么广泛。

漏洞分析出处:Ecshop 4.0 SQL(代码审计从Nday到0day )

#01 漏洞分析

整个漏洞利用链是基于两年前广泛流传的ECShop RCE漏洞链来的,笔者在挖掘ECShop的漏洞时也曾经在互联网上搜索过ECShop的历史漏洞,基本上都是由insert_mod引起的,这次漏洞也不例外,但是引出了一条新的攻击链,整个分析思路还是非常值得研究的。

本篇就以ECShop 4.0.7(20200102)为例进行分析,首先漏洞入口点在user.php第1146行

这里存在smarty的模板注入,通过$ecs->url()函数来对模板里的url变量进行赋值,跟进url()函数

继续跟进get_domain函数

那么这里的X-Forwarded-Host作为HTTP头部字段的首选,可以替代HOST,变成我们可以控制的变量,至此我们可以控制模板中的url变量,然后进行display

display在上次ECShop比较严重的漏洞中扮演了极其重要的角色,这次漏洞也不例外,通过读取模板注入后的文件内容,如果存在echash字段,则进行切割分析

$_echash字段事实上每个版本都为固定值,所以当知道对方ECShop版本时,这个变量就等同于一个固定变量,笔者认为从修复漏洞的角度来讲,该值如果为md5(time())这种随机值能增加很大的安全性!

回到上面display函数,通过echash切割模板文件内容,然后对奇数位置的文件内容进行insert_mod函数,由于我们可以控制url变量,事实上我们也可通过增加echash这个值到url变量中,来控制具体进入insert_mod的值的内容,最后跟进到insert_mod函数

前文也提到了我们可以控制echash的位置来控制最终进入到insert_mod函数的中的name变量,那么这里对name变量中的"|"进行切割,对para内容进行反序列化,最终由insert_xxx函数调用$para变量,那么这里由于ECShop的代码特殊性,并没有像TP框架那样在代码初始化引入全局变量,因此这里如果想要有效利用,或者进行反序列化利用,就必须得看当前代码环境所包含的文件名,最好的情况就是包含的文件中存在insert_xxx函数,或者存在一些可利用的类能够进行反序列化?

而user.php所include或者require的文件数并不多

这里针对该路由特地包含了一个文件,实际上在user.php开头也引入了两个基础的配置文件,很难利用起来,那么跟进到includes/lib_clips.php文件进行分析,主要看亮点,一是看是否有可以进行反序列化的链,二是查看有无可以利用的insert_xxx函数

针对第一个反序列化的链,该文件都没有魔术方法,因此反序列化也就到此为止。

针对第二个insert_xxx函数,这里由于有原文的指导,笔者是知道一定存在可利用的函数,另外文中没提及,其实还有一个可利用的函数

上面两个函数其实都存在SQL注入漏洞,至此漏洞分析完毕。

#02 poc构造

poc构造其实讲究几个点,一个是控制echash的位置,使得能够控制的内容始终位于奇数位置,二就是需要对插入的内容进行序列化,对应代码中反序列化的操作。

至此可以通过注入漏洞获得管理员的相关信息,然后配合相关漏洞进入后台完成RCE。