乌云(WooYun.org)历史漏洞查询---http://wy.zone.ci/
乌云 Drops 文章在线浏览--------http://drop.zone.ci/
2013-09-28: 细节已通知厂商并且等待厂商处理中 2013-09-28: 厂商已经确认,细节仅向厂商公开 2013-10-08: 细节向核心白帽子及相关领域专家公开 2013-10-18: 细节向普通白帽子公开 2013-10-28: 细节向实习白帽子公开 2013-11-12: 细节向公众公开
cmseay存储型xss 下载的版本为CmsEasy_5.5_UTF-8_20130910
bbs/add-archive.php
<?php require_once 'bbs_public.php'; //验证用户登陆相关操作,所以测试前需要注册一个用户 $admin = new action_admin(); $admin->check_login(); //验证用户登录......省略........ if(isset($_POST['submit'])){ if(strtolower(trim($_POST['verify'])) != strtolower($_SESSION['verify'])){ //确认验证码 action_public::turnPage('index.php','验证码输入错误!'); } $archive = db_bbs_archive::getInstance(); unset($_POST['submit']); unset($_POST['verify']); $_POST['username'] = $_COOKIE['login_username']; //验证用户登录 $_POST['userid'] = $admin->userid; $_POST['ip'] = $_SERVER['REMOTE_ADDR']; $_POST['addtime'] = mktime(); if($id = $archive->inserData($_POST)){ //问题在这里,title没有未过滤 action_public::turnPage('archive-display.php?aid='.$id,'文章添加成功'); }else{ action_public::turnPage('index.php','添加失败,请联系我们!'); } }
跟进路径inserData()->insert()->getInsertString()函数
public function inserData($data){ $r = $this->odb->insert($this->tblName,$data); // if($r) return $this->odb->getInsertId(); else return false; }跟进insertpublic function insert($table, $data) { $sql = $this->getInsertString($table, $data); return $this->execSql($sql);}跟进getInsertStringpublic function getInsertString($table, $data) { $n_str = ''; $v_str = ''; $table = $this->filterString($table); foreach ($data as $k => $v) { $n_str .= $this->filterString($k).','; //此处进行过滤 $v_str .= "'".$this->filterString($v)."',"; } $n_str = preg_replace( "/,$/", "", $n_str ); $v_str = preg_replace( "/,$/", "", $v_str ); $str = 'INSERT INTO '.$table.' ('.$n_str.') VALUES('.$v_str.')'; return $str; }
分析filterString()函数
public function filterString($str) { if ($this->magic_quotes) { $str = stripslashes($str); } if ( is_numeric($str) ) { return $str; } else { $ret = @mysqli_real_escape_string($this->con, $str); if ( strlen($str) && !isset($ret) ) { $r = $this->checkConnection(); if ($r !== true) { $this->closeDB(); $ret = $str; } } return $ret; }
应用mysqli_real_escape_string过滤'"进行了过滤,不完整发表文章查看数据:
分析再看一下bbs/index.php输出
<?php foreach ($category_data as $v) { $archive_arr = $archive->getDataLimit('aid,cid,lid,title,username,replynum,click,addtime',"cid='{$v['cid']}' AND isstop='0' order by aid desc limit 10 ");?>跟进getDataLimitpublic function getDataLimit($field = '*',$where = '1'){ $sql = "SELECT {$field} FROM {$this->tblName} WHERE {$where}";//构成sql语句 $data = $this->odb->getRows($sql);//跟进瞧了一眼没有过滤 return $data;//输出数据 }
对title输入进行过滤;
危害等级:高
漏洞Rank:10
确认时间:2013-09-28 15:43
感谢,尽快修复
暂无