入侵陕西省考试管理系统
同学说如果成绩出来,可以上陕西省考试管理中心的网站查分。于是,我按着准考证上的广告,来到了陕西省考试管理中心的网站:www.sneac.com.
首先大致浏览一下网站,觉得页面还算顺眼(图1),不像多数教育类网站,不但界面简单,安全性也不高,而是由专门的人制作和维护的,但是这样的网站有没有漏洞呢?
图1
于是我开始了高三第二学期以来第一次的漏洞检测。
从网站栏目可以看出,管理中心的管辖范围包括了中考、高考、成人自考、英语等级、计算机等级等考试,提供这些考试的查分和咨询功能。网站整体是一个asp写的CMS系统,每个链接由asp文件根据ID传递到相应的静态页面。截取了传递的asp文件地址,加上“’”,没有发现注入漏洞。这时我还以为注入这样的低级漏洞不会在这里出现,但是不幸的是接下来我发现一个独立的栏目:“06高考网上咨询会”,它实际是一个留言本程序改写来的,存在注入漏洞。根据/zxh06/的地址,我尝试了/zxh05/这个地址,果然进入了去年的废弃的咨询会,一样的程序,一样的漏洞。借助nbsi我发现两个留言本用了两个不同的sql帐户,但权限同样都是DBowner.看来管理员还是具有一定的安全意识的。
不能跨库,于是我把服务器c、d、e盘翻了个遍,却死都找不到网页目录,看来数据库服务器和网页服务器是分离的@_@.尝试执行了几个sql提权指令,却都没有成功,看来数据库服务器已经打上了补丁,只好暂时放弃。已经有点晚了,第二天还要上英语,我只有先去睡觉。
图2
第二天晚上,继续开始前一天的工作。继续浏览网站,发现了亲爱的动网论坛(图2),版本是Dvbbs 7.1.0 sp1,就是带博客的那个版本,这说明如果运气好至少有两个漏洞(savepost.asp和博客注入)可以利用。但是我不赞成利用savepost.asp漏洞,这样更改后的管理员密码无法恢复,除非是想搞破坏,否则很容易被发现。于是我决定从博客的注入漏洞入手。运行下面这段文本perl脚本,就可以得到相应ID的用户密码MD5。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
察看了论坛的管理组发现管理员的ID为persian,于是账户填上persian运行,脚本提示这个论坛存在博客注入漏洞,并开始猜解密码,我出去看世界杯了。回来的时候,已经跑出了密码为******,奇怪,怎么会有这么短的MD5密码?仔细一看,原来是这个脚本的问题,只猜出了密码的其中几位,这是怎么回事?再试一次,有一位和刚才不同。看来这个脚本并不能一次猜出所有位的密码,只有采用最原始的办法,把猜出的部分写下来,然后不断重复执行,幸好有世界杯,才没有觉得很浪费时间。猜到大概二十多次,完整的密码MD5值终于呈现了出来(实际中发现第8位最难猜,最后的十几次猜测都只是为了猜出第8位)。
接下来到www.md5.org.cn 填上得到的md5值,一瞬间就得到了管理员的密码:qazwsx,相比于刚才注入数据库得到的留言本管理员密码(超级变态),这真是一个随意的密码。用管理员的帐号隐身登陆成功,再进入后台时,竟然失败了,看来管理员还是具有一定经验的,她把前后台密码分开了。这下只得用最后的办法:利用savepost.asp漏洞了。
先注册一个帐户,然后选择一个没人注意的板块,写了几句无关痛痒的话,然后选择论坛交易币设置,在可购买名单限制里填上“coolidea|||123’.0);insert/**/into/**/Dv_admin(Password,Username,Adduser.Flag)/**/value(‘469e80d32c0559f8’.’persian’,’1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36’),--”,点发表帖子,再用密码admin888登陆后台,发现居然还是失败。于是再试”coolidea|||123’,0)’update/**/Dv_User/**/set/**/UserPassword=’469 e80d32c0559f8’/**/where[UserName]=’persian’;--”,提交后发现管理员前台密码成功修改为admin888,为什么前台可以修改后台就不行了呢?联想到论坛的upfile目录被禁用,推测出这个论坛应该刚被黑过不久,管理员修改了后台密码字段名。
这下子论坛是没希望了,只得恋恋不舍地关了浏览器去上课。
已经是第三天晚上了,现在基本已经查明sneac.com是由三台web服务器和一台sql2000数据库组成的,三台web服务器互为镜像。一般教育网用户的IP资源是很丰富的,管理中心究竟拥有多少台服务器呢?于是我开始了IP段扫描,得到了几台存活主机,在浏览器里输入其中一个ip,进入了如图3所示的界面:
图3
可以看出这是一台oracle数据库服务器,莫非这就是传说中存放考分的服务器?继续随便点点,竟然进入了图4的配置界面而没有输入任何密码:
图4
在网上查查,这应该是oracle web管理的漏洞,但我对oracle几乎一无所知,只能眼睁睁看着一个宽敞的大门摆在面前却不知道哪只脚先进…
再试试输入另一个ip,进入了如图5的界面:
图5
随便写一个用户名返回错误信息,但也显示了这是一个jsp程序。填一个不存在的文件,根据返回的错误信息得到了服务器是tomcat3.1.接下来怎么办?试试运气吧,访问admin虚拟目录,存在!管理员帐户输入admin,密码为空,竟然进入了tomcat的管理界面(图6)!
图6
大概翻了一下,没什么有用的东西,于是继续访问/manager/html/目录,同样的帐号密码,也进去了!在图7中,我们看到有一个地方可以上传.war文件(用于远程管理tomcat服务的脚本文件),于是我找来了一个jsp木马,用ant打包为war文件(有一个现成的war文件上传执行后自动生成/job虚拟目录,可以在附件里找到),上传执行,立即可以看到虚拟目录列表里多了一个/job目录。
图7
在浏览器输入202.200.14.241/job,就可以看到可爱的木马静静地躺在那里。赶紧翻了翻服务器硬盘,下载了一些内部文件,然后找到了web目录。在/webinfo目录里翻了半天竟然找不到数据库连接路径(我是jsp大菜鸟),当时功夫不负有心人,我在服务器上的一份该系统的使用说明里找到了数据库连接字段,竟然是本机的oracle数据库。从网上找了一个能连oracle的客户端连接202.200.14.241,却总是失败,这说明要么是防火墙做了设置,要么就是找的客户端有问题。但是已经没时间了,第二天还要上课,于是我继续浏览web目录(顺便提一下,这些服务器web程序全用的是西工大开发的一个叫iaa的系统)。在jsp目录里,我发现了AdminList.jsp文件,直接访问,被转到了login.jsp.直接编辑AdminList.jsp文件,发现里面的验证信息被藏在了很隐蔽的header.jsp文件里。删掉<include file=”header.jsp”>一句后再访问AdminList.jsp,屏幕上清楚地显示出了所有的管理员帐户密码,用管理员帐户登陆系统,就进入了“陕西省高考信息交互系统”。仔细地翻了一遍,发现理论上来说可以下载高考成绩,志愿信息,可以修改数据库,但下载的东西却都是空的,这可能是由于当时分数根本没有出来的缘故。
用同样的方法访问另一个ip,用同样的方法进入了艺术类考生信息交互系统,可能是艺术类考试比较早的缘故,里面已经可以下载所有考生的成绩,并且可以直接修改。但是既然一开始就抱定决不改分的信念,我毅然关闭了浏览器。
实际中发现,陕西省考试管理中心的几个信息交互系统配置都为windows2000+tomcat+apache+oracle,但是这几个oracle是怎么做到数据统一的呢?还请高人来解答。
后记:
隔了几天,我又开始了对sneac.com的第二轮检测。这次,我在网站的一个角落里发现了注入点,但猜解的结果却让人大失所望:管理员密码采用了30位CFS加密!CFS密码目前还不能破解,只有拿本字典慢慢猜解。从总体来看,陕西省考试管理中心的网站还是比较安全的,估计这也是无数前人千锤百炼的结果。
小结:高考分数就可以决定一个人的一生,如果分数可以修改,会变成什么样子?不过这段时间考试中心的工作人员还是十分辛苦和负责的。举个例子,有一次晚上2点多我访问一个服务器的/admin目录,刚进去不到一分钟,/admin目录就被删了,这件事让我对考试中心的叔叔阿姨们充满了敬佩之情,也因此我决定把这次入侵过程写出来,以供他们参考。截至目前,我上传的木马已经全被删除,所有的服务器/admin、/manager/html/目录也已经全被删除,论坛账户也已经被删除,这说明了经常看访问日志是件多么重要的事。
全文完 转载请注明来自poy.cn
附件:job.rar