提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

突然想起年初时到某省教育考试院查询考试成绩无意间发现的漏洞,通过漏洞可以获取管理员账号和密码哈希,后来提交到WooYun网站了,过了很长时间没有关注这个事情,今天偶然想起,于是去看看厂商处理得怎么样,当时漏洞提交的地址在 《江苏教育考试院查询中心查询中心管理员账号密码泄露漏洞》 ,看样子厂商早已经修复了,漏洞细节早已经公开,我在这里再叙述一遍留作备忘吧。

漏洞所在URL地址 http://stat.jseea.cn/jseea_query/input.do?catlog=1&database= 21%2Cdb_169 ,通过测试猜测到江苏省教育考试中心查询系统采取分数据库操作,各个数据库的选择通过Query String参数database来实现,其中以 database=21%2Cdb_169 为例,21表示查询模板(用于生成各类表单供用户填写), %2C 表示编码的逗号, db_169 表示数据库名称,上述解码后为 21,db_169 ,当数据库名称不存在时构造SQL语句出现错误,程序崩溃(显示Java错误)可以看到SQL语句:

数据库名称不存在时构造SQL语句出现错误

同样的当查询模板不存在时也会触发错误:

查询模板不存在时触发错误 查询模板不存在导致注入错误

由于设计上的缺陷,假如我们另行尝试指定一个特殊数据库,比如将db_169这个数据库名称改为user,然后采取特别的查询模板,输入任意值查询,就会得到管理员名称和密码哈希。

比如访问 http://stat.jseea.cn/jseea_query/input.do?catlog=1&database=1%2Cuser ,考试编号输入 admin,验证码按显示的输入,点击确定,即可获取管理员名称和哈希后的密码:

管理员名和验证码 获取管理员账户和密码哈希

漏洞的原因我分析一是缺少相应的逻辑判断,让注入性攻击得以实施;二是未判断数据库名或者表名是否合法,让渗透内部数据库或者表得以成功;三是未将表单查询模板ID对应绑定特定的数据库或者表,让构造任意查询表成为可能。