20.Ecshop 2.x/3.x SQL注入/任意代码执行漏洞

论坛 期权论坛     
选择匿名的用户   2021-5-29 20:52   94   0
<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>&#61;&#61; <span style="color:#800000;">&#39;</span><span style="color:#800000;">login</span><span style="color:#800000;">&#39;</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) &amp;&amp; isset($GLOBALS[<span style="color:#800000;">&#39;</span><span style="color:#800000;">_SERVER</span><span style="color:#800000;">&#39;</span>][<span style="color:#800000;">&#39;</span><span style="color:#800000;">HTTP_REFERER</span><span style="color:#800000;">&#39;</span><span style="color:#000000;">]))
        {
            <span style="color:#ff0000;">$back_act </span></span><span style="color:#ff0000;">&#61; strpos($GLOBALS[&#39;_SERVER&#39;][&#39;HTTP_REFERER&#39;], &#39;user.php&#39;) ? &#39;./index.php&#39; : $GLOBALS[&#39;_SERVER&#39;][&#39;HTTP_REFERER&#39;</span><span style="color:#000000;"><span style="color:#ff0000;">];</span>
        }
        </span><span style="color:#0000ff;">else</span><span style="color:#000000;">
        {
            $back_act </span>&#61; <span style="color:#800000;">&#39;</span><span style="color:#800000;">user.php</span><span style="color:#800000;">&#39;</span><span style="color:#000000;">;
        }

    }


    $captcha </span>&#61; intval($_CFG[<span style="color:#800000;">&#39;</span><span style="color:#800000;">captcha</span><span style="color:#800000;">&#39;</span><span style="color:#000000;">]);
    </span><span style="color:#0000ff;">if</span> (($captcha &amp; CAPTCHA_LOGIN) &amp;&amp; (!($captcha &amp; CAPTCHA_LOGIN_FAIL) || (($captcha &amp; CAPTCHA_LOGIN_FAIL) &amp;&amp; $_SESSION[<span style="color:#800000;">&#39;</span><span style="color:#800000;">login_fail</span><span style="color:#800000;">&#39;</span>] &gt; <span style="color:#800080;">2</span>)) &amp;&amp; gd_version() &gt; <span style="color:#800080;">0</span><span style="color:#000000;">)
    {
        $GLOBALS[</span><span style="color:#800000;">&#39;</span><span style="color:#800000;">smarty</span><span style="color:#800000;">&#39;</span>]-&gt;assign(<span style="color:#800000;">&#39;</span><span style="color:#800000;">enabled_captcha</span><span style="color:#800000;">&#39;</span>, <span style="color:#800080;">1</span><span style="color:#000000;">);
        $GLOBALS[</span><span style="color:#800000;">&#39;</span><span style="color:#800000;">smarty</span><span style="color:#800000;">&#39;</span>]-&gt;assign(<span style="color:#800000;">&#39;</span><span style="color:#800000;">rand</span><span style="color:#800000;">&#39;</span><span style="color:#000000;">, mt_rand());
    }

    <span style="color:#ff0000;">$smarty</span></span><span style="color:#ff0000;">-&gt;assign(&#39;back_act&#39;</span><span style="color:#000000;"><span style="color:#ff0000;">, $back_act);</span>
    $smarty</span>-&gt;display(<span style="color:#800000;">&#39;</span><span style="color:#800000;">user_passport.dwt</span><span style="color:#800000;">&#39;</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-
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP