<div class="blogpost-body" id="cnblogs_post_body">
<h1 class="col-article-title"><span style="color:#008080;font-size:18px;">Ecshop 2.x/3.x SQL注入/任意代码执行漏洞</span></h1>
<p><span style="font-size:16px;color:#008080;">影响版本:</span></p>
<p><span style="color:#000000;font-size:16px;"> </span>Ecshop 2.x</p>
<p> Ecshop 3.x-3.6.0</p>
<p><span style="font-size:16px;"><span style="color:#008080;">漏洞分析:</span></span></p>
<p><span style="color:#000000;font-size:14px;">该漏洞影响ECShop 2.x和3.x版本,是一个典型的“二次漏洞”,通过user.php文件中display()函数的模板变量可控,从而造成SQL注入漏洞,而后又通过SQL注入漏洞将恶意代码注入到危险函数eval中,从而实现了任意代码执行。<br><br>值得一提的是攻击者利用的payload只适用于ECShop 2.x版本导致有部分安全分析者认为该漏洞不影响ECShop 3.x,这个是因为在3.x的版本里有引入防注入攻击的安全代码,通过我们分析发现该防御代码完全可以绕过实现对ECShop 3.x的攻击(详见下文分析)。<br><br>注:以下代码分析基于ECShop 2.7.3</span></p>
<p><span style="color:#008080;font-size:14pt;">SQL注入漏洞分析:</span></p>
<p><span style="color:#000000;font-size:14px;">首先我们看一下漏洞的起源点 <span style="color:#008080;">user.php</span> ,在用户login这里有一段代码:</span></p>
<div class="cnblogs_code">
<pre class="blockcode"><span style="font-size:13px;"><span style="color:#008000;">/*</span><span style="color:#008000;"> 用户登录界面 </span><span style="color:#008000;">*/</span><span style="color:#000000;">
elseif ($action </span>== <span style="color:#800000;">'</span><span style="color:#800000;">login</span><span style="color:#800000;">'</span><span style="color:#000000;">)
{
</span><span style="color:#0000ff;">if</span><span style="color:#000000;"> (empty($back_act))
{
</span><span style="color:#0000ff;">if</span> (empty($back_act) && isset($GLOBALS[<span style="color:#800000;">'</span><span style="color:#800000;">_SERVER</span><span style="color:#800000;">'</span>][<span style="color:#800000;">'</span><span style="color:#800000;">HTTP_REFERER</span><span style="color:#800000;">'</span><span style="color:#000000;">]))
{
<span style="color:#ff0000;">$back_act </span></span><span style="color:#ff0000;">= strpos($GLOBALS['_SERVER']['HTTP_REFERER'], 'user.php') ? './index.php' : $GLOBALS['_SERVER']['HTTP_REFERER'</span><span style="color:#000000;"><span style="color:#ff0000;">];</span>
}
</span><span style="color:#0000ff;">else</span><span style="color:#000000;">
{
$back_act </span>= <span style="color:#800000;">'</span><span style="color:#800000;">user.php</span><span style="color:#800000;">'</span><span style="color:#000000;">;
}
}
$captcha </span>= intval($_CFG[<span style="color:#800000;">'</span><span style="color:#800000;">captcha</span><span style="color:#800000;">'</span><span style="color:#000000;">]);
</span><span style="color:#0000ff;">if</span> (($captcha & CAPTCHA_LOGIN) && (!($captcha & CAPTCHA_LOGIN_FAIL) || (($captcha & CAPTCHA_LOGIN_FAIL) && $_SESSION[<span style="color:#800000;">'</span><span style="color:#800000;">login_fail</span><span style="color:#800000;">'</span>] > <span style="color:#800080;">2</span>)) && gd_version() > <span style="color:#800080;">0</span><span style="color:#000000;">)
{
$GLOBALS[</span><span style="color:#800000;">'</span><span style="color:#800000;">smarty</span><span style="color:#800000;">'</span>]->assign(<span style="color:#800000;">'</span><span style="color:#800000;">enabled_captcha</span><span style="color:#800000;">'</span>, <span style="color:#800080;">1</span><span style="color:#000000;">);
$GLOBALS[</span><span style="color:#800000;">'</span><span style="color:#800000;">smarty</span><span style="color:#800000;">'</span>]->assign(<span style="color:#800000;">'</span><span style="color:#800000;">rand</span><span style="color:#800000;">'</span><span style="color:#000000;">, mt_rand());
}
<span style="color:#ff0000;">$smarty</span></span><span style="color:#ff0000;">->assign('back_act'</span><span style="color:#000000;"><span style="color:#ff0000;">, $back_act);</span>
$smarty</span>->display(<span style="color:#800000;">'</span><span style="color:#800000;">user_passport.dwt</span><span style="color:#800000;">'</span><span style="color:#000000;">);
}</span></span></pre>
</div>
<p>Ecshop使用了php模版引擎smarty,该引擎有两个基本的函数assign()、display()。assign()函数用于在模版执行时为模版变量赋值,display()函数用于显示模版。</p>
<p>smarty运行时,会读取模版文件,将模版文件中的占位符替换成assign()函数传递过来的参数值,并输出一个编译处理后的php文件,交由服务器运行。</p>
<p>可以看到 <span style="color:#008080;">$back_act </span>是从<span style="font- |
|