这个漏洞已经公布了,在公司做的漏洞分析,随便就分享下这个文档。
漏洞作者blue
漏洞利用请看:http://www.cnseay.com/3339/
部分代码zend加密,分析之前需要解密。
黑刀下载地址:
http://pan.baidu.com/share/link?shareid=126998888&uk=4045637737
漏洞在注册的地方,于文件\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就不提供了
带一个我们Safekey团队的一个图,大家可以意淫下其他地方,像大C说的一样,注入就不少了,大C之前死磕了shopex一段时间,phpbug就死磕phpcms v9。
解决方案:升级官网补丁http://bbs.shopex.cn/read.php?tid-303282.html