某是一款支持商家入驻的可开源多用户商城系统, 支持自营、联营、招商等多种运营模式,并拥有零售、批发、团购等多种业务模式,帮助企业低成本快速构建在线商城,在PC、APP、微信等环境下,开启电子商务业务。
最近日站的时候遇到了这个cms,于是花时间审计了一发,收获颇丰,这里先放一个比较严重的问题出来。

审计入口

在ecmall.php中,对全局变量$_GET、$_POST$_COOKIE作了转义处理。一般全局作了转义以后程序员在后面写逻辑的时候就会比较放心大胆地进行各种拼接了。因此我们在审计代码的时候可以着重关注$_SERVER$_FILE$_REQUEST等变量。

![IMG20180123_112451.png][1]

Lang::get()用于获取指定键的语言项。举个例子,传入i_want_open_store,返回我要开店
![IMG20180123_123639.png][2]

$vkey是个由$key经过一些处理得到的字符串,字符串的内容是$GLOBALS数组变量,需要用eval函数来使它生效。

![IMG20180123_112855.png][3]

eval之前会调用strtokey()方法,作用就是传入$key, $owner, 返回字符串$owner['$key的值']。如果这里的$key包含单引号且没被转义呢?比如这里传入$key="'xor(phpinfo())or'生成的$vkey就是字符串$GLOBALS['ECLANG'][''xor(phpinfo())or''],这个字符串会最终进入eval造成代码注入。

![IMG20180123_122013.png][4]

也就是说,如果传入Lang::get()的参数包含没被转义的单引号就存在问题,而这个Lang::get()应用是相当之广的。。。

举个栗子。

漏洞复现

进入用户中心-个人资料,随意选择一张图片上传,保存修改。
[http://localhost/cms/ecmall/index.php?app=member&act=profile][5]

修改filename字段的值为 1.png'xor(phpinfo())or',成功执行phpinfo()

![IMG20180123_103701.png][7]

点击收藏 | 1 关注 | 2
登录 后跟帖