2013-10-16: 细节已通知厂商并且等待厂商处理中 2013-10-16: 厂商已经确认,细节仅向厂商公开 2013-10-26: 细节向核心白帽子及相关领域专家公开 2013-11-05: 细节向普通白帽子公开 2013-11-15: 细节向实习白帽子公开 2013-11-30: 细节向公众公开
通常由于没有一个通用标准的防御规则保护好中间件配置信息、DNS信息、业务数据信息、用户信息、源码备份文件、版本管理工具信息、系统错误信息和敏感地址信息(后台或测试地址)的泄露,攻击者可能会通过收集这些保护不足的数据,利用这些信息对系统实施进一步的攻击。有时候,一个微不足道的信息泄露问题就能造成整个企业安全的崩盘。#安全需顾全整体#
#1 信息泄露源由于安卓网CDN服务器WEB中间件配置缺陷,以及开发人员代码上线后未严格测试,直接导致服务器脚本文件被客户端任意下载,从而造成整站源码泄露,被间接利用即可获取服务器系统权限,从而导致核心数据被窃!#2 信息泄露源http://121.207.242.90/config/db.cfg.phphttp://121.207.242.64/config/db.cfg.phphttp://121.207.242.58/config/db.cfg.phphttp://cdn.market.hiapk.com/login.phphttp://cdn.market.hiapk.com/config/db.cfg.php#3 可以直接通过浏览器下载任意源码login.php
<?phprequire('app.inc.php');if (!APP_IN_LOCAL && $_SERVER['HTTP_HOST'] == APP_DOMAIN){ header("{$_SERVER["SERVER_PROTOCOL"]} 403 access forbidden"); exit;}//初始化//v::set(CFG::VAR_UID, 1);unset($_SESSION['BOSS_UID']);v::run();?>
app.inc.php
<?php/** * 应用程序初始化 * * @package weip * @subpackage common * @author 魏永增 <catorwei@gmail.com> */ob_start();error_reporting(E_ALL);require(dirname(__FILE__) . '/config/application.cfg.php');// 初始化环境if (CFG::DISABLED) { exit('Sorry, the application is inactive.');}if (CFG::SESSION) { session_start();}if (isset($_REQUEST['re'])) { CFG::$response['engine'] = $_REQUEST['re'];} elseif (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && isset($_REQUEST['do'])) { if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { CFG::$response['engine'] = 'json'; }}// 初始化时区及本地设置date_default_timezone_set(CFG::TIMEZONE);setlocale(LC_ALL, CFG::LOCALE);// 自动识别语言包if (isset($_COOKIE[CFG::VAR_LANG])) { $lang = $_COOKIE[CFG::VAR_LANG];} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { list($lang) = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);}if (isset($lang)) { $langFile = PATH_LANGUAGE . strtolower($lang) . '.lang.php'; if (is_file($langFile)) { CFG::$response['language'] = $lang; }}// HTTP头信息处理header('Content-type: ' . CFG::$response['contentType'] . '; charset=' . CFG::$response['charset']);//if (CFG::$response['cached']) {// header('Expires: Mon, 1 Jan 2038 00:00:00 GMT');// header('Cache-Control: PUBLIC, max-age=2145888000, must-revalidate');//} else {// header('Expires: Mon, 29 Jun 1979 05:00:00 GMT');// header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');// header('Cache-Control: no-store, no-cache, must-revalidate');// header('Cache-Control: post-check=0, pre-check=0', false); // header('Pragma: no-cache');//}// 载入WEIP架构require(PATH_LIB . 'weip.inc.php');require(PATH_LIB . 'core/WEIP.class.php');/** * 自动类定义加载函数 * @param string $class 类名 */function __autoload($class) { if (isset(CFG::$classes[$class])) { require(CFG::$classes[$class]); } elseif (is_file($file = PATH_MODEL . $class . '.class.php')) { require($file); } elseif (is_file($file = PATH_DD . $class . '.class.php')) { require($file); } elseif (is_file($file = PATH_ORM_CI . $class . '.class.php')) { require($file); } elseif (is_file($file = PATH_ORM_MAPPING . $class . '.class.php')) { require($file); } elseif (isset(QueryTypeDef::$qtClasses[$class])){ require(QueryTypeDef::$qtClasses[$class]); } elseif (isset(QueryTypeDef::$EClasses[$class])){ require(QueryTypeDef::$EClasses[$class]); }}function sqlexe($sql){ $dsn = explode(";",CFG::$db[0]['params']['dsn']); $local = substr(strstr($dsn[0],"="),1).':'. substr(strstr($dsn[1], "="), 1); $conn = @mysql_connect($local, CFG::$db[0]['params']['user'], CFG::$db[0]['params']['password']); $dbname = substr(strstr($dsn[2],"="),1); @mysql_select_db($dbname, $conn); @mysql_query("set names utf8"); return @mysql_query($sql);}
#1 写一个脚本,利用正则分析出所有include、require包含的文件,即可下载整站源代码至本地,进行源代码白盒审计。由于系统mo=reportreportSetting下的do=SaveDbConfig函数未严格校验来自客户端的变量,导致可写入任意内容至 /config/*****.cfg.php 文件,从而获取到WebShell。
#2 通过泄露的相关配置信息和数据库配置文件 db.cfg.phpapplication.cfg.php
<?php// 各类路径定义(绝对路径)define('APP_ID', 0); // 应用程序IDdefine('PAGE_TIME', time()); // 当前页面载入时间define('PATH_CONFIG', dirname(__FILE__) . '/'); // 配置文件路径define('PATH_ROOT', dirname(PATH_CONFIG) . '/'); // 应用程序根路径define('PATH_LANGUAGE', PATH_CONFIG . '/lang/'); // 应用程序根路径define('PATH_MODEL', PATH_ROOT . 'models/'); // 模型文件路径define('PATH_ACTION', PATH_ROOT . 'actions/'); // 模型文件路径define('PATH_LIB', PATH_ROOT . 'lib/'); // 类库路径if (!defined('PATH_RESOURCE')) { define('PATH_RESOURCE', PATH_ROOT . 'resource/'); // 资源文件路径}define('PATH_TEMPLATES', PATH_RESOURCE . 'templates/'); // 模板文件路径define('PATH_DATA', PATH_ROOT . 'data/'); // 数据文件路径define('PATH_APPDATA', PATH_ROOT . 'appdata/'); // 程序日志缓存数据文件路径define('PATH_CACHE', PATH_APPDATA . 'cache/'); // 缓存文件保存路径define('PATH_UPLOAD', PATH_DATA . 'upload/'); // 用户上传文件保存路径define('PATH_TMP', PATH_APPDATA . 'tmp/'); // 临时文件保存路径define('APP_IN_LOCAL', preg_match('/^(127\.0\.0\.1|192\.168|10\.)/', $_SERVER['REMOTE_ADDR']));if (APP_IN_LOCAL) { define('PATH_LOG', PATH_APPDATA . 'log/'); // 日志文件保存路径} else { define('PATH_LOG', "/data/weblogs/market.hiapk.com/weblogs/"); // 日志文件保存路径}define('PATH_ORM_MAPPING', PATH_MODEL . 'orm/'); // ORM Mapping文件保存路径define('PATH_ORM_CI', PATH_MODEL . 'ci/'); // ORM Mapping文件保存路径define('PATH_DD', PATH_MODEL . 'dd/'); // 字典模型类保存位置if (APP_IN_LOCAL) { define('APP_DOMAIN', 'hiapk.local'); define('APP_URI', 'http://hiapk.local/'); define('BBS_URL', 'http://bbs.hiapk.com/'); //memcache define('APP_MEMCACHE_SERVER', '127.0.0.1'); define('APP_MEMCACHE_SERVER_2', '192.168.213.112'); define('APP_MEMCACHE_SERVER_3', '192.168.213.112'); define('APP_MEMCACHE_PREFIX', 'l3'); define('APP_MEMCACHE_PORT', '11214'); define('APP_MEMCACHE_PORT_2', '11213'); define('REFRESH_HTML_URL', 'http://admin.market.hiapk.test.nd/Handler/ApkToStaticHandler.ashx'); define('REFRESH_HTML_KEY', 'fb14f648-40dd-40f7-ae3e-3b44d813c64e'); //sphinx define('SPHINX_SERVER', '127.0.0.1'); define('SPHINX_PORT', 9312); define('SPHINX_SERVER_APK', '127.0.0.1'); define('SPHINX_PORT_APK', 9312); define('SPHINX_SERVER_FOR_SEARCHE', '127.0.0.1'); define('SPHINX_PORT_FOR_SEARCHE', 9312); //cdn define('CDN_APK_HOST', 'cdn.market.hiapk.com'); define('CDN_IMG_HOST', 'cdn.image.market.hiapk.com');} else { // 生产服务器 define('APP_DOMAIN', 'market.hiapk.com'); define('APP_URI', 'http://market.hiapk.com/'); define('BBS_URL', 'http://bbs.hiapk.com/'); //memcache define('APP_MEMCACHE_SERVER', '10.1.242.82'); define('APP_MEMCACHE_SERVER_2', '10.1.242.32'); define('APP_MEMCACHE_SERVER_3', '10.1.242.77'); define('APP_MEMCACHE_PREFIX', 's3'); define('APP_MEMCACHE_PORT', '11211'); define('APP_MEMCACHE_PORT_2', '11211'); define('REFRESH_HTML_URL', 'http://admin.sc.hiapk.com/Handler/ApkToStaticHandler.ashx'); define('REFRESH_HTML_KEY', 'fb14f648-40dd-40f7-ae3e-3b44d813c64e'); //sphinx define('SPHINX_SERVER', '10.1.242.12'); //10.1.242.66 define('SPHINX_PORT', 9312); define('SPHINX_SERVER_APK', '10.1.242.12'); //10.1.242.5 define('SPHINX_PORT_APK', 9312); define('SPHINX_SERVER_FOR_SEARCHE', '10.1.242.12'); //10.1.242.22 define('SPHINX_PORT_FOR_SEARCHE', 9312); //cdn define('CDN_APK_HOST', 'cdn.market.hiapk.com'); define('CDN_IMG_HOST', 'cdn.image.market.hiapk.com');}define('MARKET_KEY', '9c2a6t0o9r7w9e1i');define('MAX_INT', 0x7FFFFFFF);define( "WB_AKEY" , '3116842722' );define( "WB_SKEY" , '5034204bf026970daa82cfd1540a3d95' );define("HIAPK_WEIBO_ID", '2101284045');/** * 应用程序配置类 * @package weip * @subpackage configure * @author 魏永增(Cator Wei) <catorwei@gmail.com> * @version 1.0 */class CFG { const NAME = 'HiAPK Market'; // 系统名称 const VERSION = '1.0'; // 系统版本 const COMPANY = 'NetDragon'; // 公司名 const DEBUG = 3; // 调试开关/等级(0-2),会影响错误和异常的LOG信息量, 0:关闭BUG信息 1:只包含文本信息 2:包含程序堆栈 3:包含现场环境(只对错误有效) const SESSION = true; // 是否开启SESSION const TIMEZONE = 'Asia/Shanghai'; // 时区 const LOCALE = 'zh_CN'; // 本地化信息 const DISABLED = false; // 系统是否开放 const TIMEOUT = 3600; // 系统超时秒数 const SYS_LOG_ID = 0; // 系统错误/异常LOG配置项ID const ORM_DEBUG = 0; // 设置ORM的DEBUG模式 const ORM_CACHE = true; // 是否缓存ORM实体对象 const ORM_CACHE_ID = 0; // 用于缓存ORM实体对象的CACHE配置项ID const ORM_CACHE_PREFIX = 'orm/entity/'; // 用于缓存ORM实体对象的CACHE项键值前缀 const DOMAIN = APP_DOMAIN; // URI域名 const URI = APP_URI; // URI const URI_JS = 'resource/js/'; // URI for JS files const URI_CHARTS = 'resource/charts/'; // URI for CSS files const URI_CSS = 'resource/css/'; // URI for CSS files const URI_IMAGES = 'resource/images/'; // URI for image files const URI_TEMPLATES = 'resource/templates/'; // URI for template files const COOKIES_PATH = '/'; // The path on the server in which the cookie will be available on const COOKIES_DOMAIN = self::DOMAIN; // The domain that the cookie is available const COOKIES_EXPIRE = 3600; // Cookies有效期秒数 const VAR_LANG = 'BOSS_LANG'; // 保存语言语种的变量名称 const VAR_UID = 'BOSS_UID'; // 保存用户ID(User Id)的变量名称 const VAR_UIN = 'BOSS_UIN'; // 保存用户ID(User Id)的变量名称 const VAR_UNAME = 'BOSS_UNAME'; // 保存用户名称(User Name)的变量名称 const VAR_RID = 'BOSS_RID'; // 保存角色ID(Role Id)的变量名称 const VAR_RNAME = 'BOSS_RNAME'; // 保存角色名(Role Name)的变量名称 const VAR_LOGIN_TIME = 'BOSS_LOGIN_TIME'; // 保存用户登录时间的变量名称 const VAR_LIVE_TIME = 'BOSS_LIVE_TIME'; // 保存用户最后生存(最后一次与服务器的交互)时间的变量名称 static public $response = array( 'charset' => 'UTF-8', // 响应数据编码 'contentType' => 'text/html', // 响应数据格式 'title' => 'HiAPK', // 响应数据标题 'cached' => false, // 响应数据是否允许访问者本地缓存 (保留设置,暂无效果) 'engine' => 'extjs', // 响应数据引擎 (weip|json|xml|excel) 'language' => 'zh-cn', // 响应数据语言包 'autoOutput' => true, // 自动输出响应数据 'pageSize' => 20, // 分页的默认大小 ); static public $cache = array(// array( // Memcache Cache// 'engine' => 'memcache', // CACHE引擎 (file|memcache)// 'host' => '192.168.158.14', // Memcached服务器地址 // 'port' => 11211, // 端口 // 'timeout' => 10, // 超时时间(秒)// 'prefix' => 'weip', // 键名前缀 // 'persistent' => true, // 连接持续化 // ), array( // File Cache 'engine' => 'file', // Cache引擎 (file|memcache) 'root' => PATH_CACHE, // 文件Cache的根路径 ), 1=>array( // Memcache Cache 'engine' => 'memcache', // CACHE引擎 (file|memcache) 'host' => APP_MEMCACHE_SERVER, //缓存服务器 'port' => APP_MEMCACHE_PORT, // 端口 'timeout' => 3, // 超时时间(秒) 'prefix' => APP_MEMCACHE_PREFIX, // 键名前缀 'persistent' => true, // 连接持续化 ), 2=>array( // Memcache Cache 'engine' => 'memcache', // CACHE引擎 (file|memcache) 'host' => APP_MEMCACHE_SERVER_2, //缓存服务器 'port' => APP_MEMCACHE_PORT_2, // 端口 'timeout' => 3, // 超时时间(秒) 'prefix' => APP_MEMCACHE_PREFIX, // 键名前缀 'persistent' => true, // 连接持续化 ), ); static public $log = array( array( // File LOG 'engine' => 'file', // LOG引擎 (file|db|memcache) 'root' => PATH_LOG, // 文件Log的根路径 'mode' => 'serialize', // 数据存储模式 (json|serialize) ),// array( // Memcache LOG// 'engine' => 'memcache', // LOG引擎 (file|db|memcache)// 'host' => '192.168.158.14', // Memcached服务器地址 // 'port' => 11211, // 端口 // 'timeout' => 10, // 超时时间(秒) // 'key' => 'weip_log_index', // 当前指针的键名 // 'prefix' => 'weip_log', // 键名前缀// 'persistent' => true, // 连接持续化 // ),// array( // DB LOG// 'engine' => 'db', // LOG引擎 (file|db|memcache)// 'db' => 0, // 数据库配置索引,参见CFG::$db数组 // ), ); static public $acl = array( 'engine' => 'file', // ACL存储引擎类型 (db|file) 'db' => 0, // 如果engine=db,该值代表CFG::$db配置的索引值,否则将以文件的形式保存在PATH_DATA/acl/下 'table' => 'acl_item', // 如果engine=db,该值代表数据库中保存ACL配置项的数据库名 'value' => 0, // ACL的值, 等于0表示不允许访问, 负数代表ACL配置有错, 正数表示允许访问, 不同的数值分别代表可以访问的级别 ); static public $db = array(); // 数据库配置 static public $classes = array(); // 系统类列表,用于__autoload static public $plugins = array( // 框架插件配置项 'firephp' => array( 'enabled' => false, ),// 'smarty' => array( // Smarty插件配置// 'template_dir' => PATH_TEMPLATES,// 'compile_dir' => PATH_CACHE . 'smarty/',// 'left_delimiter' => '<?#',// 'right_delimiter' => '? >',// ), ); static public $others = array(); // 系统类列表,用于__autoload}require('db.cfg.php'); // 数据库配置require('autoload.cfg.php'); // 系统类列表require('extjs.cfg.php'); // ExtJS框架配置
db.cfg.php
<?php/** * 配置文件--数据库配置文件 * @package weip * @subpackage configure * @author 魏永增 <catorwei@gmail.com> * @version 1.0 */if (APP_IN_LOCAL) { CFG::$db[0] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=192.168.9.67;port=3306;dbname=hiapk_market_debug', 'user' => 'hi_market', 'password' => 'abc!@#$%^&*()', ), 'options' => array( 'tablePrefix' => '', // 表前缀 PDO::ATTR_PERSISTENT => TRUE, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), ); CFG::$db['cmdb'] = &CFG::$db[0]; CFG::$db['hiapk_x2_uc'] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=192.168.213.112;port=3380;dbname=bbs_android', 'user' => 'root', 'password' => 'mysql', ), 'options' => array( 'tablePrefix' => 'pre_', // 表前缀 PDO::ATTR_PERSISTENT => false, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), ); CFG::$db['hiapk_x2'] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=192.168.213.112;port=3380;dbname=bbs_android', 'user' => 'root', 'password' => 'mysql', ), 'options' => array( 'tablePrefix' => 'pre_', // 表前缀 PDO::ATTR_PERSISTENT => false, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), ); CFG::$db['search'] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=192.168.9.67;port=3306;dbname=hiapk_market_debug', 'user' => 'hi_market', 'password' => 'abc!@#$%^&*()', ), 'options' => array( 'tablePrefix' => '', // 表前缀 PDO::ATTR_PERSISTENT => TRUE, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), ); CFG::$db['swb'] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=192.168.9.67;port=3306;dbname=hiapk_market_weibo', 'user' => 'hi_market', 'password' => 'abc!@#$%^&*()', ), 'options' => array( 'tablePrefix' => '', // 表前缀 PDO::ATTR_PERSISTENT => TRUE, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), );} else { CFG::$db[0] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=10.1.242.26;port=3306;dbname=hiapk_market_new', 'user' => 'hiapk_market', 'password' => 'sRU4vyHYLsMVDrQF', ), 'options' => array( 'tablePrefix' => '', // 表前缀 PDO::ATTR_PERSISTENT => false, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), ); CFG::$db['cmdb'] = &CFG::$db[0]; CFG::$db['hiapk_x2_uc'] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=10.1.242.111;port=3306;dbname=hiapk_x2_uc', 'user' => 'him_web', 'password' => '3pDEdfvQCDHMbfrF', ), 'options' => array( 'tablePrefix' => 'pre_', // 表前缀 PDO::ATTR_PERSISTENT => false, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), ); CFG::$db['hiapk_x2'] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=10.1.242.111;port=3306;;dbname=hiapk_x2', 'user' => 'him_web', 'password' => '3pDEdfvQCDHMbfrF', ), 'options' => array( 'tablePrefix' => 'pre_', // 表前缀 PDO::ATTR_PERSISTENT => false, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), ); CFG::$db['search'] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=10.1.242.47;port=3306;dbname=hiapk_market_new', 'user' => 'hiapk_market', 'password' => 'sRU4vyHYLsMVDrQF', ), 'options' => array( 'tablePrefix' => '', // 表前缀 PDO::ATTR_PERSISTENT => false, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), ); CFG::$db['swb'] = array( // Database (PDO) 'params' => array( 'driver' => 'pdo', 'dsn' => 'mysql:host=10.1.242.26;port=3306;dbname=hiapk_market_weibo', 'user' => 'himarket_web', 'password' => 'm5sstDX8s7BHP7RD', ), 'options' => array( 'tablePrefix' => '', // 表前缀 PDO::ATTR_PERSISTENT => false, // 是否持续化连接 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', // 设置字符集 ), ); }
#3 成功访问到用户敏感信息
更多内容就不披露了,希望各大厂商都能认真的重视此类问题!
#1 对每个漏洞完整的修复#2 找专业安全人员代码审计#3 可以找乌云众测平台的白帽子们帮你们消灭掉存在的边界隐患
危害等级:高
漏洞Rank:20
确认时间:2013-10-16 17:39
感谢 猪猪侠 提供的漏洞,已安排修复处理
暂无