频道栏目
首页 > 安全 > 网站安全 > 正文
Shopex ctl.passport.php文件SQL注入漏洞分析报告
2013-09-06 09:32:40      个评论      
收藏   我要投稿

这个漏洞已经公布了,在公司做的漏洞分析,随便就分享下这个文档。


漏洞作者blue,漏洞请看:/Article/201309/241275.html

   部分代码zend加密,分析之前需要解密。


idezender 8.1 破解版 下载地址:/soft/201309/41958.html


漏洞在注册的地方,于文件\core\shop\controller\ctl.passport.php文件

 

223行create 函数


function create() {
        $account = &$this->system->loadModel('member/account');  //  载入account'模块,文件在
        $passport = &$this->system->loadModel('member/passport');
 
。。。。。。。
if( !$info = $account->create($_POST,$message) ) {
            $this->splash('failed','back',$message,'','',$_POST['from_minipassport']);
        }
 

关键在$account->create($_POST,$message),直接把$_POST变量传过去了,这个变量里面是保存我们POST上来的所有数据。继续跟进,

在core\model_v5\member\mdl.account.php

把注册数据放到数据库

看到310行的create函数。


 

public function create( $data, &$message )
         {
…………
                   getrefer( $data );
                   $sql = $this->db->getInsertSQL( $rs, $data );

Getrefer函数不用管它,跟进getInsertSQL,在文件core\include_v5\ AloneDB.php


 

public function GetInsertSQL( &$rs, $data, $autoup = false )
 {
        if ( !function_exists( "db_get_insert_sql" ) )
        {
              require( CORE_INCLUDE_DIR."/core/db.tools.php" );
        }
        return db_get_insert_sql( $this, $rs, $data, $autoup );
 }


 

这只是把$data传到了db_get_insert_sql函数,继续跟进这个函数

在core\include_v5\ db.class.php文件找到了

这里foreach了一下,最终之前多POST的一个member_id也被带入到数据库。


 

foreach ( $data as $key => $value )
 {
        $data[strtolower( $key )] = $value;
 }


继续到下面


$insertValues = array( );
$col_count = mysql_num_fields( $rs['rs'] );
$i = 0;
for ( ;         $i < $col_count;        ++$i )
{
       $column = mysql_fetch_field( $rs['rs'], $i );
       if ( isset( $data[$column->name] ) )
       {
             $insertValues[$column->name] = db_quotevalue( $db, $data[$column->name], $column->type );
       }
}
$strValue = implode( ",", $insertValues );
$strFields = implode( "`,`", array_keys( $insertValues ) );
mysql_field_seek( $rs['rs'], 0 );
return "INSERT INTO `".$tableName."` ( `".$strFields."` ) VALUES ( ".$strValue." )";
 

最后一行带入到数据库,导致注入产生。

所以这个漏洞利用,只需要我们在注册的时候多POST一个member_id就可以注入。exp就不提供了

解决方案:

升级官网补丁https://bbs.shopex.cn/read.php?tid-303282.html

 

点击复制链接 与好友分享!回本站首页
上一篇:dede常见漏洞以及解决方法
下一篇:利用PostgreSQL的$q$逃逸语法提高数据库程序逃逸长文本性能
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站