WooYun-2014-55026:Destoon Sql注入漏洞2(有条件)

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

来源:http://www.wooyun.org/bugs/wooyun-2014-055026

简要描述

过滤不严。

详细说明

上次是alipay 这次来个paypal的。 当然 tenpay也有这洞

paypal 和 tenpay的一起说了。

api\pay\paypal\notify.php中

require '../../../common.inc.php';

$_POST = $_DPOST;

if(!$_POST) exit('fail');

$bank = 'paypal';

$PAY = cache_read('pay.php');

if(!$PAY[$bank]['enable']) exit('fail');  //得开启这种支付方式。

if(!$PAY[$bank]['partnerid']) exit('fail');
$item_name = $_POST['item_name'];

$item_number = $_POST['item_number'];

$payment_status = $_POST['payment_status'];

$payment_amount = $_POST['mc_gross'];

$payment_currency = $_POST['mc_currency'];

$txn_id = $_POST['txn_id'];

$receiver_email = $_POST['receiver_email'];

$payer_email = $_POST['payer_email'];

$charge_status = 0;

$sql="SELECT * FROM {$DT_PRE}finance_charge WHERE itemid='$item_number' AND status=0";

$r = $db->get_one("SELECT * FROM {$DT_PRE}finance_charge WHERE itemid='$item_number' AND status=0");

paypal无过滤。 连验证都没验证。

直接注入

————————————————————————————————————————

tenpay

if($resHandler->isTenpaySign()) {

    //通知id

        $notify_id = $resHandler->getParameter("notify_id");

    //通过通知ID查询,确保通知来至财付通

    //创建查询请求

        $queryReq = new RequestHandler();

        $queryReq->init();

        $queryReq->setKey($key);

        $queryReq->setGateUrl("https://**.**.**.**/gateway/simpleverifynotifyid.xml");

        $queryReq->setParameter("partner", $partner);

        $queryReq->setParameter("notify_id", $notify_id);

    //通信对象

tenpay里面多了个验证 不过可以轻松通过。、

$transaction_id = $resHandler->getParameter("transaction_id");

    //金额,以分为单位

                $total_fee = $resHandler->getParameter("total_fee");

    //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee

                $discount = $resHandler->getParameter("discount");

                //------------------------------

                //处理业务开始

                //------------------------------

                //处理数据库逻辑

                //注意交易单不要重复处理

                //注意判断返回金额

                $total_fee = ($total_fee+$discount)/100;

                $r = $db->get_one("SELECT * FROM {$DT_PRE}finance_charge WHERE itemid='$out_trade_no'");

然后带入查询。

漏洞证明

看看所执行的语句。

修复方案

过滤。