来源:自学PHP网 时间:2015-04-17 10:15 作者: 阅读:次
[导读] 这个漏洞已经公布了,在公司做的漏洞分析,随便就分享下这个文档。漏洞作者blue,漏洞请看:http://www.2cto.com/Article/201309/241275.html 部分代码zend加密,分析之前需要解密。idezender 8.1 破解...
这个漏洞已经公布了,在公司做的漏洞分析,随便就分享下这个文档。
部分代码zend加密,分析之前需要解密。
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就不提供了
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com