xiaoxiangyu 2019-11-03
1.简介(开场废话)
攻击者可通过存在漏洞的页面直接获取到数据库配置信息。如果攻击者可直接访问数据库,则可直接获取用户数据,甚至可以直接控制数据库服务器。
2.影响范围
漏洞涉及范围包括不限于8.0、9.0版
3.搭建个环境(其实环境不重要,信息泄露这个东西)
4.已知漏洞点出现在/mobile/dbconfigreader.jsp这个页面(开始胡乱分析。。。有错还希望师傅们指出来)
直接看源代码好了,搜了一圈没找到8.0的安装包,我太难了,借张图过来,嘿嘿嘿
来源:https://mp.weixin.qq.com/s/zTEUan_BtDDzuHzmd9pxYg
首先在这个页面获取数据库用户名密码,然后存储到变量sb中,再进行转换,进行DES加密
有了源码,我们编译一下源码,断点调试,康康哪里出现了问题
<% String conStr= "12345"; //Prop.getPropValue("weaver","ecology.url"); String conUser= "12345"; //Prop.getPropValue("weaver","ecology.user"); String conPsw= "12345"; //Prop.getPropValue("weaverl","ecology.password"); String loginType="sqlserver"; //Prop.getPropValue("weaver","authentic"); //上面应该是从别的页面取数据过来,我这里直接定死 StringBuffer sb=new StringBuffer(); //new 一个StringBuffer类对象 //StringBuffer和StringBuilder 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问) //由于 StringBuilder 相较于 StringBuffer 有速度优势,大多数时候还是用StringBuilder String verb="url="+conStr+",user="+conUser+",password="+conPsw+",Logintype="+loginType; //赋值操作 byte[] str=verb.getBytes(); //将字符串转化为字节数组byte[] String keyString="1z2x3c4v5b6n"; //DES的加密密钥 System.out.println(verb);//url=12345,user=12345,password=12345,Logintype=sqlserver byte[] keyByte=keyString.getBytes(); //创建一个密匙工厂,然后用它把DESKeySpec对象转换成一个Secretkey对象 DESKeySpec dks1=new DESKeySpec(keyByte); SecretKey key=SecretKeyFactory.getInstance("DES").generateSecret(dks1); Cipher cipher=Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE,key); //DES加密操作 byte[] cipherText=cipher.doFinal(str); //System.out.println(cipherText.length); ServletOutputStream sos=response.getOutputStream(); System.out.println(cipherText);//[ sos.write(cipherText); //输出des加密后的字节流,为啥用输出流,这里人都傻掉了 sos.flush(); //清空缓冲区数据 sos.close(); //关闭流 %>
并且我这里报异常了,不知道为啥,好像是冲突了
看了下修补方案,似乎就是禁止访问/mobile/dbconfigreader.jsp这个页面
4.exp及利用
github上有现成的脚本
https://github.com/NS-Sp4ce/Weaver-OA-E-cology-Database-Leak
主要还是对显示在页面上的字节流进行des解密,完事
参考文章:
https://mp.weixin.qq.com/s/zTEUan_BtDDzuHzmd9pxYg