当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-055928

漏洞标题:淘宝某站源码泄露及SQL注入分析

相关厂商:淘宝网

漏洞作者: Mr .LZH

提交时间:2014-04-08 16:48

修复时间:2014-05-23 16:49

公开时间:2014-05-23 16:49

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-04-08: 细节已通知厂商并且等待厂商处理中
2014-04-09: 厂商已经确认,细节仅向厂商公开
2014-04-19: 细节向核心白帽子及相关领域专家公开
2014-04-29: 细节向普通白帽子公开
2014-05-09: 细节向实习白帽子公开
2014-05-23: 细节向公众公开

简要描述:

拿下淘宝某站源码,分析sql注入漏洞及绕过

详细说明:

svn导致源码泄露:http://ip.taobao.com/.svn/entries
拿下源码

QQ截图20140408143313.png


接下来分析源码:
1.敏感信息泄露,数据库信息:

QQ截图20140408143313.png


2.sql注入分析
getFeedbackRecord.php源码:

<?php
require_once("./common.php");
require_once('../runtime_start.php');
if (!is_user_login()) {
response_data(FAILED, 'user not login');
exit(1);
}
$page = 1;
$rows = 1;
if (!isset($_REQUEST['page'])) {
response_data(FAILED, 'no page param.');
exit(1);
} else {
$page = $_REQUEST['page'];
}
if (!isset($_REQUEST['rows'])) {
response_data(FAILED, 'no rows param.');
exit(1);
} else {
$rows = $_REQUEST['rows'];
}
$wangwang_id = $_COOKIE['wangwang_id'];
$start = $rows * ($page-1);
$len = $rows;
$con = init_db();
if (!$con) {
response_data(FAILED, 'database error');
echo "conn error\n";
exit(1);
}
$query_sql = "SELECT SQL_CALC_FOUND_ROWS ip, country, region, city, county, isp, feedback_type, feedback_date FROM user_feedback_item WHERE wangwang_id='".addslashes($wangwang_id). "' order by id desc LIMIT ".intval($start).", ".intval($len);
$res = mysql_query($query_sql, $con);
if ($res) {
$rows = array();
while($temp = mysql_fetch_array($res, MYSQL_ASSOC)) {
$rows[] = $temp;
}
$item_num = 0;
$ttl_sql = "SELECT FOUND_ROWS() as item_num ";
$ttl_rlt = mysql_query($ttl_sql, $con);
if($ttl_rlt && $ttl_row = mysql_fetch_array($ttl_rlt, MYSQL_ASSOC)) {
$item_num = $ttl_row['item_num'];
mysql_free_result($ttl_rlt);
}
$items = array();
$items['total'] = ceil($item_num/$len);
$items['rows'] = $rows;
$items['records'] = $item_num;
$items['page'] = $page;
response_data(SUCCESS, $items);
mysql_free_result($res);
} else {
response_data(FAILED, 'database error');
}
mysql_close($con);
?>


可知只要登录账户,提交page,rows参数,控制$_COOKIE['wangwang_id'],可构造$query_sql 语句执行。其中:

$query_sql = "SELECT SQL_CALC_FOUND_ROWS ip, country, region, city, county, isp, feedback_type, feedback_date FROM user_feedback_item WHERE wangwang_id='".addslashes($wangwang_id). "' order by id desc LIMIT ".intval($start).", ".intval($len);


$wangwang_id经过addslashes处理,但仍让可以通过双字符绕过,形成注入。page,rows参数最终经过取整,无法利用,于是抓包构造cookies。

QQ截图20140408143313.png


额。。。修改了wangwang_id导致is_user_login()判断用户未登录。伤心
于是查看文件function.inc.php

//判断用户是否登陆
function is_user_login() {
return !empty($_COOKIE['_t'])
&& !empty($_COOKIE['wangwang_id'])
&& get_passport_token($_COOKIE['wangwang_id']) == $_COOKIE['_t'];
}


额...如此坑爹的程序员,判断是否登录都能这么屌,完全是$_COOKIE['_t'])和$_COOKIE['wangwang_id']两个用户能自己构造的参数来判断,两个参数还不是HttpOnly
不过我目的不是绕过登录任意用户,俺要的是注入时绕过is_user_login(),于是再看看get_passport_token():

define(ALIBENCH_ENCRYPT_KEY, 'XXX专业打码30年');
//获取登陆密钥
function get_passport_token($uid)
{
return substr(md5($uid . ALIBENCH_ENCRYPT_KEY), 0, 12);
}


这样一来只要构造$_COOKIE['wangwang_id']为注入语句,并且通过上面的算法构造$_COOKIE['_t']就能无视注入时is_user_login()判断用户是否登录的限制了。
功夫不负有心人,懒得自己写脚本去构造注入了,于是乎。。。。你们自己搞定

漏洞证明:

修复方案:

阿里最近在招实习,求机会,拜谢

版权声明:转载请注明来源 Mr .LZH@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2014-04-09 11:45

厂商回复:

感谢您对我们的支持与关注,该问题我们正在修复。谢谢!

最新状态:

暂无