为何 echo $GLOBALS['ECLANG'][''xor(phpinfo())or'']; 能执行phpinfo?
某是一款支持商家入驻的可开源多用户商城系统, 支持自营、联营、招商等多种运营模式,并拥有零售、批发、团购等多种业务模式,帮助企业低成本快速构建在线商城,在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]