当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0123387

漏洞标题:青果教务系统无条件SQL注射

相关厂商:湖南青果软件有限公司

漏洞作者: RedFree

提交时间:2015-06-30 10:22

修复时间:2015-10-03 10:24

公开时间:2015-10-03 10:24

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-06-30: 细节已通知厂商并且等待厂商处理中
2015-07-05: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-08-29: 细节向核心白帽子及相关领域专家公开
2015-09-08: 细节向普通白帽子公开
2015-09-18: 细节向实习白帽子公开
2015-10-03: 细节向公众公开

简要描述:

青果教务系统的SQL注入漏洞,无需任何条件!真正的教务杀手,获取教师、管理用户密码,查看妹子信息不是梦!你想改成绩吗?答:你想多了,不作死就不会死。

详细说明:

青果教务系统有一个WebService接口,默认路径:/webs/sysdata.asmx。
通过对这个服务页面数个接口的审计,发现其中某接口存在SQL注入。
/webs/sysdata.asmx提供的几个接口如下:

1.jpg


一、获得schoolcode
首先我对GetMenuInfo这个接口比较感兴趣。原因很简单,在几个接口中,它要求的参数是最少的,这就方便了后面的分析。

2.jpg


那么UserType、param这两个参数究竟是什么呢?

3.jpg


从反编译的代码中可以看到,param这个参数是输入的UserType和schoolcode拼接成一个新字串的Md5经过

str.Substring(0, 3) + str.Substring(4, 8) + str.Substring(13, str.Length - 13);

这样新的拼接得来的。
那么schoolcode又是什么呢?经过跟踪得到schoolcode是从配置文件中获取的。后来经过分析得知,这个从配置文件中获取的schoolcode其实就是该院校的院校代码!(配置文件路径默认为/_data/WebSysConfig.config)

4.jpg


经过百度得知大部分高校的院校代码:http://wenku.baidu.com/link?url=vwXFaqL70D8IDjayMLVo2SnddQyoRNIy2c0odLaGem8gxXKy2xS3BtglpW6srWueZnppjbrrcl_o3yUCjiCyQbOu1Y-EhzKFATNZLYn-GO3

5.jpg


这样一来就好办了,大部分高校的院校代码都是已知的,当然不知道代码的,我写了个暴破的py脚本尝试(10000-15000)之间的院校代码。其原理是这样的,固定UserType为ADM000,当md5(ADM000+院校代码)经过

str.Substring(0, 3) + str.Substring(4, 8) + str.Substring(13, str.Length - 13);

这样的处理后正确时,返回的数据包中便会含有关键字A0101。(暴破schoolcode用的python代码附在后面的测试代码中)

6.jpg


test.jpg


输入参数可自由控制,本来很开心,以为可以这个注入点跑数据的,可实际情况却是让人悲伤的。细心的看官看了上面的图片后可能已经看到了:

if (UserType.Length > 6)
{
UserType = UserType.Substring(0, 6);
}
string strsql = "select distinct menucode,menuname,isnull(linkfile,'') as linkfile from TW_SysMenuInfo ,( select a.menucode as menuid from TW_SysMenuInfo a,TW_SysGroupRight b where b.groupcode='" + UserType + "' and CHARINDEX(a.menucode+';',isnull(convert(varchar(2400),b.OptMenu),''))>0 ) as c where isnull(state,'')='1' and (menucode=menuid or menucode=left(menuid,3) or menucode=left(menuid,5)) Order By menucode ";
return base2.GetDs(strsql);


UserType虽是可控的,然而当UserType长度大于6时,后面的部分便被删除掉了。所以实际上这个注入点就变成不可用的了(当然用来跑schoolcode还是非常有用的)。
二、另一个粗暴的注入点
既然上面那个接口无路可走了,那就换个接口再看呗。接下来我将注意力放到了getLessonSchedule这个接口上。原因嘛,很简单:既然程序员很会“过滤”,那就来个参数多的,说不定有没有过滤的参数呢。
不多说看图,3个参数长度被限制,而另几个并没有限制参数长度!经过查看后面的代码可知userId这个参数带入了查询且未限制长度!尝试构造下查询参数试试呗(一些基本的判断略)

9.jpg


10.jpg


到这里已经成功利用了这个注入点!
三、sqlmap大法
为了可以方便快速地获取数据,我写了一个专用的tamper脚本(代码附在下面的测试代码中),用来跑数据。测试截图:(测试参数:

-r C:/Kingo.txt --tamper kingobypass.py --technique=U --dbms=mssqlserver --union-cols="4" --prefix="'" --suffix=";--</userId>|n|      <optPassWord xsi:type=\"xsd:string\">test</optPassWord>|n|      <param xsi:type=\"xsd:string\">KingoAutoInjection</param>"


新疆大学(学校代码:10755)

11.jpg


12.jpg


中原工学院(学校代码:10465)

13.jpg


14.jpg


厦门软件职业技术学院(学校代码:14059)

15.jpg


16.jpg


如需要更多测试成功案例,可联系我


漏洞证明:

新疆大学(学校代码:10755)

11.jpg


12.jpg


中原工学院(学校代码:10465)

13.jpg


14.jpg


厦门软件职业技术学院(学校代码:14059)

15.jpg


16.jpg

修复方案:

所有参数过滤,删除多余接口

版权声明:转载请注明来源 RedFree@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-10-03 10:24

厂商回复:

漏洞Rank:15 (WooYun评价)

最新状态:

暂无