漏洞概述
ECShop的user.php文件中的display函数的模版变量可控,导致注入,配合注入可达到远程代码执行。攻击者无需登录站点等操作,可以直接远程写入webshell,危害严重。
漏洞评级
严重
影响范围
ECShop全系列版本,包括2.x,3.0.x,3.6.x等。
漏洞分析
0x01. SQL注入
先看 ecshop/user.php:302
$back_act
变量来源于 HTTP_REFERER
,可控。
Ecshop 使用了 php 模版引擎 smarty ,该引擎有两个基本的函数assign()、display()。assign()函数用于在模版执行时为模版变量赋值,display()函数用于显示模版。smarty运行时,会读取模版文件,将模版文件中的占位符替换成assign()函数传递过来的参数值,并输出一个编译处理后的php文件,交由服务器运行。
在:ecshop/includes/init.php:169
文件中创建了Smarty对象cls_template
来处理模版文件,对应的文件是includes/cla_template.php
,如下图:
我们再看 assign
函数:ecshop/includes/cls_template.php:70
assign
函数用于在模版变量里赋值。
display
函数:ecshop/includes/cls_template.php:100
从函数来看,首先会调用 $this->fetch
来处理user_passport.dwt
模板文件,fetch()
函数中会调用 $this->make_compiled
来编译模板。 make_compiled
会将模板中的变量解析,也就是在这个时候将上面 assign
中注册到的变量 $back_act
传递进去了,解析完变量之后返回到 display
函数中。此时 $out
是解析变量后的html内容,判断 $this->_echash
是否在 $out
中,若在,使用 $this->_echash
来分割内容,得到 $k
然后交给 insert_mod
处理。
user_passport.dwt
模版文件内容:
来看看 _echash
是啥,此文件28行:
由于 _echash
是固定的,不是随机生成的。(2.7版本的 _echash
值为 554fcae493e564ee0dc75bdf2ebf94ca
而3.x版本的 _echash
值为 45ea207d7a2b68c49582d2d22adf953
)所以 $val
内容可控!
跟进 insert_mod()
函数,此文件1150行:
$val
传递进来,先用 |
分割,得到 $para
和 $fun
,$para
进行反序列操作,insert_
和 $fun
拼接,最后动态调用 $fun($para)
。函数名部分可控,参数完全可控。接下来就是寻找以 insert_
开头的可利用的函数了,在 ecshop/includes/lib_insert.php
有一个 insert_ads
函数,正好满足要求。
最后来看动态内容函数库中的 inser