漏洞概要
关注数(24 )
关注此漏洞
漏洞标题:
某市营运车辆综合性能检测联网联控信息管理系统Getshell
漏洞状态:
已交由第三方合作机构(cncert国家互联网应急中心)处理
>
漏洞详情 披露状态:
2016-01-13: 细节已通知厂商并且等待厂商处理中 2016-01-15: 厂商已经确认,细节仅向厂商公开 2016-01-25: 细节向核心白帽子及相关领域专家公开 2016-02-04: 细节向普通白帽子公开 2016-02-14: 细节向实习白帽子公开 2016-02-27: 细节向公众公开
简要描述: 泄露-审计源码-绕过后台-传shell
详细说明: 1、泄露
**.**.**.**/web.rar
下载下来后发现是个完整的web站点,但不是**.**.**.**/,于是我翻了下文件看能不能发现点什么,很快定位到一个文件/WEB/Frame/Login.aspx,看到底部有信息
google一把
好了,目标出现了
大连市营运车辆综合性能检测联网联控信息管理系统
http://**.**.**.**/checkweb/
2、审计源码 当我访问网址的时候,发现需要登录的,既然源码在手,那就审计下咯。 前端登录页面:/WEB/Frame/Login.aspx,表单里面没看到提交到后台的地址,那么一定写在js里面的
定位js文件,发现前台表单传递给了这个文件:/WEB/DAL/Frame/Login.ashx,并且还带了个参数Flag=Q
/WEB/DAL/Frame/Login.ashx部分代码审计:
public void ProcessRequest(HttpContext context) { string flag, str; try { flag = context.Request["Flag"].ToString(); } catch { flag = ""; } if (flag != "") { str = Execute(flag); context.Response.Write(str); } }
这里主要是获取Flag的值
/// <summary> /// 业务操作 /// </summary> /// <param name="flag">操作类型(I:新建;U:修改;D:删除;Q:查询;L:加载明细)</param> /// <returns></returns>
还记得刚刚前面除了传递表单内容外还传了Flag参数,值为Q,结合注释,即为查询操作,于是跟踪DataQuery函数
/// <summary> /// 数据查询 /// </summary> /// <returns></returns> private string DataQuery() { string strReturn = "登录失败:无效的用户信息!"; bool isOracle = ConfigurationManager.AppSettings["dbType"].Equals("Oracle"); Md5Helper md5 = new Md5Helper(); string yhdh = HttpContext.Current.Request.Form["yhdh"]; // 用户账号 string mm = md5.GetMD5String(HttpContext.Current.Request.Form["mm"]); // 用户密码,md5了一次 string sql = "SELECT U.YHDH,U.XM,U.ORGAN,U.ROLEID,R.SQLLIMITS,U.JYW,R.ROLENAME,R.LIMITS,R.DATALIMITS DATALIMITS,R.ISADMIN,R.ISSUPER,R.PARENTID,R.JYW RJYW, O.ORGANNAME, O.ORGANTYPE, O.AREA, O.POPEDOM FROM Y_SYS_USER U " + "INNER JOIN Y_SYS_ROLE R ON R.ROLEID=U.ROLEID AND R.ISLOCK='1' " + "INNER JOIN Y_SYS_ORGAN O ON O.ORGAN=U.ORGAN AND O.ISSTOPUSE='F' " + "left join Y_SYS_ROLE R3 on R.PARENTID =R3.ROLEID " + "LEFT JOIN Y_SYS_USER U3 ON U3.ROLEID =R3.ROLEID " + "WHERE U.ZT='1' AND U.ZHYXQ>sysdate AND U.YHDH='{0}' AND U.MM='{1}' AND (U3.ZT IS NULL OR U3.ZT='1')"; sql = string.Format(sql, yhdh, mm.ToUpper()); DataTable ds = db.ExecuteDataTable(CommandType.Text, sql); ... ...
这条sql语句犯了处理登录情况的典型错误,将用户名和密码直接同时拼接在查询语句中,程序员的逻辑是希望where语句的YHDH字段和MM字段同时校验成功的情况下,才能select出数据,而这恰恰造成了SQL注入。于是我就可以不用知道管理员的密码就能构造用户名绕过登录机制了
用户名我输入admin'-- 密码随意输入
这样原来的sql语句就变成了select xxx from xxx where U.YHDH='admin'--' AND U.MM='md5xxxx' --符号在oracle数据库中表示单行注释,所以此时的sql语句逻辑已经变成了只要数据库中存在admin名称的用户,就能select出信息了 就这样绕过了后台的登录验证。
3、传webshell 在后台找到文件管理,有个上传功能,试了下任意文件都可上传,免去了我审计劳动,getshell
http://**.**.**.**/checkweb/UploadFiles/Files/20160110013649test.aspx
密码:admin
看了下密码,感觉有点简单的,而且还有sa账户
夜深了,撸不动了 仅证明问题,未做任何破坏活动
漏洞证明: 修复方案: 1、全面修复sql注入问题,漏洞证明里面说的很详细了,不要拼接!不要拼接!不要拼接! 2、虽然是后台,但是上传文件后缀还是限制下 3、删除test.aspx马(/UploadFiles/Files/20160110013649test.aspx)
>
漏洞回应 厂商回应: 危害等级:高
漏洞Rank:10
确认时间:2016-01-15 15:36
厂商回复: CNVD确认未复现所述情况,已经转由CNCERT下发给辽宁分中心,由其后续协调网站管理单位处置.
最新状态: 暂无