ECSHOP php商城系统过滤不严导致SQL注入漏洞
影响版本: <br />ECSHOP 2.7.2 Release 0604 <br />程序介绍: <br />ECSHOP是一款开源免费的网上商店系统。由专业的开发团队升级维护,为您提供及时高效的技术支持,您还可以根据自己的商务特征对ECSHOP进行定制,增加自己商城的特色功能。 <br />漏洞分析: <br />在include_libcommon.php中存在如下函数<br /><div class="codeText">
<div class="codeHead"><span class="lantxt">PHP Code</span><span class="copyCodeText" style="CURSOR: pointer" onclick="copyIdText('code_2129')">复制内容到剪贴板</span></div>
<div id="code_2129">
<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> get_package_info(</span><span class="vars">$id</span><span>) </span></span> </li>
<li class=""><span>{ </span> </li>
<li class="alt"><span> </span><span class="keyword">global</span><span> </span><span class="vars">$ecs</span><span>, </span><span class="vars">$db</span><span>,</span><span class="vars">$_CFG</span><span>; </span> </li>
<li class=""><span> </span> </li>
<li class="alt"><span> </span><span class="vars">$now</span><span> = gmtime(); </span> </li>
<li class=""><span> </span> </li>
<li class="alt"><span> </span><span class="vars">$sql</span><span> = </span><span class="string">"SELECT act_id AS id, act_name AS package_name, goods_id , goods_name, start_time, end_time, act_desc, ext_info"</span><span>. </span> </li>
<li class=""><span> </span><span class="string">" FROM "</span><span> . </span><span class="vars">$GLOBALS</span><span>[</span><span class="string">'ecs'</span><span>]->table(</span><span class="string">'goods_activity'</span><span>) . </span> </li>
<li class="alt"><span> </span><span class="string">" WHERE act_id='$id' AND act_type = "</span><span> . GAT_PACKAGE; </span> </li>
<li class=""><span> </span> </li>
<li class="alt"><span> </span><span class="vars">$package</span><span> = </span><span class="vars">$db</span><span>->GetRow(</span><span class="vars">$sql</span><span>); </span> </li>
<li class=""><span> </span> </li>
<li class="alt"><span> </span><span class="comment">/* 将时间转成可阅读格式 */</span><span> </span> </li>
<li class=""><span> </span><span class="keyword">if</span><span> (</span><span class="vars">$package</span><span>[</span><span class="string">'start_time'</span><span>] <= </span><span class="vars">$now</span><span> && </span><span class="vars">$package</span><span>[</span><span class="string">'end_time'</span><span>] >= </span><span class="vars">$now</span><span>) </span> </li>
<li class="alt"><span> { </span> </li>
<li class=""><span> </span><span class="vars">$package</span><span>[</span><span class="string">'is_on_sale'</span><span>] = </span><span class="string">"1"</span><span>; </span> </li>
<li class="alt"><span> } </span> </li>
<li class=""><span> </span><span class="keyword">else</span><span> </span> </li>
<li class="alt"><span> { </span> </li>
<li class=""><span> </span><span class="vars">$package</span><span>[</span><span class="string">'is_on_sale'</span><span>] = </span><span class="string">"0"</span><span>; </span> </li>
<li class="alt"><span> } </span> </li>
<li class=""><span> </span><span class="vars">$package</span><span>[</span><span class="string">'start_time'</span><span>] = local_date(</span><span class="string">'Y-m-d H:i'</span><span>, </span><span class="vars">$package</span><span>[</span><span class="string">'start_time'</span><span>]); </span> </li>
<li class="alt"><span> </span><span class="vars">$package</span><span>[</span><span class="string">'end_time'</span><span>] = local_date(</span><span class="string">'Y-m-d H:i'</span><span>, </span><span class="vars">$package</span><span>[</span><span class="string">'end_time'</span><span>]); </span> </li>
<li class=""><span> </span><span class="vars">$row</span><span> = unserialize(</span><span class="vars">$package</span><span>[</span><span class="string">'ext_info'</span><span>]); </span> </li>
<li class="alt"><span> unset(</span><span class="vars">$package</span><span>[</span><span class="string">'ext_info'</span><span>]); </span> </li>
<li class=""><span> </span><span class="keyword">if</span><span> (</span><span class="vars">$row</span><span>) </span> </li>
<li class="alt"><span> { </span> </li>
<li class=""><span> </span><span class="keyword">foreach</span><span> (</span><span class="vars">$row</span><span> </span><span class="keyword">as</span><span> </span><span class="vars">$key</span><span>=></span><span class="vars">$val</span><span>) </span> </li>
<li class="alt"><span> { </span> </li>
<li class=""><span> </span><span class="vars">$package</span><span>[</span><span class="vars">$key</span><span>] = </span><span class="vars">$val</span><span>; </span> </li>
<li class="alt"><span> } </span> </li>
<li class=""><span> } </span> </li>
<li class="alt"><span> </span> </li>
<li class=""><span> </span><span class="vars">$sql</span><span> = </span><span class="string">"SELECT pg.package_id, pg.goods_id, pg.goods_number, pg.admin_id, "</span><span>. </span> </li>
<li class="alt"><span> </span><span class="string">" g.goods_sn, g.goods_name, g.market_price, g.goods_thumb, g.is_real, "</span><span>. </span> </li>
<li class=""><span> </span><span class="string">" IFNULL(mp.user_price, g.shop_price * '$_SESSION') AS rank_price "</span><span> . </span> </li>
<li class="alt"><span> </span><span class="string">" FROM "</span><span> . </span><span class="vars">$GLOBALS</span><span>[</span><span class="string">'ecs'</span><span>]->table(</span><span class="string">'package_goods'</span><span>) . </span><span class="string">" AS pg "</span><span>. </span> </li>
<li class=""><span> </span><span class="string">" LEFT JOIN "</span><span>. </span><span class="vars">$GLOBALS</span><span>[</span><span class="string">'ecs'</span><span>]->table(</span><span class="string">'goods'</span><span>) . </span><span class="string">" AS g "</span><span>. </span> </li>
<li class="alt"><span> </span><span class="string">" ON g.goods_id = pg.goods_id "</span><span>. </span> </li>
<li class=""><span> </span><span class="string">" LEFT JOIN "</span><span> . </span><span class="vars">$GLOBALS</span><span>[</span><span class="string">'ecs'</span><span>]->table(</span><span class="string">'member_price'</span><span>) . </span><span class="string">" AS mp "</span><span>. </span> </li>
<li class="alt"><span> </span><span class="string">"ON mp.goods_id = g.goods_id AND mp.user_rank = '$_SESSION' "</span><span>. </span> </li>
<li class=""><span> </span><span class="string">" WHERE pg.package_id = "</span><span> . </span><span class="vars">$id</span><span>. </span><span class="string">" "</span><span>. </span> </li>
<li class="alt"><span> </span><span class="string">" ORDER BY pg.package_id, pg.goods_id"</span><span>; </span> </li>
<li class=""><span> </span> </li>
<li class="alt"><span> </span><span class="vars">$goods_res</span><span> = </span><span class="vars">$GLOBALS</span><span>[</span><span class="string">'db'</span><span>]->getAll(</span><span class="vars">$sql</span><span>); </span> </li>
<li class=""><span> </span> </li>
<li class="alt"><span> </span><span class="vars">$market_price</span><span> = 0; </span> </li>
</ol>
</div>
</div>
<br />其中$id没有经过严格过滤就直接进入了SQL查询,导致一个SQL注射漏洞。 <br />在系统的lib_order.php中存在一个该函数的调用 <br />
<div class="codeText">
<div class="codeHead"><span class="lantxt">PHP Code</span><span class="copyCodeText" style="CURSOR: pointer" onclick="copyIdText('code_8930')">复制内容到剪贴板</span></div>
<div id="code_8930">
<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> add_package_to_cart(</span><span class="vars">$package_id</span><span>, </span><span class="vars">$num</span><span> = 1) </span></span></li>
<li class=""><span>{ </span></li>
<li class="alt"><span> </span><span class="vars">$GLOBALS</span><span>[</span><span class="string">'err'</span><span>]->clean(); </span></li>
<li class=""><span> </span><span class="comment">/* 取得礼包信息 */</span><span> </span></li>
<li class="alt"><span> </span><span class="vars">$package</span><span> = get_package_info(</span><span class="vars">$package_id</span><span>); </span></li>
<li class=""><span> </span><span class="keyword">if</span><span> (emptyempty(</span><span class="vars">$package</span><span>)) </span></li>
<li class="alt"><span> { </span></li>
<li class=""><span> </span><span class="vars">$GLOBALS</span><span>[</span><span class="string">'err'</span><span>]->add(</span><span class="vars">$GLOBALS</span><span>[</span><span class="string">'_LANG'</span><span>][</span><span class="string">'goods_not_exists'</span><span>], ERR_NOT_EXISTS); </span></li>
<li class="alt"><span> </span><span class="keyword">return</span><span> false; </span></li>
<li class=""><span> } </span></li>
</ol>
</div>
</div>
在flow.php中存在可控的输入源 <br />
<div class="codeText">
<div class="codeHead"><span class="lantxt">PHP Code</span><span class="copyCodeText" style="CURSOR: pointer" onclick="copyIdText('code_6186')">复制内容到剪贴板</span></div>
<div id="code_6186">
<ol class="dp-c">
<li class="alt"><span><span class="vars">$package</span><span> = </span><span class="vars">$json</span><span>->decode(</span><span class="vars">$_POST</span><span>[</span><span class="string">'package_info'</span><span>]); </span></span></li>
<li class=""><span> </span><span class="comment">/* 如果是一步购物,先清空购物车 */</span><span> </span></li>
<li class="alt"><span> </span><span class="keyword">if</span><span> (</span><span class="vars">$_CFG</span><span>[</span><span class="string">'one_step_buy'</span><span>] == </span><span class="string">'1'</span><span>) </span></li>
<li class=""><span> { </span></li>
<li class="alt"><span> clear_cart(); </span></li>
<li class=""><span> } </span></li>
<li class="alt"><span> </span><span class="comment">/* 商品数量是否合法 */</span><span> </span></li>
<li class=""><span> </span><span class="keyword">if</span><span> (!</span><span class="func">is_numeric</span><span>(</span><span class="vars">$package</span><span>->number) || </span><span class="func">intval</span><span>(</span><span class="vars">$package</span><span>->number) <= 0) </span></li>
<li class="alt"><span> { </span></li>
<li class=""><span> </span><span class="vars">$result</span><span>[</span><span class="string">'error'</span><span>] = 1; </span></li>
<li class="alt"><span> </span><span class="vars">$result</span><span>[</span><span class="string">'message'</span><span>] = </span><span class="vars">$_LANG</span><span>[</span><span class="string">'invalid_number'</span><span>]; </span></li>
<li class=""><span> } </span></li>
<li class="alt"><span> </span><span class="keyword">else</span><span> </span></li>
<li class=""><span> { </span></li>
<li class="alt"><span> </span><span class="comment">/* 添加到购物车 */</span><span> </span></li>
<li class=""><span> </span><span class="keyword">if</span><span> (add_package_to_cart(</span><span class="vars">$package</span><span>->package_id, </span><span class="vars">$package</span><span>->number)) </span></li>
<li class="alt"><span> { </span></li>
<li class=""><span> </span><span class="keyword">if</span><span> (</span><span class="vars">$_CFG</span><span>[</span><span class="string">'cart_confirm'</span><span>] > 2) </span></li>
</ol>
</div>
</div>
<br />$package->package_id来源于输入 <br />解决方案: <br />厂商补丁 <br />ECSHOP <br />---------- <br />目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本: <br />http://www.ecshop.com <br />信息来源: <br />来源: WooYun
頁:
[1]