漏洞简介
安科瑞智能环保云平台是一款用于环境监测和管理的云平台。该漏洞存在于/MainMonitor/GetEnterpriseInfoMapByDate/GetDates接口中,攻击者可以通过构造恶意的SQL语句注入到接口参数中,进而获取数据库信息或对数据库进行未授权操作,可能导致敏感信息泄露或数据篡改。
影响版本
fofa语法
body="myCss/phone.css" || body="/signInIcon/iconfont.css" || (body="环保用电监管云平台" && body="Acrel") || body="var ecloginname = $(\"#LoginName\").val();" || title="安科瑞环保用电"
漏洞分析
先看下Global.asax的代码引用
<%@ Application Codebehind="Global.asax.cs" Inherits="JuCheap.Web.MvcApplication" Language="C#" %>
在bin目录下找到JuCheap.Web.dll文件,反编译后找到MvcApplication相关实现


一个常规的ASP.NET`` MVC框架的架构,针对MVC架构,先看路由设置方式,打开RouteConfig看下路由定义

访问模式为{controller}/{action}/{id}
根据漏洞通告,本次漏洞的路径为/MainMonitor/GetEnterpriseInfoMapByDate/GetDates 那么就可以先在controller下找到MainMonitorController,然后在其中找到GetEnterpriseInfoMapByDate的实现方式

可以看到在方法顶部有IgnoreRightFilter Attribute(特性),它的作用是告诉权限系统:“忽略权限检查”,因此这个接口是可以未授权访问。
我们跟进Service层的GetEnterpriseInfoMapByDate方法看下,对传入的参数是如何处理的

右键在此方法上选择 转到-派生符号 或者 CTRL+F12 进入

到这里就可以看到造成SQL注入漏洞原因:参数userid、tradename被直接拼接进了SQL语句中执行,但是userid在action处的定义为this.User.Identity.GetLoginUserId();获取不受用户可控,我们可控的只有tradename参数
if (string.op_Inequality(tradename, "") && tradename != null)
SQL = tradename.Contains("机关单位") || tradename.Contains("学校") ? SQL + " and t.tradename like '%机关单位%' or t.tradename like '%学校%' " : (tradename.Contains("一般") || tradename.Contains("普通") ? SQL + " and t.tradename like '%普通%' " : $"{SQL} and t.tradename like '%{tradename}%' ");
这段嵌套的三元运算符(条件 ? 结果A : 结果B)代码的整体逻辑流程如下:
- 前置检查:首先确认
tradename有效(非空且非 null)。 - 特定逻辑 A:如果
tradename是“机关单位”或“学校”,SQL 语句追加针对这两个词的OR查询。 - 特定逻辑 B:否则,如果
tradename是“一般”或“普通”,SQL 语句强制追加针对“普通”的查询。 - 默认逻辑:否则,直接使用
tradename的值进行模糊匹配(LIKE %value%)。
那我们只需要传参时使其不等于“机关单位”或“学校”、“一般”或“普通”这些即可进入like语句的模糊匹配逻辑进行SQL注入测试。
漏洞复现
POST /MainMonitor/GetEnterpriseInfoMapByDate/GetDates HTTP/1.1
Host: acreldny.mrxn.net
Content-Type: application/x-www-form-urlencoded
userid=admin&state=1&time=2025-02-02&tradename=SQLI_POC

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




