74cms (20140709) 任意文件读取 & 注入漏洞

admin 2015年5月2日03:44:45评论390 views字数 213阅读0分42秒阅读模式
摘要

2014-07-18: 细节已通知厂商并且等待厂商处理中
2014-07-23: 厂商已经确认,细节仅向厂商公开
2014-07-26: 细节向第三方安全合作伙伴开放(绿盟科技、唐朝安全巡航、无声信息)
2014-09-16: 细节向核心白帽子及相关领域专家公开
2014-09-26: 细节向普通白帽子公开
2014-10-06: 细节向实习白帽子公开
2014-10-16: 细节向公众公开

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

缺陷编号: WooYun-2014-68941

漏洞标题: 74cms (20140709) 任意文件读取 & 注入漏洞 74cms (20140709) 任意文件读取 & 注入漏洞

相关厂商: 74cms.com

漏洞作者: ′雨。74cms (20140709) 任意文件读取 & 注入漏洞

提交时间: 2014-07-18 13:35

公开时间: 2014-10-16 13:36

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 无

4人收藏


漏洞详情

披露状态:

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

简要描述:

20140709.

详细说明:

20140709的74cms

在plus/weixin.php中 因为默认的这个文件都会checkSignature 来检测token

但是来看看74cms的 根本就不需要token。

code 区域
$wechatObj = new wechatCallbackapiTest($dbhost,$dbuser,$dbpass,$dbname);
if(isset($_REQUEST['echostr']))
$wechatObj->valid();
elseif(isset($_REQUEST['signature']))
{
$wechatObj->responseMsg();
}

来看看valid

code 区域
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature())
{
exit($echoStr);
}
}

check了。

code 区域
elseif(isset($_REQUEST['signature']))
{
$wechatObj->responseMsg();

可是在这里 如果设置了这个 就直接进入了。所以 完全没验证token。。。

code 区域
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

if (!empty($postStr))
{

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$keyword = iconv("utf-8","gb2312",$keyword);
$time = time();
$event = trim($postObj->Event);

if ($event === "subscribe")
{
$word= "回复j返回紧急招聘,回复n返回最新招聘!您可以尝试输入职位名称如“会计”,系统将会返回您要找的信息,我们努力打造最人性化的服务平台,谢谢关注。";
$text="<xml>
<ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
<FromUserName><![CDATA[".$toUsername."]]></FromUserName>
<CreateTime>".$time."</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[".$word."]]></Content>
</xml> ";
exit($text);
}

0x01 任意文件读取 (这个无视接口是否开启)

因为在解析xml的时候是在判断接口是否开启之前 所以就算没开启也能读取。

code 区域
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$keyword = iconv("utf-8","gb2312",$keyword);

在这里解析了传递过来的xml

code 区域
if ($event === "subscribe")
{
$word= "回复j返回紧急招聘,回复n返回最新招聘!您可以尝试输入职位名称如“会计”,系统将会返回您要找的信息,我们努力打造最人性化的服务平台,谢谢关注。";
$text="<xml>
<ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
<FromUserName><![CDATA[".$toUsername."]]></FromUserName>
<CreateTime>".$time."</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[".$word."]]></Content>
</xml> ";
exit($text);
}
if (!empty($keyword))
{

if($_CFG['sina_apiopen']=='0')
{
$word="网站微信接口已经关闭";
$text="<xml>
<ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
<FromUserName><![CDATA[".$toUsername."]]></FromUserName>
<CreateTime>".$time."</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[".$word."]]></Content>
</xml> ";
exit($text);

解析过后 这里exit($text); 退出的时候会把内容输出过来。 所以。

构造一个xml 就能读取任意文件了。

74cms (20140709) 任意文件读取 & 注入漏洞

_______________________________________________________________________________

上面那个任意文件读取不需要开启接口, 下面这个注入就需要开启接口了。

0x02 注入

code 区域
if($_CFG['sina_apiopen']=='0')
{
$word="网站微信接口已经关闭";
$text="<xml>
<ToUserName><![CDATA[".$fromUsername."]]></ToUserName>
<FromUserName><![CDATA[".$toUsername."]]></FromUserName>
<CreateTime>".$time."</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[".$word."]]></Content>
</xml> ";
exit($text);
}

$limit=" LIMIT 6";
$orderbysql=" ORDER BY refreshtime DESC";
if($keyword=="n")
{
$jobstable=table('jobs_search_rtime');
}
else if($keyword=="j")
{
$jobstable=table('jobs_search_rtime');
$wheresql=" where `emergency`=1 ";
}
else
{
$jobstable=table('jobs_search_key');
$wheresql.=" where likekey LIKE '%{$keyword}%' ";
}
$word='';
$list = $id = array();
$idresult = $this->query("SELECT id FROM {$jobstable} ".$wheresql.$orderbysql.$limit);
while($row = $this->fetch_array($idresult))

($_CFG['sina_apiopen']=='0' 在这里由于判断了接口是否开启 关闭了则退出

所以注入的话得开启才行,

在这里 $wheresql.=" where likekey LIKE '%{$keyword}%' ";

来看看$keyword哪里来的。

code 区域
$keyword = trim($postObj->Content);
$keyword = iconv("utf-8","gb2312",$keyword);

可以看到是解析后来的

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

$GLOBALS["HTTP_RAW_POST_DATA"]这个是不会被74cms的addslashes转义的

所以造成了注入。、

74cms (20140709) 任意文件读取 & 注入漏洞

漏洞证明:

74cms (20140709) 任意文件读取 & 注入漏洞

74cms (20140709) 任意文件读取 & 注入漏洞

修复方案:

首先 你这个检测函数根本都没用到。 所以造成了这些问题。

用一下检测函数, 然后 随机生成一下token 或者 判断一下是否初始化了token

如果未初始化就exit

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-07-23 11:22

厂商回复:

感谢反馈

最新状态:

暂无


漏洞评价:

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

漏洞评价(共0人评价):

登陆后才能进行评分


评价

  1. 2014-07-18 13:36 | Hero ( 普通白帽子 | Rank:162 漏洞数:53 | 药药切克闹,充气娃娃迷幻药)

    1

    你关注的白帽子 ′ 雨。 发表了漏洞 74cms (20140709) 任意文件读取 & 注入。

  2. 2014-07-18 14:20 | phith0n 74cms (20140709) 任意文件读取 & 注入漏洞 ( 普通白帽子 | Rank:834 漏洞数:127 | 一个想当文人的黑客~)

    0

    xml实体?我一直在想没时间

  3. 2014-07-18 15:02 | mramydnei ( 普通白帽子 | Rank:400 漏洞数:87 )

    0

    雨牛 74cms是不是好不了了?

  4. 2014-07-18 15:06 | ′ 雨。 74cms (20140709) 任意文件读取 & 注入漏洞 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)

    0

    @mramydnei 老师快来 继续下去。

  5. 2014-07-18 15:06 | ′ 雨。 74cms (20140709) 任意文件读取 & 注入漏洞 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)

    0

    @phith0n 嗯

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin