### 简要描述:
phpems多处水平权限漏洞可进行订单操作
### 详细说明:
3.网站多处存在平行权限漏洞
存在漏洞的代码位置在/app/user/center.php的payfor()函数中
public function payfor()
{
$subaction = $this->ev->url(3);
$orderstatus = array(1=>'待付款',2=>'已完成',99=>'已撤单');
$this->tpl->assign('orderstatus',$orderstatus);
switch($subaction)
{
case 'remove':
$oid = $this->ev->get('ordersn');
$order = $this->order->getOrderById($oid);
if($order['orderstatus'] == 1)
{
$this->order->delOrder($oid);
$message = array(
'statusCode' => 200,
"message" => "订单删除成功",
"callbackType" => 'forward',
"forwardUrl" => "reload"
);
}
else
$message = array(
'statusCode' => 300,
"message" => "订单操作失败"
);
exit(json_encode($message));
break;
case 'orderdetail':
$oid = $this->ev->get('ordersn');
if(!$oid)exit(header("location:index.php?user-center"));
$order = $this->order->getOrderById($oid);
$alipay = $this->G->make('alipay');
$payforurl = $alipay->outPayForUrl($order,WP.'index.php?route=user-api-alipaynotify',WP.'index.php?route=user-api-alipayreturn');
$this->tpl->assign('payforurl',$payforurl);
$this->tpl->assign('order',$order);
$this->tpl->display('payfor_detail');
break;
default:
if($this->ev->get('payforit'))
{
$money = intval($this->ev->get('money'));
if($money < 1)
{
$message = array(
'statusCode' => 300,
"message" => "最少需要充值1元"
);
exit(json_encode($message));
}
$args = array();
$args['orderprice'] = $money;
$args['ordertitle'] = "考试系统充值 {$args['orderprice']} 元";
$args['ordersn'] = date('YmdHi').rand(100,999);
$args['orderstatus'] = 1;
$args['orderuserid'] = $this->_user['sessionuserid'];
$args['ordercreatetime'] = TIME;
$args['orderuserinfo'] = array('username' => $this->_user['sessionusername']);
$this->order->addOrder($args);
$message = array(
'statusCode' => 200,
"message" => "订单创建成功",
"callbackType" => 'forward',
"forwardUrl" => "index.php?user-center-payfor-orderdetail&ordersn=".$args['ordersn']
);
exit(json_encode($message));
}
else
{
$page = $this->ev->get('page');
$args = array();
$args = "orderuserid = '".$this->_user['sessionuserid']."'";
$myorders = $this->order->getOrderList($args,$page);
$this->tpl->assign('orders',$myorders);
$this->tpl->display('payfor');
}
}
}
该函数switch中的前两个条件一个是用于删除订单,一个用于查看订单细节,进入具体代码
case 'remove':
$oid = $this->ev->get('ordersn');
$order = $this->order->getOrderById($oid);//这里的提交oid可以由URL参数ordersn指定
if($order['orderstatus'] == 1)
{
$this->order->delOrder($oid);
$message = array(
'statusCode' => 200,
"message" => "订单删除成功",
"callbackType" => 'forward',
"forwardUrl" => "reload"
);
}
else
$message = array(
'statusCode' => 300,
"message" => "订单操作失败"
);
exit(json_encode($message));
break;
case 'orderdetail':
$oid = $this->ev->get('ordersn');
if(!$oid)exit(header("location:index.php?user-center"));
$order = $this->order->getOrderById($oid);//这里的oid也可以由URL参数ordersn指定
$alipay = $this->G->make('alipay');
$payforurl = $alipay->outPayForUrl($order,WP.'index.php?route=user-api-alipaynotify',WP.'index.php?route=user-api-alipayreturn');
$this->tpl->assign('payforurl',$payforurl);
$this->tpl->assign('order',$order);
$this->tpl->display('payfor_detail');
break;
无论是删除订单还是查看订单细节他们的条件变量都是用户可控的,就是说可以在URL参数中人为指定,因而导致了平行权限的问题,直接结果就是可以遍历用户订单和删除任意用户订单。
验证:
注册两个用户,test和test1 test有一封订单,test1没有
[<img src="https://images.seebug.org/upload/201503/12183106c755f37b264b4ae9912f1eeeb8cded76.png" alt="111.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/12183106c755f37b264b4ae9912f1eeeb8cded76.png)
但现在以test1用户访问链接
[<img src="https://images.seebug.org/upload/201503/12183118fc553640ac2954b8d7255bccf7c9c9ef.png" alt="222.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/12183118fc553640ac2954b8d7255bccf7c9c9ef.png)
可以看到test1用户看到了test用户的订单,OVER!
### 漏洞证明:
注册两个用户,test和test1 test有一封订单,test1没有
[<img src="https://images.seebug.org/upload/201503/12183106c755f37b264b4ae9912f1eeeb8cded76.png" alt="111.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/12183106c755f37b264b4ae9912f1eeeb8cded76.png)
但现在以test1用户访问链接
[<img src="https://images.seebug.org/upload/201503/12183118fc553640ac2954b8d7255bccf7c9c9ef.png" alt="222.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/12183118fc553640ac2954b8d7255bccf7c9c9ef.png)
可以看到test1用户看到了test用户的订单,OVER!
暂无评论