通过几个真实的故事讨论一下权限设计中几个常见问题。
1 在某大学研究生网站查询考研分数
那年媳妇报考某大学的研究生,经过紧张的半年,终于可以查询成绩了,输入姓名、准考证号和身份证号后,查到成绩是371分,和以往比较,分数很玄,不知道其他人水平怎么样。我想能不能通过Sql注入的方式查查其他人的分数,试了几个简单的特殊字符,很快就摸到规律,顺利查询前后40多个人的分数,比较了比较,感觉371分偏低,结果也确实是没有达到录取分数线。
当时在媳妇面前可是得意了一把。我怀着极大的善意和期待将这个发现以邮件方式发给了网站上的邮箱,以为会有答复,至少会感谢一翻,结果好几个月过去了,没有任何动静,网站上的那个问题依旧。
我想学校信息中心的专家们可能都很忙吧,再说这样的问题也确实不值得一提,哪能劳驾他们改代码呢。
2 在某市社保网站上查询社保信息
这是个社保网站,输入职工编号和密码,就可以查询社保信息。也许,你也有对别人工资感兴趣的时候吧,我当时就提起了兴趣。我开始寻找突破口,通过Sql注入的方式登录,搜寻漏洞一无所获。查看网页源代码,发现除了这个社保网址外,还有一个Ip地址,将这个Ip地址所在网址复制到浏览器中,居然出现了社保信息表,虽然表格内容是空的,但潜意识觉得会有所收获。我用自己的职工编号和密码登录后,再去观察那个特殊的网址,这回注意到职工编号就在网址之中,将这个网址复制到浏览器中直接访问,成功显示了我的社保信息,也许是我登录的缘故吧,然后我将这个网址复制到另外一个浏览器,同样可以访问。看样子访问这个网址只需要提供职工编号就可以获取这个编号的社保信息了,再换了几个职工编号,如愿以偿地看到了他们的社保信息,他们的社保工资都很低,我暂时获得些许安慰。感叹,这样的一个官方网站就这样处理公众信息。我还是像上次那样,将问题已邮件方式发送给网站上留下的邮箱,结果还是和上次一样,杳无音讯。再过一年,重返故地,问题依旧。又过一年,故地重游,他们已经把职工编号给加密了,任我百般尝试始终颗粒无收。关于安全,此案例告诉我们,权限控制时,每一个页面都需要控制到位,通过网址传递参数时,尽量不要让人猜出参数的含义,最好是对参数进行加密。
3 公司ERP重大安全漏洞
我公司是国内某集团企业的子公司。我刚到公司时,正赶上公司实施ERP系统。这套ERP系统由上海某著名软件公司提供, B/S结构,主要开发工具Oracle Form 9i。应用服务器和数据库服务器都在集团中心机房,下属企业通过浏览器访问。每遇到一个新的系统,我都很喜欢按照我的方式测试一翻,说是测试其实也就是随便点点鼠标。用我的帐号,只是子系统管理员,经过简单测试,我居然拿到数据库的用户密码表,继而知道了sys和system的密码。呵呵,将这个重大发现告诉项目组,刚开始他们还不相信,当我一步一步演示如何连接到后台数据库时,他们的脸色都变了。这个项目已经实施大半年了,整个项目已接近尾声,就剩下我们几个企业了,此时暴露出这样的安全问题,确实让项目组很尴尬。他们以为我是因为对Oracle Form很熟悉才有可能找到漏洞,其实不是,我对Oracle Form也是第一次接触,之所以能够找到漏洞,起因是SessionId。用任意一帐号登录系统后,将网页源文件中的Form网址复制到浏览器中,修改网址中的Form名称参数就可以直接访问这个Form,不管是否拥有权限。也就是说,我只要登录了系统,有一个合法的SessionId,我就可以访问系统内所有的Form。这个漏洞在于系统只在你登录的时候检查权限,当你访问其他Form时,系统不在检查权限,是不是有点可笑。还有一个问题,系统里有一个Form允许执行Sql语句,这样似乎方便了用户,但是没有把关键系统表过滤,直接就可以把数据库系统用户表和密码查询出来,然后借助Oracle密码破解工具就可以把加密的密码变成了明文。要是数据库系统用户的密码设置复杂一点,我也不能轻易破解。每一步其实都很简单,要解决并不难。从某种程度上来说,软件公司技术上过于藐视我们这些企业ITJY
作为程序员,作为系统设计人员,安全非常重要,权限控制并不难。